python爬虫爬取幽默笑话网站


Posted in Python onOctober 24, 2019

爬取网站为: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标签

# 第一种方式:replace
content = 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标签

# 第二种方式:sub
for 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 requests
import threadpool
import time
import os,sys
import re
from lxml import etree
from 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 ScrapDemo
url="http://xiaohua.zol.com.cn/youmo/"
ScrapDemo(url)

运行如下:

python爬虫爬取幽默笑话网站

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

python爬虫爬取幽默笑话网站

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中类变量与成员变量的使用注意点总结
Apr 29 Python
python docx 中文字体设置的操作方法
May 08 Python
在双python下设置python3为默认的方法
Oct 31 Python
python实现简单的单变量线性回归方法
Nov 08 Python
在python中实现对list求和及求积
Nov 14 Python
django连接mysql数据库及建表操作实例详解
Dec 10 Python
python 定义类时,实现内部方法的互相调用
Dec 25 Python
Python制作简易版小工具之计算天数的实现思路
Feb 13 Python
Django+Uwsgi+Nginx如何实现生产环境部署
Jul 31 Python
基于Python采集爬取微信公众号历史数据
Nov 27 Python
python 邮件检测工具mmpi的使用
Jan 04 Python
python 网络编程要点总结
Jun 18 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
Oct 24 #Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
Oct 24 #Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
Oct 24 #Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
Oct 24 #Python
python实现获取单向链表倒数第k个结点的值示例
Oct 24 #Python
python模块导入的方法
Oct 24 #Python
python读取word 中指定位置的表格及表格数据
Oct 23 #Python
You might like
收音机另类DIY - 纸巾盒做外壳
2021/03/02 无线电
php设计模式之单例模式使用示例
2014/01/20 PHP
两级联动select刷新后其值保持不变的实现方法
2014/01/27 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
2019/04/10 PHP
JS中confirm,alert,prompt函数区别分析
2011/01/17 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
2014/08/18 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
2017/05/11 Javascript
JS与CSS3实现图片响应鼠标移动放大效果示例
2018/05/04 Javascript
layui动态渲染生成select的option值方法
2019/09/23 Javascript
关于Vue中$refs的探索浅析
2020/11/05 Javascript
[00:44]TI7不朽珍藏III——军团指挥官不朽展示
2017/07/15 DOTA
Python编程入门之Hello World的三种实现方式
2015/11/13 Python
python中使用psutil查看内存占用的情况
2018/06/11 Python
pycharm显示远程图片的实现
2019/11/04 Python
Django将默认的SQLite更换为MySQL的实现
2019/11/18 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
2020/01/28 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
Python爬虫与反爬虫大战
2020/07/30 Python
Pycharm如何自动生成头文件注释
2020/11/14 Python
纯CSS3+DIV实现小三角形边框效果的示例代码
2020/08/03 HTML / CSS
Champion官网:美国冠军运动服装
2017/01/25 全球购物
可打印的优惠券、杂货和优惠券代码:Coupons.com
2018/06/12 全球购物
汉米尔顿手表官网:Hamilton
2020/09/13 全球购物
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
财务副总经理工作职责
2013/11/25 职场文书
综合办公室主任岗位职责
2014/04/13 职场文书
目标管理责任书
2014/04/15 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
党的群众路线教育实践活动督导组工作情况汇报
2014/10/28 职场文书
2014年幼儿园小班工作总结
2014/12/04 职场文书
庆祝教师节主题班会
2015/08/17 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书
部分武汉产收音机展览
2022/04/07 无线电
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript