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脚本文件打包成可执行文件的方法
Jun 02 Python
Python常用字符串替换函数strip、replace及sub用法示例
May 21 Python
详解Numpy中的广播原则/机制
Sep 20 Python
Python Pexpect库的简单使用方法
Jan 29 Python
python按照多个条件排序的方法
Feb 08 Python
Python中使用__new__实现单例模式并解析
Jun 25 Python
python实现windows倒计时锁屏功能
Jul 30 Python
Python中print函数简单使用总结
Aug 05 Python
怎么快速自学python
Jun 22 Python
keras实现VGG16方式(预测一张图片)
Jul 07 Python
python 如何停止一个死循环的线程
Nov 24 Python
python实现企业微信定时发送文本消息的实例代码
Nov 25 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
第十三节--对象串行化
2006/11/16 PHP
php sprintf()函数让你的sql操作更安全
2008/07/23 PHP
php 判断数组是几维数组
2013/03/20 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
Jquery中增加参数与Json转换代码
2009/11/20 Javascript
基于JQuery 滑动与动画的说明介绍
2013/04/18 Javascript
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
js实时获取并显示当前时间的方法
2015/07/31 Javascript
用NodeJS实现批量查询地理位置的经纬度接口
2016/08/16 NodeJs
js中作用域的实例解析
2017/03/16 Javascript
JavaScript中最常用的10种代码简写技巧总结
2017/06/28 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
JsChart组件使用详解
2018/03/04 Javascript
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
Element Card 卡片的具体使用
2020/07/26 Javascript
Python3指定路径寻找符合匹配模式文件
2015/05/22 Python
Python找出文件中使用率最高的汉字实例详解
2015/06/03 Python
Python及PyCharm下载与安装教程
2017/11/18 Python
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
python图形用户接口实例详解
2019/12/16 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
女士和男士时尚鞋在线购物:Shoespie
2019/02/28 全球购物
戴尔马来西亚官网:Dell Malaysia
2020/05/02 全球购物
数控技术专科生自我评价
2014/01/08 职场文书
新闻学专业大学生职业生涯规划范文
2014/03/02 职场文书
海飞丝广告词
2014/03/20 职场文书
高中生操行评语
2014/04/25 职场文书
公司门卫岗位职责
2015/04/13 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
python三子棋游戏
2022/05/04 Python