美文网首页
scrapy在pipeline中重新生成request

scrapy在pipeline中重新生成request

作者: zbharper | 来源:发表于2019-11-19 15:13 被阅读0次

基于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

相关文章

网友评论

      本文标题:scrapy在pipeline中重新生成request

      本文链接:https://www.haomeiwen.com/subject/howwictx.html