scrapy在pipeline中重新生成request

基于scrapy框架进行爬虫开发,一般的流程如下:

  1. 设计spider类,在spider类中yield request,并注册回调函数处理response
  2. 设计item,在spider类的回调函数中通过分析response生成item
  3. 设计pipeline类,处理生成的item,如保存至文件/保存至数据库/聚合分析等

某些应用场景下,我们可能需要在pipeline中对 item进行进一步处理,比如从中提取新的url进行爬取或者调用restful 微服务等。这就需要在pipeline中重新yield 新的request。
而从scrapy的数据流中可以看到,scrapy的执行引擎只向pipeline发送item数据,并不接收pipeline返回的数据。类似在spider类中直接yield request的方式是行不通的,yield语句会中断所有pipeline的执行


image.png

解决方法

显式调用crawler.engine.crawl(),将新的request发送至执行引擎。

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):
        ...
        self.crawler.engine.crawl(
                    Request(
                        url='someurl',
                        callback=self.custom_callback,
                    ),
                    spider,
                )

    # YES, you can define a method callback inside the same pipeline
    def custom_callback(self, response):
        ...
        yield item
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容