python爬虫scrapy框架之增量式爬虫的示例代码


Posted in Python onFebruary 26, 2021

scrapy框架之增量式爬虫

一 、增量式爬虫

什么时候使用增量式爬虫:
增量式爬虫:需求 当我们浏览一些网站会发现,某些网站定时的会在原有的基础上更新一些新的数据。如一些电影网站会实时更新最近热门的电影。那么,当我们在爬虫的过程中遇到这些情况时,我们是不是应该定期的更新程序以爬取到更新的新数据?那么,增量式爬虫就可以帮助我们来实现

二 、增量式爬虫

概念:
通过爬虫程序检测某网站数据更新的情况,这样就能爬取到该网站更新出来的数据

如何进行增量式爬取工作:
在发送请求之前判断这个URL之前是不是爬取过
在解析内容之后判断该内容之前是否爬取过
在写入存储介质时判断内容是不是在该介质中

增量式的核心是 去重
去重的方法:
将爬取过程中产生的URL进行存储,存入到redis中的set中,当下次再爬取的时候,对在存储的URL中的set中进行判断,如果URL存在则不发起请求,否则 就发起请求
对爬取到的网站内容进行唯一的标识,然后将该唯一标识存储到redis的set中,当下次再爬取数据的时候,在进行持久化存储之前,要判断该数据的唯一标识在不在redis中的set中,如果在,则不在进行存储,否则就存储该内容

三、示例

爬虫文件

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from redis import Redis
from increment2_Pro.items import Increment2ProItem
import hashlib
class QiubaiSpider(CrawlSpider):
  name = 'qiubai'
  # allowed_domains = ['www.xxx.com']
  start_urls = ['https://www.qiushibaike.com/text/']

  rules = (
    Rule(LinkExtractor(allow=r'/text/page/\d+/'), callback='parse_item', follow=True),
  )

  def parse_item(self, response):

    div_list = response.xpath('//div[@class="article block untagged mb15 typs_hot"]')
    conn = Redis(host='127.0.0.1',port=6379)
    for div in div_list:
      item = Increment2ProItem()
      item['content'] = div.xpath('.//div[@class="content"]/span//text()').extract()
      item['content'] = ''.join(item['content'])
      item['author'] = div.xpath('./div/a[2]/h2/text() | ./div[1]/span[2]/h2/text()').extract_first()
      
			# 将当前爬取的数据做哈希唯一标识(数据指纹)
      sourse = item['content']+item['author']
      hashvalue = hashlib.sha256(sourse.encode()).hexdigest()

      ex = conn.sadd('qiubai_hash',hashvalue)
      if ex == 1:
        yield item
      else:
        print('没有可更新的数据可爬取')


    # item = {}
    #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
    #item['name'] = response.xpath('//div[@id="name"]').get()
    #item['description'] = response.xpath('//div[@id="description"]').get()
    # return item

管道文件(管道文件也可以不用加)

from redis import Redis
class Increment2ProPipeline(object):
  conn = None
  def open_spider(self,spider):
    self.conn = Redis(host='127.0.0.1',port=6379)
  def process_item(self, item, spider):
    dic = {
      'author':item['author'],
      'content':item['content']
    }
    self.conn.lpush('qiubaiData',dic)
    print('爬取到一条数据,正在入库......')
    return item

到此这篇关于python爬虫之scrapy框架之增量式爬虫的示例代码的文章就介绍到这了,更多相关scrapy增量式爬虫内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python通过websocket与js客户端通信示例分析
Jun 25 Python
pymongo实现控制mongodb中数字字段做加法的方法
Mar 26 Python
Python实现合并字典的方法
Jul 07 Python
Python画图学习入门教程
Jul 01 Python
Python实现控制台中的进度条功能代码
Dec 22 Python
对python捕获ctrl+c手工中断程序的两种方法详解
Dec 26 Python
python twilio模块实现发送手机短信功能
Aug 02 Python
Python随机数函数代码实例解析
Feb 09 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
Apr 03 Python
浅谈keras保存模型中的save()和save_weights()区别
May 21 Python
python语言是免费还是收费的?
Jun 15 Python
Python 处理表格进行成绩排序的操作代码
Jul 26 Python
详解Python openpyxl库的基本应用
Feb 26 #Python
解决python的空格和tab混淆而报错的问题
Feb 26 #Python
Python Spyder 调出缩进对齐线的操作
Feb 26 #Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
Feb 26 #Python
Python plt 利用subplot 实现在一张画布同时画多张图
Feb 26 #Python
Python xlwings插入Excel图片的实现方法
Feb 26 #Python
基于tensorflow __init__、build 和call的使用小结
Feb 26 #Python
You might like
通过html表格发电子邮件
2006/10/09 PHP
PHP获取一年中每个星期的开始和结束日期的方法
2015/02/12 PHP
php中mysql连接方式PDO使用详解
2015/02/25 PHP
PHP面试题之文件目录操作
2015/10/15 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
javascript椭圆旋转相册实现代码
2012/01/16 Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
2013/07/09 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
JavaScript跨域方法汇总
2014/10/16 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
2016/07/07 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
js前端面试题及答案整理(一)
2016/08/26 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
2017/02/08 Javascript
原生JS实现圣旨卷轴展开效果
2017/03/06 Javascript
解决ztree搜索中多级菜单展示不全问题
2017/07/05 Javascript
node.js基于fs模块对系统文件及目录进行读写操作的方法详解
2017/11/10 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
JavaScript引用类型Function实例详解
2018/08/09 Javascript
在vue中axios设置timeout超时的操作
2020/09/04 Javascript
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
PyQT实现多窗口切换
2018/04/20 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
Pyqt5实现英文学习词典
2019/06/24 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
卫校毕业生自我鉴定
2013/10/31 职场文书
给全校老师的建议书
2014/03/13 职场文书
工资收入证明
2014/10/07 职场文书
优秀共产党员推荐材料
2014/12/18 职场文书
大学考试作弊检讨书
2015/05/06 职场文书
2015年青年志愿者工作总结
2015/05/20 职场文书
欠条样本
2015/07/03 职场文书
2019年最新版见习人员管理制度!
2019/07/08 职场文书
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server
MySQL选择合适的备份策略和备份工具
2022/06/01 MySQL
MySQL自定义函数及触发器
2022/08/05 MySQL