首页 > 解决方案 > 蜘蛛完成后返回scrapy项目

问题描述

是否有可能以某种方式抓取一些项目,将它们保存到列表中,当蜘蛛完成后,所有项目都将返回以进行管道管理。我已经尝试使用下面的代码进行类似的操作,但它不起作用,因为 Scrapy 不希望在函数中返回项目Spider.closed()

我需要这样做,因为我抓取了两个具有共同产品的搜索列表并从中提取数据,因此我希望将两个不同搜索列表中的相同产品保存在一个项目中。

我之前已经解决了这个问题,方法是在每个函数之后运行一些函数parse()来检查另一个解析是否完成。但这带来了一些意想不到的结果。

class MySpider(scrapy.Spider):
     items = []

def parse(self, response):
    ...
    newitem = Item()
    self.items.append(newitem)


def closed(self, reason):
    for item in self.items:
         yield item

标签: pythonscrapy

解决方案


找到了一个解决方案,也有点hacky,但它有效。不过,这可能不是最好的解决方案,因为scrape 似乎不会重新处理已处理的项目。可能对以后的部署产生影响。

class MySpider(scrapy.Spider):
    name = 'myspider'
    items = []

    @classmethod
    def from_crawler(cls, crawler, *args, **kwargs):
        from_crawler = super(MySpider, cls).from_crawler
        spider = from_crawler(crawler, *args, **kwargs)
        crawler.signals.connect(spider.idle, signal=scrapy.signals.spider_idle)
        return spider

    def idle(self):
        itemproc = self.crawler.engine.scraper.itemproc
        for item in self.items:
            itemproc.process_item(item, self)

推荐阅读