一、原生

1、模块

  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对象

  1. from scrapy.utils.request import request_fingerprint
  2. from scrapy.http import Request
  3.  
  4. #
  5. url1 = 'https://test.com/?a=1&b=2'
  6. url2 = 'https://test.com/?b=2&a=1'
  7. request1 = Request(url=url1)
  8. request2 = Request(url=url2)
  9.  
  10. # 只接收request对象
  11. rfp1 = request_fingerprint(request=request1)
  12. rfp2 = request_fingerprint(request=request2)
  13. print(rfp1)
  14. print(rfp2)
  15.  
  16. if rfp1 == rfp2:
  17. print('url相同')
  18. else:
  19. print('url不同')

2)、request_seen

  1. def request_seen(self, request):
  2. # request_fingerprint 将request(url) -> 唯一、定长
  3. fp = self.request_fingerprint(request)
  4. if fp in self.fingerprints:
  5. return True # 返回True,表明已经执行过一次
  6. self.fingerprints.add(fp)

b、open

父类BaseDupeFilter中的方法,爬虫开始时,执行

  1. def open(self):
  2. # 爬虫开始
  3. pass

c、close

爬虫结束时执行

  1. def close(self, reason):
  2. # 关闭爬虫时执行
  3. pass

d、log

记录日志

  1. def log(self, request, spider):
  2. # 记录日志
  3. pass

e、from_settings

原理及作用:和pipelines中的from_crawler一致

  1. @classmethod
  2. def from_settings(cls, settings):
  3. return cls()

二、自定义

待续

1、配置文件(settings.py)

  1. # 原生
  2. # DUPEFILTER_CLASS = 'scrapy.dupefilter.RFPDupeFilter'
  3. DUPEFILTER_CLASS = 'toscrapy.dupefilters.MyDupeFilter'

2、自定义去重类(继承BaseDupeFilter)

  1. from scrapy.dupefilters import BaseDupeFilter
  2. from scrapy.utils.request import request_fingerprint
  3. #
  4.  
  5. class MyDupeFilter(BaseDupeFilter):
  6. def __init__(self):
  7. self.visited_fp = set()
  8.  
  9. @classmethod
  10. def from_settings(cls, settings):
  11. return cls()
  12.  
  13. def request_seen(self, request):
  14. # 判断当前的request对象是否,在集合中,若在则放回True,表明已经访问,否则,访问该request的url并将该url添加到集合中
  15. if request_fingerprint(request) in self.visited_fp:
  16. return True
  17. self.visited_fp.add(request_fingerprint(request))
  18.  
  19. def open(self): # can return deferred
  20. print('开启爬虫')
  21.  
  22. def close(self, reason): # can return a deferred
  23. print('结束爬虫')
  24.  
  25. def log(self, request, spider): # log that a request has been filtered
  26. pass

3、前提条件

yield request的对象

  1. yield scrapy.Request(url=_next, callback=self.parse, dont_filter=True)

dont_filter不能为True,这个值默认为False

Scrapy去重的更多相关文章

  1. scrapy 去重 dont_filter=False

    yield Request(...... dont_filter=False)

  2. scrapy暂停和重启,及url去重原理,telenet简单使用

    一.scrapy暂停与重启 1.要暂停,就要保留一些中间信息,以便重启读取中间信息并从当前位置继续爬取,则需要一个目录存放中间信息: scrapy crawl spider_name -s JOBDI ...

  3. Scrapy 增量式爬虫

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

  4. Scrapy学习-18-去重原理

    Scrapy去重原理 scrapy本身自带一个去重中间件 scrapy源码中可以找到一个dupefilters.py去重器   源码去重算法 # 将返回值放到集合set中,实现去重 def reque ...

  5. 使用 Scrapy 爬取去哪儿网景区信息

    Scrapy 是一个使用 Python 语言开发,为了爬取网站数据,提取结构性数据而编写的应用框架,它用途广泛,比如:数据挖掘.监测和自动化测试.安装使用终端命令 pip install Scrapy ...

  6. Python分布式爬虫打造搜索引擎完整版-基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 https://github.com/mtianyan/Artic ...

  7. 2.python知识点总结

    1.什么是对象?什么是类? 对象是对类的具体表达,类是对象的抽象表达. 类只是为所有的对象定义了抽象的属性与行为. —————————————————————————————————————————— ...

  8. 笔记-scrapy-去重

    笔记-scrapy-去重 1.      scrapy 去重 scrapy 版本:1.5.0 第一步是要找到去重的代码,scrapy在请求入列前去重,具体源码在scheduler.py: def en ...

  9. python scrapy爬虫数据库去重方法

    1. scrapy对request的URL去重 yield scrapy.Request(url, self.parse, dont_filter=False) 注意这个参数:dont_filter= ...

随机推荐

  1. HDU 3974 Assign the task

    Assign the task Problem Description There is a company that has N employees(numbered from 1 to N),ev ...

  2. P1045 和为给定数

    题目描述 给出若干个整数,询问其中是否有一对数的和等于给定的数. 输入格式 共三行: 第一行是整数 \(n(0 \lt n \le 100000)\) ,表示有 \(n\) 个整数. 第二行是n个整数 ...

  3. SpringBoot 上传文件到linux服务器 异常java.io.FileNotFoundException: /tmp/tomcat.50898……解决方案

    SpringBoot 上传文件到linux服务器报错java.io.FileNotFoundException: /tmp/tomcat.50898-- 报错原因: 解决方法 java.io.IOEx ...

  4. dotnet core 黑科技·String

    本文来告诉大家 dotnet core 里面使用的黑科技,如何提高String.IndexOf(char)的性能 在Performance Improvements in .NET Core有说道哪些 ...

  5. dotnet 删除只读文件

    如果直接通过 File.Delete 删除只读文件会出现没有权限提示,可以先设置文件不是只读然后删除文件 try { File.Delete(file); } catch (UnauthorizedA ...

  6. ZOJ——Knight Moves(bfs)

    Knight Moves Time Limit: 2 Seconds      Memory Limit: 65536 KB A friend of you is doing research on ...

  7. Checkpoint R77.30 web ui登录配置

    R77.30默认只能使用微软内核的浏览器进行web ui的登陆,在专家模式下修改后chrome和firefox正常登录,步骤如下: [Expert@BJ-ZHX-FW:0]# cp /web/htdo ...

  8. boostrap-非常好用但是容易让人忽略的地方【6】:role属性

    普通样式,鼠标hover没有任何效果 <span>content</span> 加上role属性的样式,鼠标hover会有cursor:pointer的效果 <span ...

  9. 苹果笔记本修改pycharm for mac 修改字体大小

    实在是隐藏的太深了,无语

  10. 前端——JS

    目录 JavaScript概述 ECMAScript和JavaScript的关系 ECMAScript的历史 JavaScript引入方式 Script标签内写代码 引入额外的JS文件 JavaScr ...