如何为Scrapy中的Pipeline传递参数?现有实现存疑问
给Scrapy Pipeline的
__init__传递参数的其他方法 当然有啦!除了你提到的通过from_crawler读取配置文件的方式,还有几种实用的方法能给Scrapy Pipeline的__init__传递参数,我给你一一拆解:
手动实例化Pipeline并传参
Scrapy允许你在settings.py的ITEM_PIPELINES里直接传入Pipeline的实例,而不是只写类路径。这样你就能在实例化的时候直接传递自定义参数了。举个例子:# settings.py from myproject.pipelines import MongoPipeline ITEM_PIPELINES = { # 直接实例化Pipeline并传入参数 MongoPipeline(mongo_uri='mongodb://localhost:27017', mongo_db='my_custom_db'): 300, }只要你的Pipeline类的
__init__方法能接收这些参数就行,这种方式特别适合测试或者需要快速调整参数的场景。通过命令行参数传递
你可以借助Scrapy的命令行-a参数给爬虫传递参数,然后在Pipeline里从爬虫实例中获取这些值。具体步骤如下:
首先在爬虫类里接收命令行参数:# 爬虫文件 myspider.py class MySpider(scrapy.Spider): name = 'myspider' def __init__(self, mongo_uri=None, mongo_db=None, *args, **kwargs): super().__init__(*args, **kwargs) self.mongo_uri = mongo_uri self.mongo_db = mongo_db然后修改Pipeline的
from_crawler方法,从爬虫实例中读取参数:class MongoPipeline(object): collection_name = 'scrapy_items' def __init__(self, mongo_uri, mongo_db): self.mongo_uri = mongo_uri self.mongo_db = mongo_db @classmethod def from_crawler(cls, crawler): spider = crawler.spider # 优先用命令行传入的参数,没有的话再读配置文件 return cls( mongo_uri=spider.mongo_uri or crawler.settings.get('MONGO_URI'), mongo_db=spider.mongo_db or crawler.settings.get('MONGO_DATABASE', 'items') )最后运行爬虫时通过命令行传递参数:
scrapy crawl myspider -a mongo_uri=mongodb://custom-host:27017 -a mongo_db=custom_db利用Scrapy信号动态传递参数
如果你的参数需要在爬虫启动后动态生成(比如从数据库或者其他服务获取),可以借助Scrapy的spider_opened信号,在Pipeline的open_spider方法里获取参数并初始化。示例如下:class MongoPipeline(object): collection_name = 'scrapy_items' def __init__(self): # 先初始化空属性 self.mongo_uri = None self.mongo_db = None self.client = None self.db = None def open_spider(self, spider): # 从爬虫实例中获取动态生成的参数 self.mongo_uri = spider.dynamic_mongo_uri self.mongo_db = spider.dynamic_mongo_db # 在这里初始化Mongo连接 self.client = pymongo.MongoClient(self.mongo_uri) self.db = self.client[self.mongo_db]这种方式适合参数无法提前确定,需要在爬虫运行过程中生成的场景。
内容的提问来源于stack exchange,提问作者Rodrigo Laguna
相关产品推荐
相关产品推荐

