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中用startswith()函数判断字符串开头的教程
Apr 07 Python
Python3.6简单操作Mysql数据库
Sep 12 Python
Python 中Pickle库的使用详解
Feb 24 Python
Python 通配符删除文件的实例
Apr 24 Python
Python3.6日志Logging模块简单用法示例
Jun 14 Python
python实现换位加密算法的示例
Oct 14 Python
Python Numpy库datetime类型的处理详解
Jul 13 Python
flask框架配置mysql数据库操作详解
Nov 29 Python
tensorflow 初始化未初始化的变量实例
Feb 06 Python
python使用python-pptx删除ppt某页实例
Feb 14 Python
Django项目如何正确配置日志(logging)
Apr 29 Python
使用python+pygame开发消消乐游戏附完整源码
Jun 10 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
php mssql 时间格式问题
2009/01/13 PHP
PHP数组常用函数实例小结
2018/08/20 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
JavaScript实现动态增加文件域表单
2009/02/12 Javascript
JavaScript 类似flash效果的立体图片浏览器
2010/02/08 Javascript
一个挺有意思的Javascript小问题说明
2011/09/26 Javascript
js中eval详解
2012/03/30 Javascript
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
封装了一个支持匿名函数的Javascript事件监听器
2014/06/05 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
JS小游戏之象棋暗棋源码详解
2014/09/25 Javascript
js中 计算两个日期间的工作日的简单实例
2016/08/08 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
JS实现按钮颜色切换效果
2020/09/05 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
JavaScript Canvas实现验证码
2020/08/02 Javascript
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
Vue 前端实现登陆拦截及axios 拦截器的使用
2019/07/17 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
js计时事件实现圆形时钟
2020/03/25 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
python 环境变量和import模块导入方法(详解)
2017/07/11 Python
django框架单表操作之增删改实例分析
2019/12/16 Python
Python中sys模块功能与用法实例详解
2020/02/26 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
2020/08/07 Python
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
关于读书的演讲稿500字
2014/08/27 职场文书
学校组织向国旗敬礼活动方案(中小学适用)
2014/09/27 职场文书
党员年终个人总结
2015/02/14 职场文书
2015年禁毒工作总结
2015/04/30 职场文书
跑吧孩子观后感
2015/06/10 职场文书
导游词之重庆渣滓洞
2020/01/08 职场文书