2014-09-22 56 views
6

我正在构建一个scrapy项目,其中有多个蜘蛛(每个域都有一个蜘蛛)。现在,被抓取的网址会动态地从给定查询的用户开始。所以基本上我不需要进行广泛的抓取,甚至不需要链接。将有一个接一个的网址,我只需要使用选择器提取。所以我想,如果我只是将URL传递到scrapy蜘蛛可以消耗的消息队列中,我会没事的。但我无法弄清楚。我已经检查如何使scrapy中的start_url从消息队列中消耗?

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

,但我觉得它不适合我的目的,我需要多个队列(每个蜘蛛单个队列)。 正如我已经开始学习,一种方法似乎是重写蜘蛛中的start_requests方法。但是在这里我还不清楚该怎么做(python和scrapy的新功能)。我可以将它作为任何普通的python脚本处理,并且使用(任何)消息队列的方法来处理它? 此外,我需要运行24 * 7的蜘蛛,并在队列中有请求时进行刮擦。我想我应该使用信号并在某处提出DontCloseSpider异常。但我在哪里做?我很迷茫。请帮忙。

下面是我在看的情景:

用户 - >查询 - > URL从abc.com - > ABC-蜘蛛

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

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

现在每个URL都有同样的事情被刮掉了每个网站。所以我有选择器在每个蜘蛛中做这件事。我需要的是,这只是一个单一的用户场景。当有多人用户时,会有多个不相关的网站进入同一个蜘蛛。所以这将是这样的:

QUERY1,QUERY2,QUERY3

abc.com - > url_abc1,url_abc2,url_abc3

xyz.com - > url_xyz1,url_xyz2,url_xyz3

GHI url_ghi1,url_ghi2,url_ghi3

因此,对于每个网站,这些网址都将动态传递,并将其推送到各自的消息队列中。 现在,每个为网站设计的蜘蛛都必须使用它们各自的队列,并且在消息队列中有请求时给我抓取的物品

+0

问题是运行多个蜘蛛吗? – Nabin 2014-09-22 05:17:05

+1

没有。问题是如何使消息队列中的蜘蛛消耗。 – Avinragh 2014-09-22 05:25:24

+0

看看http://stackoverflow.com/questions/21694386/running-more-than-one-spiders-one-by-one – Nabin 2014-09-22 05:27:09

回答

4

这是一种非常常见的(IMO)数据流水线;我一直这样做。

你是正确的,你想重写蜘蛛的start_requests()方法。我不知道scrapy的行为如果你有start_requests()以及start_urls变量,但是我建议只使用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循环中添加睡眠命令或指数退避。 (如果队列为空,则休眠几秒钟并尝试再次弹出。)

假设您的代码中没有发生致命错误,我认为这不应该因为构建循环/生成器而终止。

+0

谢谢!我得到了我的蜘蛛与消息队列 – Avinragh 2014-09-27 09:59:08

+0

无法正常工作。它抱怨错误获取启动请求,因为它期望字符串URL作为其获取生成器 – 2017-06-07 07:33:25