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的random模块吗?
Dec 12 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
Jul 18 Python
python opencv人脸检测提取及保存方法
Aug 03 Python
解决pandas .to_excel不覆盖已有sheet的问题
Dec 10 Python
Python中三元表达式的几种写法介绍
Mar 04 Python
pip安装python库的方法总结
Aug 02 Python
python3 实现函数写文件路径的正确方法
Nov 27 Python
pandas分批读取大数据集教程
Jun 06 Python
python使用自定义钉钉机器人的示例代码
Jun 24 Python
通过实例简单了解python yield使用方法
Aug 06 Python
Python的Tqdm模块实现进度条配置
Feb 24 Python
Python 读写 Matlab Mat 格式数据的操作
May 19 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
Views rows style模板重写代码
2011/05/16 PHP
php数组函数序列之sort() 对数组的元素值进行升序排序
2011/11/02 PHP
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
2014/09/24 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
PHP创建/删除/复制文件夹、文件
2016/05/03 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
php将html转为图片的实现方法
2017/05/19 PHP
PHP children()函数讲解
2019/02/03 PHP
Smarty模板配置实例简析
2019/07/20 PHP
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
鼠标经过出现气泡框的简单实例
2017/03/17 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
React Native中Mobx的使用方法详解
2018/12/04 Javascript
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
2020/04/14 Javascript
JavaScript实现简易计算器小功能
2020/10/22 Javascript
[01:10]DOTA2亚洲邀请赛 征战号角响彻全场
2015/01/06 DOTA
python实现的防DDoS脚本
2011/02/08 Python
利用python模拟sql语句对员工表格进行增删改查
2017/07/05 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
Python基于scipy实现信号滤波功能
2019/05/08 Python
十分钟搞定pandas(入门教程)
2019/06/21 Python
python画微信表情符的实例代码
2019/10/09 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
Python对wav文件的重采样实例
2020/02/25 Python
在Python中实现字典反转案例
2020/12/05 Python
通息工程毕业生自荐信
2013/10/16 职场文书
关于礼仪的演讲稿
2014/01/04 职场文书
文秘大学生求职信
2014/02/25 职场文书
创新型城市实施方案
2014/03/06 职场文书
学生检讨书如何写
2014/10/30 职场文书
网络营销计划
2015/01/17 职场文书
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏