Day 22 22.1.1:增量式爬虫 - 场景1的实现
场景1的实现:
数据指纹:
- 数据的唯一标识。记录表中可以不直接存储数据本身,直接存储数据指纹更好一些。
创建爬虫爬虫文件:
- cd project_name(进入项目目录)
- scrapy genspider 爬虫文件的名称(自定义一个名字即可) 起始url
- (例如:scrapy genspider first www.xxx.com)
- 创建成功后,会在爬虫文件夹下生成一个py的爬虫文件
进入爬虫文件:
- cd 爬虫文件的名称(即自定义的名字)
可能存在的错误
redis.exceptions.DataError: Invalid input of type: 'ZlsdemoproItem'. Convert to a bytes, string, int or float first.
#只有redis版本是2.10.6才能直接把item作为字典写进去
redis可能用到的指令
keys * :查看redis数据库所有set集合名
llen 集合名:查看当前数据的数量(计数)
smembers 集合名:查看当前set集合内的数据id及名称
爬虫文件
import redis
import scrapy
import hashlib#导入生成数据指纹的模块
from ..items import ZlsdemoproItem #导入ITEM模块
class DuanzaiSpider(scrapy.Spider):
name = "duanzai"
# allowed_domains = ["www.xxx.com"]
#段子网爬取标题和内容
start_urls = ["https://www.xiaohuaduanzi.cn/duanzi/"]
conn = redis.Redis(
host = '127.0.0.1',
port = 6379
) #redis所对应的全局对象
def parse(self, response):
li_list = response.xpath('//*[@id="body"]/div/div/div[1]/ul/li')
for li in li_list:
content = li.xpath('./div/div/div[2]/div[2]/text()').extract_first()
title = li.xpath('./div/div/div[2]/div[1]/h2/a/text()').extract_first()
# print(content,title)
all_data = title + content
m = hashlib.md5() #生成该数据的数据指纹工具
m.update(all_data.encode('utf-8')) #数据编码,把字符串转成二进制数据
data_id = m.hexdigest() #生成数据结构
# print(data_id)
ex = self.conn.sadd('data_id', data_id) #在redis中创建名为data_id的set集合,并将data_id传递到该集合中
if ex ==1:#sadd执行成功(数据指纹在set集合中不存在)
print('已获取最新数据,正在爬取中.....')
item = ZlsdemoproItem() # 实例化ITEM对象
item['title'] = title # 将title传递给item
item['content'] = content # 将content传递给item
yield item #提交item
else:#sadd没有执行成功(数据指纹在set集合中已存储)
print('暂无最新数据更新,请等待数据更新!')
items.py
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class ZlsdemoproItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
content = scrapy.Field()
pipelines.py
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
class ZlsdemoproPipeline:
def process_item(self, item, spider):
conn = spider.conn #调用爬虫文件中的conn对象
dic = {
'title' : item['title'],
'content' : item['content'],
}
#保证redis版本是2.10.6 pip install redis==2.10.6
# 只有redis版本是2.10.6才能直接把item作为字典写进去
conn.lpush('duanzi',dic)
return item
settings.py
USER_AGENT : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"
ROBOTSTXT_OBEY = False
LOG_LEVEL = 'ERROR'
LOG_LEVEL = 'WARNING'
#释放管道
ITEM_PIPELINES = {
"zlsDemoPro.pipelines.ZlsdemoproPipeline": 300,
}
Day 22 22.1.1:增量式爬虫 - 场景1的实现的更多相关文章
- Scrapy 增量式爬虫
Scrapy 增量式爬虫 https://blog.csdn.net/mygodit/article/details/83931009 https://blog.csdn.net/mygodit/ar ...
- 基于Scrapy框架的增量式爬虫
概述 概念:监测 核心技术:去重 基于 redis 的一个去重 适合使用增量式的网站: 基于深度爬取的 对爬取过的页面url进行一个记录(记录表) 基于非深度爬取的 记录表:爬取过的数据对应的数据指纹 ...
- 增量式爬虫 Scrapy-Rredis 详解及案例
1.创建scrapy项目命令 scrapy startproject myproject 2.在项目中创建一个新的spider文件命令: scrapy genspider mydomain mydom ...
- 爬虫 crawlSpider 分布式 增量式 提高效率
crawlSpider 作用:为了方便提取页面整个链接url,不必使用创参寻找url,通过拉链提取器,将start_urls的全部符合规则的URL地址全部取出 使用:创建文件scrapy startp ...
- python爬虫---CrawlSpider实现的全站数据的爬取,分布式,增量式,所有的反爬机制
CrawlSpider实现的全站数据的爬取 新建一个工程 cd 工程 创建爬虫文件:scrapy genspider -t crawl spiderName www.xxx.com 连接提取器Link ...
- 爬虫07 /scrapy图片爬取、中间件、selenium在scrapy中的应用、CrawlSpider、分布式、增量式
爬虫07 /scrapy图片爬取.中间件.selenium在scrapy中的应用.CrawlSpider.分布式.增量式 目录 爬虫07 /scrapy图片爬取.中间件.selenium在scrapy ...
- 爬虫---scrapy分布式和增量式
分布式 概念: 需要搭建一个分布式的机群, 然后在每一台电脑中执行同一组程序, 让其对某一网站的数据进行联合分布爬取. 原生的scrapy框架不能实现分布式的原因 调度器不能被共享, 管道也不能被共享 ...
- [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [三] 配置式爬虫
[DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 上一篇介绍的基本的使用方式,虽然自由度很高,但是编写的代码相对还是挺多.于是框 ...
- 增量式PID计算公式4个疑问与理解
一开始见到PID计算公式时总是疑问为什么是那样子?为了理解那几道公式,当时将其未简化前的公式“活生生”地算了一遍,现在想来,这样的演算过程固然有助于理解,但假如一开始就带着对疑问的答案已有一定看法后再 ...
- 增量式PID简单翻板角度控制
1.研究背景 随着电子技术.信息技术和自动控制理论技术的完善与发展,近来微型处理器在控制方面的应用也越来越多.随之逐渐渗透到我们生活的各个领域.如导弹导航装置,飞机上仪表的控制,网络通讯与数据传输,工 ...
随机推荐
- golang 数组(array)
1. 概念 golang中的数组是具有固定长度及相同数据类型的序列集合 2. 初始化数组 var 数组名 [数组大小]数据类型 package main import "fmt" ...
- JS 动态获取 Url 参数(封装函数)
话不多说直接上代码: 封装函数如下: (如果urls固定,可以只写一个name变量) getQueryString(name, urls) { var url = urls; // 获取URL // ...
- Docker 安全加固
一.docker安全加固 1.利用LXCFS增强docker容器隔离性和资源可见性 (proc容器与宿主机之间是共享的 没有进行隔离) 此rpm包在真机桌面q目录中 需先传到虚拟机/root/下 在 ...
- docker部署flask+uwsgi+nginx+postgresql,解耦拆分到多个容器,实现多容器互访
本人承诺,本博客内容,亲测有效. dockerfile文件, FROM centos:7 RUN mkdir /opt/flask_app COPY ./show_data_from_jira /op ...
- xpath、css元素定位
xpath 1.利用元素唯一属性 //*[@id='xxx'] 2.属性与逻辑结合 解决元素之间多个相同属性重名问题 //*[@id='xxx' and @class='xxx'] 3..//*[te ...
- DOS命令操作
打开CMD的方式 1.开始+系统+命令提示符 2.Win键+R 输入CMD打开控制台(推荐使用) 3.在任意的文件夹下面,按住shift+鼠标右键点击,在此处打开命令行窗口 4.资源管理器的地址栏前面 ...
- Quartz 2D CGGradient与CGShading实现渐变的绘制
Quartz 提供了两种不透明的数据类型来创建渐变CGShading 和 CGGradient,你可以使用其中任何一个来创建轴向或径向渐变. 轴向渐变:沿着一个轴方向线性渐变 径向渐变:一个点为原型, ...
- pie-engine-ai项目jenkins.yaml文件
apiVersion: apps/v1kind: Deploymentmetadata: name: jenkins namespace: pie-engine-ai labels: name: je ...
- Delphi 新语法:For in语句
据说Delphi 2005开始支持For in语句.并没有深入调查,依然从万一博客学习并整理. 一.遍历 TStrings var List: TStrings; s: string; begin L ...
- linux交叉编译libiconv
1.解压libiconv-1.14.tar 2.进入解压后目录libiconv-1.14 3.执行交叉编译环境命令,例如: source /home/huhe/environment-setup-aa ...