爬取网站为:http://xiaohua.zol.com.cn/youmo/
查看网页机构,爬取笑话内容时存在如下问题:
1,每页需要进入“查看更多“链接下面网页进行进一步爬取内容每页查看更多链接内容比较多,多任务进行,这里采用线程池的方式,可以有效地控制系统中并发线程的数量。避免当系统中包含有大量的并发线程时,导致系统性能下降,甚至导致Python解释器崩溃,引入线程池,花费时间更少,更效率。
-
<李>创建线程池threadpool.ThreadPool() 李>
<李>创建需要线程池处理的任务即threadpool.makeRequests (), makeRequests存放的是要开启多线程的函数,以及函数相关参数和回调函数,其中回调函数可以不写(默认是无)。李>
<李>将创建的多个任务把到线程池中,threadpool.putRequest() 李>
<李>等到所有任务处理完毕theadpool.pool() 李>
2,查看链接笑话页内容,div元素内部文本分布比较混乱。有的分布在& lt; p>链接内有的属于div的文本,可采用正则表达式的方式解决。
注意2种获取元素节点的方式:
1) lxml获取节点字符串
res=requests.get (url,头=标题) html=res.text lxml获取节点写法=etree.HTML元素(html) divEle=element.xpath ("//div [@class=' article-text ']”)[0] #获取div节点 div=etree。tostring (divEle编码=皍tf - 8”) .decode (utf - 8) #转换为div字符串
2)正则表达式写法1、过滤回车、制表符和p标签
#第一种方式:取代 内容=re.findall (' & lt; div类=癮rticle-text祝辞(* & # 63;)& lt;/div>”, html, re.S) 内容=[0].replace (‘\ r’,”) .replace (‘\ t’,”) .replace (' & lt; p> ',”) .replace (' & lt;/p> ',”) .strip ()
3)正则表达式写法2,过滤回车、制表符和p标签
#第二种方式:子 指数的范围(len(内容): 内容(指数)=re.sub (r (t | | \ \ r & lt; p> | & lt; \/p>) + ',”,内容(指数)).strip () 列表=" . join(内容) 打印(列表)
3,完整代码
index.py
进口的要求 进口threadpool 导入的时间 导入系统,系统 进口再保险 从lxml进口etree lxml。html进口tostring 类ScrapDemo (): next_page_url=" " #下一页的URL page_num=1 #当前页 detail_url_list=0 #详情页URL面地址列表 deepth=0 #设置抓取的深度 头={ “用户代理”:“Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML,像壁虎)Chrome/68.0.3440.84 Safari 537.36” } fileNum=0 def __init__(自我、url): self.scrapyIndex (url) def threadIndex(自我,urllist): #开启线程池 如果len (urllist)==0: 打印(“请输入需要爬取的地址”) 返回假 ScrapDemo.detail_url_list=len (urllist) 池=threadpool.ThreadPool (len (urllist)) 请求=threadpool.makeRequests (self.detailScray urllist) 请求的请求: pool.putRequest(要求) time . sleep (0.5) pool.wait () def detailScray(自我,url): #获取html结构 如果不是url==啊? url=' http://xiaohua.zol.com.cn/{} ' .format (url) res=requests.get (url,头=ScrapDemo.headers) html=res.text #=etree.HTML元素(html) # divEle=element.xpath ("//div [@class=' article-text ']”) [0] # div元素 self.downloadText (html) def downloadText(自我,避署):#抓取数据并存为txt文件 clist=re.findall (' & lt; div类=癮rticle-text祝辞(* & # 63;)& lt;/div>”,避署,re.S) 指数的范围(len (clist)): “‘ 正则表达式:过滤掉回车、制表符和p标签 “‘ clist(指数)=re.sub (r (t | | \ \ r & lt; p> | & lt; \/p>) + ',”, clist(指数)) . join (clist内容=" ") #打印(内容) basedir=os.path.dirname (__file__) filePath=os.path.join (basedir) 文件名="小华{0}- {1}. txt”.format (ScrapDemo.deepth, str (ScrapDemo.fileNum)) 文件=os.path.join (filePath, file_txt,文件名) 试一试: f=打开(文件,“w”) f.write(内容) 如果ScrapDemo。fileNum==(ScrapDemo.detail_url_list - 1): 打印(ScrapDemo.next_page_url) 打印(ScrapDemo.deepth) 如果不是ScrapDemo。next_page_url==啊? self.scrapyIndex (ScrapDemo.next_page_url) 除了例外e: 打印(错误:% s % str (e)) ScrapDemo.fileNum=ScrapDemo.fileNum + 1 打印(ScrapDemo.fileNum) def scrapyIndex(自我、url): 如果不是url==啊? ScrapDemo.fileNum=0 ScrapDemo.deepth=ScrapDemo.deepth + 1 打印(“开启第{0}页抓取“.format (ScrapDemo.page_num)) res=requests.get (url,头=ScrapDemo.headers) html=res.text=etree.HTML元素(html) a_urllist=element.xpath (“//[@class='都阅读']/@href”) #当前页所有查看全文 next_page=element.xpath (“//[@class='页面']/@href”) #获取下一页的url ScrapDemo.next_page_url=' http://xiaohua.zol.com.cn/{} ' .format (next_page [0]) 如果不是len (next_page)==0和ScrapDemo。next_page_url !=url: ScrapDemo.page_num=ScrapDemo.page_num + 1 self.threadIndex (a_urllist [:]) 其他: 打印(“下载完成,当前页数为{}页“.format (ScrapDemo.page_num)) sys.exit ()python爬虫爬取幽默笑话网站