场景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的实现的更多相关文章

  1. Scrapy 增量式爬虫

    Scrapy 增量式爬虫 https://blog.csdn.net/mygodit/article/details/83931009 https://blog.csdn.net/mygodit/ar ...

  2. 基于Scrapy框架的增量式爬虫

    概述 概念:监测 核心技术:去重 基于 redis 的一个去重 适合使用增量式的网站: 基于深度爬取的 对爬取过的页面url进行一个记录(记录表) 基于非深度爬取的 记录表:爬取过的数据对应的数据指纹 ...

  3. 增量式爬虫 Scrapy-Rredis 详解及案例

    1.创建scrapy项目命令 scrapy startproject myproject 2.在项目中创建一个新的spider文件命令: scrapy genspider mydomain mydom ...

  4. 爬虫 crawlSpider 分布式 增量式 提高效率

    crawlSpider 作用:为了方便提取页面整个链接url,不必使用创参寻找url,通过拉链提取器,将start_urls的全部符合规则的URL地址全部取出 使用:创建文件scrapy startp ...

  5. python爬虫---CrawlSpider实现的全站数据的爬取,分布式,增量式,所有的反爬机制

    CrawlSpider实现的全站数据的爬取 新建一个工程 cd 工程 创建爬虫文件:scrapy genspider -t crawl spiderName www.xxx.com 连接提取器Link ...

  6. 爬虫07 /scrapy图片爬取、中间件、selenium在scrapy中的应用、CrawlSpider、分布式、增量式

    爬虫07 /scrapy图片爬取.中间件.selenium在scrapy中的应用.CrawlSpider.分布式.增量式 目录 爬虫07 /scrapy图片爬取.中间件.selenium在scrapy ...

  7. 爬虫---scrapy分布式和增量式

    分布式 概念: 需要搭建一个分布式的机群, 然后在每一台电脑中执行同一组程序, 让其对某一网站的数据进行联合分布爬取. 原生的scrapy框架不能实现分布式的原因 调度器不能被共享, 管道也不能被共享 ...

  8. [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [三] 配置式爬虫

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 上一篇介绍的基本的使用方式,虽然自由度很高,但是编写的代码相对还是挺多.于是框 ...

  9. 增量式PID计算公式4个疑问与理解

    一开始见到PID计算公式时总是疑问为什么是那样子?为了理解那几道公式,当时将其未简化前的公式“活生生”地算了一遍,现在想来,这样的演算过程固然有助于理解,但假如一开始就带着对疑问的答案已有一定看法后再 ...

  10. 增量式PID简单翻板角度控制

    1.研究背景 随着电子技术.信息技术和自动控制理论技术的完善与发展,近来微型处理器在控制方面的应用也越来越多.随之逐渐渗透到我们生活的各个领域.如导弹导航装置,飞机上仪表的控制,网络通讯与数据传输,工 ...

随机推荐

  1. Idea2020.2.3 创建JavaWeb项目(部署Tomcat)方法

    1.创建项目不再是Java Enterprise了,而是先New 一个普通Java项目! 2.创建项目后,选择Run->Edit Configuration->左上角加号->Tomc ...

  2. liunx常用命令必备,持续更新

    inux中的命令的确是非常多,但是只需要掌握我们最常用的命令足够完成我们的工作了. 1.切换超级用户与普通用户 默认登录的是普通用户权限显示$符从普通用户切换超级用户权限:sudo su输入密码 从超 ...

  3. Oracle查询表中的各列的列名,数据类型,以及类型长度

    SELECT table_name, column_name, data_type,data_length FROM all_tab_cols WHERE table_name = UPPER('ba ...

  4. pytorch学习笔记(10)--完整的模型训练(待完善)

    一.神经网络训练 # file : train.py # time : 2022/8/11 上午10:03 # function : import torchvision.datasets from ...

  5. [iOS]Universal Link

    从零开始的操作流程在后面,这里把几个坑先挪到前面来 便于查看: ️ apple-app-site-association 只会在APP第一次启动的时候请求一次,因此文件的任何更新的验证都需要APP重新 ...

  6. 基于Geojson的点集的抽稀Js实现

    由于要进行反距离插值,离散点太多肯定会影响插值的效率. 为了提升插值速度,就有了这个点的抽稀. 参考这位仁兄的思路.http://blog.csdn.net/cdl2008sky/article/de ...

  7. WCF学习系列---1、新建第一个WCF服务

    一.了解.Net平台下的分布式技术 1.WebService:基于Http协议的Soap模式 2.Remoting :也是一种分布式架构技术,常常用于TCP模式的二进制传输 3.MSMQ:这是一种分布 ...

  8. 12组-Beta冲刺-2/5

    一.基本情况 队名:字节不跳动 组长博客:https://www.cnblogs.com/147258369k/p/15594989.html Github链接:https://github.com/ ...

  9. Pytorch实战学习(八):基础RNN

    <PyTorch深度学习实践>完结合集_哔哩哔哩_bilibili Basic RNN ①用于处理序列数据:时间序列.文本.语音..... ②循环过程中权重共享机制 一.RNN原理 ① X ...

  10. 软件工程日报六——TextView和button

    今天继续学习安卓stduio的知识--TextView和button TextView是安卓stduio中十分重要的一个控件,它可以在安卓应用上显示文字 通过网络我找到了TextView的相关用法如下 ...