python爬虫scrapy框架之增量式爬虫的示例代码
作者:Aacheng123 发布时间:2023-05-06 00:22:40
标签:python,scrapy,增量式爬虫
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
来源:https://blog.csdn.net/Aacheng123/article/details/114088378


猜你喜欢
- 在使用Celery统计每日访问数量的时候,发现一个任务会同时执行两次,发现同一时间内(1s内)竟然同时发送了两次任务,也就是同时产生了两个w
- Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。下载Go语言开发包大家可以在Go语
- 介绍:今天在使用django的时候忽然想用到,如何匹配多个关键字的操作,我们知道django有一个objects.filter()方法,我们
- 工作中需要根据某个应用程序具体吃了多少内存来决定执行某些操作,所以需要写个小工具来模拟应用程序使用内存情况,下面是我写的一个Python脚本
- 对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散。很容易学习,并
- “Be conservative in what you send; be liberal in what you accept. &nbs
- 探究多个装饰器执行顺序装饰器是Python用于封装函数或代码的工具,网上可以搜到很多文章可以学习,我在这里要讨论的是多个装饰器执行顺序的一个
- df.groupby() 之后按照特定顺序输出,方便后续作图,或者跟其他df对比作图。## 构造 pd.DataFramepatient_i
- 本文实例为大家分享了python实现计算器功能的具体代码,供大家参考,具体内容如下前缀表达式运算符在数字的前面1 + (2 + 3) * 4
- 文本特征提取作用:对文本数据进行特征化(句子、短语、单词、字母)一般选用单词作为特征值方法一:CountVectorizersklearn.
- TensorFlow的日志级别分为以下三种:TF_CPP_MIN_LOG_LEVEL = 1 //默认设置,为显示所有信息TF_CPP_MI
- 如下所示:' '.join(line.split())例如:'line dd',运行line.split()
- 一、环境Ubuntu 16.04tensorflow 1.4.0keras 2.1.3二、训练数据时报错:ValueError: Error
- 1、添加依赖<dependency><groupId>com.baomidou</groupId><
- 每次查询分析器寻找路径时,并不会每一次都去统计索引中包含的行数,值的范围等,而是根据一定条件创建和更新这些信息后保存到数据库中,这也就是所谓
- 一般情况下,URL 中的参数应使用 url 编码规则,即把参数字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位
- 本文介绍了Python字符串格式化,主要有两种方法,分享给大家,具体如下用于字符串的拼接,性能更优。字符串格式化有两种方式:百分号方式、fo
- 效果图代码<template> <div class="outWrap"> &nbs
- 今天看了一下数据结构的书,发现其实数据结构没有几种,线性表,数组,字符串,队列和栈,等等,其实是一回事,然后就是树结构,图结构。数据结构的理
- 本文实例讲述了Python实现字典去除重复的方法。分享给大家供大家参考,具体如下:#!/usr/bin/env python# encodi