scrapy 使用什么方式管理任务队列,如何指定域名进行定时清除? [V 币感谢]

2018-11-28 21:49:14 +08:00
 akmonde

RT,我想知道基础 scrapy 是如何管理队列的,我大致猜测是根据自带的队列池,并不依赖任何中间件。

我的需求是:

一旦达到特定条件,清除指定域名的队列,不再爬含有该域名的 url。
比如达到某个访问频次,就根据域名去清除该域名的所有爬行请求,但不影响爬行队列里已经存在的含有其他域名的 url。

我这边现在的情况是,根据文本 txt,喂给 scrapy 一部分 url,其中包含多个域名。

由于一些特殊情况,不是很方便用 redis 挨个 push url,好像这个也不太好根据域名去清除 url 队列,不过实在要用也请大家给个方案。

2506 次点击
所在节点    Python
4 条回复
WilliamYang
2018-11-29 10:04:27 +08:00
你可以写个 Downloader Middleware, 然后在处理 request 时根据你的条件判断, 如果不满足就抛弃
WaJueJiPrince
2018-11-29 11:34:56 +08:00
Scrapy-Redis 有个功能是动态切换域名,不知道是不是你想要的。
akmonde
2018-11-29 12:02:52 +08:00
@WilliamYang 中间件不满足抛弃的话,我那边也做了,但还是在爬触发了我条件的网站,不会停下对该域名的爬行的。
akmonde
2018-11-29 12:40:56 +08:00
@WaJueJiPrince 不知道您说的是不是这个:
```
#动态域范围的获取
def __init__(self, *args, **kwargs):
# Dynamically define the allowed domains list.
domain = kwargs.pop('domain', '')
self.allowed_domains = filter(None, domain.split(','))
super(MySpider, self).__init__(*args, **kwargs)
```
我这边需要是的是条件触发清除指定域名的队列,好像跟这个不太符合。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/512502

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX