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.研究背景 随着电子技术.信息技术和自动控制理论技术的完善与发展,近来微型处理器在控制方面的应用也越来越多.随之逐渐渗透到我们生活的各个领域.如导弹导航装置,飞机上仪表的控制,网络通讯与数据传输,工 ...
随机推荐
- vue-cli 根据不同的环境打包
根据项目需要,通过vue-cli中的npm run build 打包到不同的环境,例如测试环境,预发布环境,线上环境,根据process.env分别进行接口的调用 vue-cli 中build中bui ...
- RestTemplate 设置超时时间
不废话直接上代码 SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); reque ...
- 网站提示:You Don’t Have Permission To Access
测试 apache集成环境访问网站,突然出现错误提示"You don't have permission to access /index.php on this server." ...
- vscode中使用powershell显示分支名
https://blog.csdn.net/weixin_43932597/article/details/125000557 windows powershell(或windows terminal ...
- Educational Codeforces Round 143 (Rated for Div
Educational Codeforces Round 143 (Rated for Div. 2) Problem - B Ideal Point 给定n个线段区间\([l,r]\),我们定义\( ...
- M1 安装apache tomcat
一.下载以及安装 1.Tomcat(官网:http://tomcat.apache.org/) 2.找到需要的版本:我用的9版本 二.将下载的文件放在自己一个目录下去 三.设置Apache环境路径 e ...
- python-djanggo 实现读取excel 表格在网页中展示
1.准备读取数据 放到项目文件夹下 2.熟悉表结构 3.准备处理依赖库 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas o ...
- 网页端微信小程序客服
https://mpkf.weixin.qq.com/ 可以设置自动回复
- zk-复制安装
Zookeeper系列一:Zookeeper介绍.Zookeeper安装配置.ZK Shell的使用 一.Zookeeper介绍 1. 介绍Zookeeper之前先来介绍一下分布式 1.1 分 ...
- python40
Python Number 数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间. 以下实例在变量赋值时 Number 对象将被创建: v ...