python爬虫爬取幽默笑话网站

  

爬取网站为: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爬虫爬取幽默笑话网站