Scrapy分布式爬虫自动去重原理

2023-07-0907:25:52云计算与物联网Comments951 views字数 890阅读模式

分布式爬虫和普通爬虫区别就是原本一件事一个人干,现在一件事分给几个人干。通过多 IP /机器对同一个目标进行爬取,难点在于如何分配任务,如果一个 URL 已经被其中一个爬虫爬过了,其他的就不要再爬了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50635.html

Scrapy 本身是有过滤功能的。进入crtl+鼠标左键进入 Scrapy ,再点这个定位文件的位置文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50635.html

Scrapy分布式爬虫自动去重原理
Scrapy分布式爬虫自动去重原理

这样就找到了 Scrapy整个工具的源码位置文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50635.html

Scrapy分布式爬虫自动去重原理

目录往上找有个 core 目录,调度器源码就在这文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50635.html

Scrapy分布式爬虫自动去重原理

class scheduler的初始化方法中有这么两个东西,第一个用于检测是否过滤,第二个用于查重文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50635.html

Scrapy分布式爬虫自动去重原理

再看这个类里面的函数,如果你没有设置dont_filter来表明让这个请求不要被过滤,并且判断后面的 df.request_seen。df 就是我们上图的 dupefilter ,点进去我们发现它默认是 False,文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50635.html

Scrapy分布式爬虫自动去重原理
Scrapy分布式爬虫自动去重原理

但事实上我们程序调用的是它一个子类里的方法,我这里点的时候没显示这个选项。这个子类和 BaseDupeFilter 在同一个文件,往下滑文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50635.html

Scrapy分布式爬虫自动去重原理
Scrapy分布式爬虫自动去重原理
Scrapy分布式爬虫自动去重原理

这里它判断你这个请求的指纹有没有(通过算法变成固定长度字符串节约资源,整个 request 太大了),看代码里的 file.write,把数据写进了一个什么东西(是一个 set()集合,看下下张图),如果你的请求hex以后的数据在集合里,就代表爬过了,就返回 True,没有就添加进文件,返回 False,那我们现在可以重新看这张图了,如果dont_filter = False(代表用户不想重发该请求),并且 df.request_seen = True(代表有该请求指纹,也就是爬过了),我们就 return False,也就是不爬这个请求,但凡有一个条件不满足(用户想重发或没有爬过该 URL),就会_dqpush把请求添加进队列,然后按顺序执行到最下面的 return True,进而发送请求。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50635.html

Scrapy分布式爬虫自动去重原理

fingerprints的类型如下,文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50635.html

Scrapy分布式爬虫自动去重原理

队列代码如下,_dqpush就是 push 进 dpclass文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50635.html

Scrapy分布式爬虫自动去重原理

那么整个去重过程大概就是:爬虫把请求给引擎,引擎给调度器,调度器判断用户有没有设dont_filter = True要求发生,设置就加密请求传给给 set()判断在不在 set 里,在就不爬了,不在就把它放到请求队列里去。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50635.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/yunda/50635.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定