Scrapy:与辅助网站交互时的程序组织

时间:2017-02-27 00:43:40

标签: python scrapy

我正在使用Scrapy 1.1,我有一个项目,我有蜘蛛'1'刮网站A(我获取90%的信息来填充我的项目)。但是,根据Site A scrape的结果,我可能需要从站点B中获取更多信息。就开发程序而言,在蜘蛛'1'中刮取站点B是否更有意义,或者是否可以进行交互站点B来自管道对象。我更喜欢后者,认为它解耦了2个站点,但我不确定这是否可行或是处理这个用例的最佳方法。另一种方法可能是使用第二个蜘蛛(蜘蛛'2')用于站点B,但是我会假设我必须让蜘蛛'1'运行,保存到db然后运行蜘蛛'2'。无论如何,任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

这两种方法都很常见,这只是一个偏好问题。对于你的案例,在一个蜘蛛中包含所有内容听起来像一个直接的解决方案。

您可以将url字段添加到项目中,并在以后的管道中安排和解析它:

class MyPipeline(object):
    def __init__(self, crawler):
        self.crawler = crawler

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)

    def process_item(self, item, spider):
        extra_url = item.get('extra_url', None)
        if not extra_url:
            return item
        req = Request(url=extra_url
                      callback=self.custom_callback,
                      meta={'item': item},)
        self.crawler.engine.crawl(req, spider)
        # you have to drop the item here since you will return it later anyway
        raise DropItem()

    def custom_callback(self, response):
        # retrieve your item
        item = response.mete['item']
        # do something to add to item
        item['some_extra_stuff'] = ...
        del item['extra_url'] 
        yield item

上面的代码所做的是检查item是否有一些url字段,如果是,则删除该项并调度新请求。该请求用一些额外的数据填充该项目并将其发送回管道。