我正在构建一个 scrapy 项目,其中有多个蜘蛛(每个域一个蜘蛛)。现在,要抓取的 URL 是动态地来自用户给定的查询。所以基本上我不需要进行广泛的爬行,甚至不需要跟踪链接。将会有一个接一个的网址,我只需要使用选择器进行提取。所以我在想,如果我可以将 URL 传递到 scrapy 蜘蛛可以使用的消息队列上,那就没问题了。但我无法弄清楚。我检查过
https://github.com/darkrho/scrapy-redis https://github.com/darkrho/scrapy-redis
但我觉得它不适合我的目的,因为我需要多个队列(每个蜘蛛一个队列)。
据我了解,一种方法似乎是覆盖蜘蛛中的 start_requests 方法。但我再次不清楚该怎么做(对于 python 和 scrapy 来说是新手)。我可以将它视为任何普通的 python 脚本并 ovverride 使用(任何)消息队列的方法吗?
另外,我需要蜘蛛 24*7 运行,并在队列中有请求时进行抓取。我想我应该使用信号并在某处引发 DontCloseSpider 异常。但我该在哪里做呢?我很迷失。请帮忙。
这是我正在考虑的场景:
用户 -> 查询 -> 来自 abc.com 的 url -> abc-spider
-> url from xyz.com -> xyz-spider
-> url from ghi.com -> ghi-spider
现在,每个网站的每个网址都有相同的内容需要抓取。所以我有选择器在每个蜘蛛中执行此操作。我需要的是,这只是一个单一用户场景。当有多个用户时,同一个蜘蛛会收到多个不相关的网址。所以它会是这样的:
查询1、查询2、查询3
abc.com -> url_abc1,url_abc2,url_abc3
xyz.com -> url_xyz1,url_xyz2,url_xyz3
ghi.com -> url_ghi1,url_ghi2, url_ghi3
因此,对于每个网站,这些 URL 都会动态出现,并被推送到各自的消息队列中。
现在,每个用于该网站的蜘蛛都必须消耗各自的队列,并在消息队列上有请求时向我提供抓取的项目