python爬虫教程:爬取幽默笑话网站

python教程

共 4296字,需浏览 9分钟

 ·

2021-06-30 20:23

爬取网站为:http://xiaohua.zol.com.cn/youmo/


查看网页机构,爬取笑话内容时存在如下问题:


1、每页需要进入“查看更多”链接下面网页进行进一步爬取内容每页查看更多链接内容比较多,多任务进行,这里采用线程池的方式,可以有效地控制系统中并发线程的数量。避免当系统中包含有大量的并发线程时,导致系统性能下降,甚至导致 Python 解释器崩溃,引入线程池,花费时间更少,更效率。


创建线程 池threadpool.ThreadPool()

创建需要线程池处理的任务即threadpool.makeRequests(),makeRequests存放的是要开启多线程的函数,以及函数相关参数和回调函数,其中回调函数可以不写(默认是无)。

将创建的多个任务put到线程池中,threadpool.putRequest()

等到所有任务处理完毕theadpool.pool()

2、查看链接笑话页内容,div元素内部文本分布比较混乱。有的分布在<p>链接内有的属于div的文本,可采用正则表达式的方式解决。


注意2种获取元素节点的方式:


1)lxml获取节点字符串

res=requests.get(url,headers=headers)html = res.text  lxml 获取节点写法element=etree.HTML(html)divEle=element.xpath("//div[@class='article-text']")[0]  # 获取div节点div= etree.tostring(divEle, encoding = 'utf-8' ).decode('utf-8') # 转换为div字符串

2)正则表达式写法1,过滤回车、制表符和p标签

# 第一种方式:replacecontent = re.findall('<div class="article-text">(.*?)</div>',html,re.S)content = content[0].replace('\r','').replace('\t','').replace('<p>','').replace('</p>','').strip()

3)正则表达式写法2,过滤回车、制表符和p标签

# 第二种方式:subfor index in range(len(content)):  content[index] = re.sub(r'(\r|\t|<p>|<\/p>)+','',content[index]).strip()  list = ''.join(content)print(list)

3、完整代码

index.py

import requestsimport threadpoolimport timeimport os,sysimport refrom lxml import etreefrom lxml.html import tostring    class ScrapDemo():  next_page_url=""  #下一页的URL  page_num=1 #当前页  detail_url_list=0 #详情页面URL地址list  deepth=0 #设置抓取的深度  headers = {    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36"  }  fileNum=0    def __init__(self,url):    self.scrapyIndex(url)    def threadIndex(self,urllist): #开启线程池    if len(urllist) == 0:      print("请输入需要爬取的地址")      return False    ScrapDemo.detail_url_list=len(urllist)    pool=threadpool.ThreadPool(len(urllist))    requests=threadpool.makeRequests(self.detailScray,urllist)    for req in requests:        pool.putRequest(req)      time.sleep(0.5)    pool.wait()    def detailScray(self,url): # 获取html结构    if not url == "":      url='http://xiaohua.zol.com.cn/{}'.format(url)      res=requests.get(url,headers=ScrapDemo.headers)      html=res.text      # element=etree.HTML(html)      # divEle=element.xpath("//div[@class='article-text']")[0]  # Element div           self.downloadText(html)     def downloadText(self,ele): # 抓取数据并存为txt文件    clist = re.findall('<div class="article-text">(.*?)</div>',ele,re.S)    for index in range(len(clist)):      '''        正则表达式:过滤掉回车、制表符和p标签      '''      clist[index]=re.sub(r'(\r|\t|<p>|<\/p>)+','',clist[index])     content="".join(clist)    # print(content)     basedir=os.path.dirname(__file__)    filePath=os.path.join(basedir)    filename="xiaohua{0}-{1}.txt".format(ScrapDemo.deepth,str(ScrapDemo.fileNum))    file=os.path.join(filePath,'file_txt',filename)    try:      f=open(file,"w")      f.write(content)      if ScrapDemo.fileNum == (ScrapDemo.detail_url_list - 1):        print(ScrapDemo.next_page_url)        print(ScrapDemo.deepth)        if not ScrapDemo.next_page_url == "":          self.scrapyIndex(ScrapDemo.next_page_url)    except Exception as e:      print("Error:%s" % str(e))      ScrapDemo.fileNum=ScrapDemo.fileNum+1    print(ScrapDemo.fileNum)    def scrapyIndex(self,url):     if not url == "":      ScrapDemo.fileNum=0      ScrapDemo.deepth=ScrapDemo.deepth+1      print("开启第{0}页抓取".format(ScrapDemo.page_num))      res=requests.get(url,headers=ScrapDemo.headers)      html=res.text      element=etree.HTML(html)      a_urllist=element.xpath("//a[@class='all-read']/@href") # 当前页所有查看全文      next_page=element.xpath("//a[@class='page-next']/@href") # 获取下一页的url      ScrapDemo.next_page_url='http://xiaohua.zol.com.cn/{}'.format(next_page[0])      if not len(next_page) == 0 and ScrapDemo.next_page_url != url:        ScrapDemo.page_num=ScrapDemo.page_num+1        self.threadIndex(a_urllist[:])       else:        print('下载完成,当前页数为{}页'.format(ScrapDemo.page_num))        sys.exit()

runscrapy.py

from app import ScrapDemourl="http://xiaohua.zol.com.cn/youmo/"ScrapDemo(url)

运行如下:

总共1988个文件,下载完成。

以上就是本文的全部内容,希望对大家的学习有所帮助

原文链接:https://www.cnblogs.com/hqczsh/p/11531368.html

声明:文章著作权归作者所有,如有侵权,请联系小编删除


浏览 39
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报