从一只蜘蛛到另一只蜘蛛的Scrapy产量请求

时间:2017-09-13 20:45:24

标签: python python-3.x scrapy

我有以下代码:

#FirstSpider.py
class FirstSpider(scrapy.Spider):

    name = 'first'
    start_urls = ['https://www.basesite.com']
    next_urls = []

    def parse(self, response):
        for url in response.css('bunch > of > css > here'):
        self.next_urls.append(url.css('more > css > here'))
        l = Loader(item=Item(), selector=url.css('more > css'))
        l.add_css('add', 'more > css')
        ...
        ...
        yield l.load_item()
        for url in self.next_urls:
            new_urls = self.start_urls[0] + url
            yield scrapy.Request(new_urls, callback=SecondSpider.parse_url)

#SecondSpider.py
class SecondSpider(scrapy.Spider):

    name = 'second'
    start_urls = ['https://www.basesite.com']


    def parse_url(self):
        """Parse team data."""
        return self
        # self is a HtmlResponse not a 'response' object


    def parse(self, response):
        """Parse all."""
        summary = self.parse_url(response)
        return summary

#ThirdSpider.py
class ThirdSpider(scrapy.Spider):
    # take links from second spider, continue:

我希望能够将Spider 1中抓取的url传递给Spider 2(在不同的脚本中)。我很好奇为什么当我这样做时,'响应'是HtmlResponse而不是response对象(当做与Spider 1在同一类中的方法类似的事情时;我不知道'有这个问题)

我在这里缺少什么?我如何将原始响应传递给第二个蜘蛛? (从第二个到第三个等等。?)

2 个答案:

答案 0 :(得分:0)

您可以将Redis用作所有蜘蛛https://github.com/rmax/scrapy-redis

之间的共享资源
  • 运行所有N个蜘蛛(不要在空闲状态下关闭),因此每个蜘蛛都将连接到相同的Redis并从那里等待任务(网址,请求标头);

  • 作为副作用从X_spider向具有特定键(Y_spider名称)的Redis推送任务数据。

答案 1 :(得分:0)

使用继承怎么样? “解析”函数名称应不同。 如果您的第一个蜘蛛继承自第二个蜘蛛,它将能够将回调设置为self.parse_function_spider2