gpt4 book ai didi

python - 我怎样才能使 start_url 在 scrapy 中从消息队列中使用?

转载 作者:太空狗 更新时间:2023-10-30 00:02:48 26 4
gpt4 key购买 nike

我正在构建一个 scrapy 项目,其中我有多个蜘蛛(每个域一个蜘蛛)。现在,要抓取的 url 动态地来自用户给定的查询。所以基本上我不需要做广泛的爬行,甚至不需要跟踪链接。会有一个接一个的 url,我只需要使用选择器提取。所以我在想,如果我可以将 URL 传递到 scrapy 蜘蛛可以从中使用的消息队列,我会没事的。但我无法弄清楚。我检查过

https://github.com/darkrho/scrapy-redis

但我觉得它不适合我的目的,因为我需要多个队列(每个蜘蛛一个队列)。正如我所了解的那样,一种方法似乎是覆盖蜘蛛中的 start_requests 方法。但是在这里我又不清楚该怎么做(python 和 scrapy 的新手)。我可以将其视为任何普通的 python 脚本并覆盖该方法以使用(任何)消息队列吗?此外,我需要 spider(s) 运行 24*7 并在队列中有请求时抓取。我想我应该使用信号并在某处引发 DontCloseSpider 异常。但是我该在哪里做呢?我很迷路。请帮忙。

这是我正在查看的场景:

User-> Query -> url from abc.com -> abc-spider

          -> url from xyz.com -> xyz-spider

-> url from ghi.com -> ghi-spider

现在每个网址都有相同的东西要为每个网站抓取。所以我让选择器在每个蜘蛛中这样做。我需要的是,这只是一个单一的用户场景。当有多个用户时,会有多个不相关的 url 进入同一个蜘蛛。所以它会是这样的:

查询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 将动态出现,并将被推送到各自的消息队列中。现在每个针对该网站的蜘蛛都必须使用各自的队列,并在消息队列上有请求时将抓取的项目给我

最佳答案

这是将 scrapy 构建为数据管道一部分的非常常见且(IMO)极好的方法;我一直这样做。

你想覆盖蜘蛛的 start_requests() 方法是正确的。如果您定义了 start_requests() 以及 start_urls 变量,我不知道 scrapy 的行为如何,但如果您从动态源(如数据库)消费,我建议您只使用 start_requests()。

一些示例代码,未经测试,但应该会给你正确的想法。如果你需要更多信息,请告诉我。它还假定您的队列由另一个进程填充。

class ProfileSpider( scrapy.Spider ):
name = 'myspider'

def start_requests( self ):
while( True ):
yield self.make_requests_from_url(
self._pop_queue()
)

def _pop_queue( self ):
while( True ):
yield self.queue.read()

这会将您的队列公开为生成器。如果你想最小化空循环的数量(因为队列可能很多时候是空的),你可以在 _pop_queue 循环中添加一个 sleep 命令或指数退避。 (如果队列为空,则休眠几秒钟,然后再次尝试弹出。)

假设您的代码中没有发生 fatal error ,我相信这不应该因为循环/生成器的构造而终止。

关于python - 我怎样才能使 start_url 在 scrapy 中从消息队列中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25966941/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com