Scrapy去重
一、原生
1、模块
from scrapy.dupefilters import RFPDupeFilter
2、RFPDupeFilter方法
a、request_seen
核心:爬虫每执行一次yield Request对象,则执行一次request_seen方法
作用:用来去重,相同的url只能访问一次
实现:将url值变成定长、唯一的值,如果这个url对象存在,则返回True表名已经访问过,若url不存在则添加该url到集合
1)、request_fingerprint
作用:对request(url)变成定长唯一的值,如果使用md5的话,下面的两个url值不一样
注意:request_fingerprint() 只接收request对象
from scrapy.utils.request import request_fingerprint
from scrapy.http import Request #
url1 = 'https://test.com/?a=1&b=2'
url2 = 'https://test.com/?b=2&a=1'
request1 = Request(url=url1)
request2 = Request(url=url2) # 只接收request对象
rfp1 = request_fingerprint(request=request1)
rfp2 = request_fingerprint(request=request2)
print(rfp1)
print(rfp2) if rfp1 == rfp2:
print('url相同')
else:
print('url不同')
2)、request_seen
def request_seen(self, request):
# request_fingerprint 将request(url) -> 唯一、定长
fp = self.request_fingerprint(request)
if fp in self.fingerprints:
return True # 返回True,表明已经执行过一次
self.fingerprints.add(fp)
b、open
父类BaseDupeFilter中的方法,爬虫开始时,执行
def open(self):
# 爬虫开始
pass
c、close
爬虫结束时执行
def close(self, reason):
# 关闭爬虫时执行
pass
d、log
记录日志
def log(self, request, spider):
# 记录日志
pass
e、from_settings
原理及作用:和pipelines中的from_crawler一致
@classmethod
def from_settings(cls, settings):
return cls()
二、自定义
待续
1、配置文件(settings.py)
# 原生
# DUPEFILTER_CLASS = 'scrapy.dupefilter.RFPDupeFilter'
DUPEFILTER_CLASS = 'toscrapy.dupefilters.MyDupeFilter'
2、自定义去重类(继承BaseDupeFilter)
from scrapy.dupefilters import BaseDupeFilter
from scrapy.utils.request import request_fingerprint
# class MyDupeFilter(BaseDupeFilter):
def __init__(self):
self.visited_fp = set() @classmethod
def from_settings(cls, settings):
return cls() def request_seen(self, request):
# 判断当前的request对象是否,在集合中,若在则放回True,表明已经访问,否则,访问该request的url并将该url添加到集合中
if request_fingerprint(request) in self.visited_fp:
return True
self.visited_fp.add(request_fingerprint(request)) def open(self): # can return deferred
print('开启爬虫') def close(self, reason): # can return a deferred
print('结束爬虫') def log(self, request, spider): # log that a request has been filtered
pass
3、前提条件
yield request的对象
yield scrapy.Request(url=_next, callback=self.parse, dont_filter=True)
dont_filter不能为True,这个值默认为False
Scrapy去重的更多相关文章
- scrapy 去重 dont_filter=False
yield Request(...... dont_filter=False)
- scrapy暂停和重启,及url去重原理,telenet简单使用
一.scrapy暂停与重启 1.要暂停,就要保留一些中间信息,以便重启读取中间信息并从当前位置继续爬取,则需要一个目录存放中间信息: scrapy crawl spider_name -s JOBDI ...
- Scrapy 增量式爬虫
Scrapy 增量式爬虫 https://blog.csdn.net/mygodit/article/details/83931009 https://blog.csdn.net/mygodit/ar ...
- Scrapy学习-18-去重原理
Scrapy去重原理 scrapy本身自带一个去重中间件 scrapy源码中可以找到一个dupefilters.py去重器 源码去重算法 # 将返回值放到集合set中,实现去重 def reque ...
- 使用 Scrapy 爬取去哪儿网景区信息
Scrapy 是一个使用 Python 语言开发,为了爬取网站数据,提取结构性数据而编写的应用框架,它用途广泛,比如:数据挖掘.监测和自动化测试.安装使用终端命令 pip install Scrapy ...
- Python分布式爬虫打造搜索引擎完整版-基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站
Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 https://github.com/mtianyan/Artic ...
- 2.python知识点总结
1.什么是对象?什么是类? 对象是对类的具体表达,类是对象的抽象表达. 类只是为所有的对象定义了抽象的属性与行为. —————————————————————————————————————————— ...
- 笔记-scrapy-去重
笔记-scrapy-去重 1. scrapy 去重 scrapy 版本:1.5.0 第一步是要找到去重的代码,scrapy在请求入列前去重,具体源码在scheduler.py: def en ...
- python scrapy爬虫数据库去重方法
1. scrapy对request的URL去重 yield scrapy.Request(url, self.parse, dont_filter=False) 注意这个参数:dont_filter= ...
随机推荐
- 如何通过命令行 msbuild 编译项目
本文告诉大家如何通过 msbuild 编译一个项目,通过命令行编译可以输出更多的编译信息,可以用来调试自己写的编译相关方法,可以看到是哪个文件编译失败 在开始菜单可以找到 VisualStudio 的 ...
- H3C DHCP服务器基本配置
- linux 运行处理者
如同前面建议的, 当内核收到一个中断, 所有的注册的处理者被调用. 一个共享的处理者 必须能够在它需要的处理的中断和其他设备产生的中断之间区分. 使用 shared=1 选项来加载 short 安装了 ...
- Vue中通过属性绑定为元素绑定style行内样式
1.直接在元素上通过:style的形式,书写样式对象 2.将样式对象定义在data中,并直接引用到:style中 3.在:style中通过数组,引用多个data上的样式对象
- linux 注册一个 PCI 驱动
为了被正确注册到内核, 所有的 PCI 驱动必须创建的主结构是 struct pci_driver 结构. 这个结构包含许多函数回调和变量, 来描述 PCI 驱动给 PCI 核心. 这里是这个结构的一 ...
- 2019-6-23-win10-uwp-应用放到桌面
title author date CreateTime categories win10 uwp 应用放到桌面 lindexi 2019-06-23 11:11:30 +0800 2019-06-2 ...
- ORACLE 两表关联更新三种方式
不多说了,我们来做实验吧. 创建如下表数据 select * from t1 ; select * from t2; 现需求:参照T2表,修改T1表,修改条件为两表的fname列内容一致. 方式1,u ...
- springBoot从入门到源码分析
先分享一个springBoot搭建学习项目,和springboot多数据源项目的传送门:https://github.com/1057234721/springBoot 1. SpringBoot快速 ...
- 使用condition 实现线程顺序执行
书上给的例子都是ABCABC这种,比较简单,复杂点的如A0B0C0, A0A1A2没有,手动实现下,做个记录 1. A0 A1 A2 A3 public class Demo0 { private s ...
- 微信小程序酒店日历超强功能
首先利用date拿到年月日 月记得+1 ,因为是从0开始的 先遍历月份,跨年年+1 ,月归至1: 然后遍历天数, lastDat = new Date(val.year,val.month,0).ge ...