在蜘蛛的init函数之后无法覆盖Scrapy中的设置

时间:2017-01-27 15:50:57

标签: python web-scraping scrapy web-crawler scrapy-spider

是否可以在蜘蛛的init函数后覆盖Scrapy设置? 例如,如果我想从db获取设置,我将查询参数作为cmdline中的参数传递。

def __init__(self, spider_id, **kwargs):
    self.spider_id = spider_id
    self.set_params(spider_id)
    super(Base_Crawler, self).__init__(**kwargs)

def set_params(self):
   #TODO
   #makes a query in db
   #get set variables from query result
   #override settings

1 个答案:

答案 0 :(得分:1)

从技术上讲,你可以在蜘蛛初始化后“覆盖”设置但是它不会影响任何东西,因为它们大部分都是先前应用的。

您实际可以做的是使用-a将参数作为命令行选项传递给Spider,并使用-s覆盖项目设置,例如。

<强>蜘蛛:

class TheSpider(scrapy.Spider):
    name = 'thespider'

    def __init__(self, *args, **kwargs):
       self.spider_id = kwargs.pop('spider_id', None)
       super(TheSpider).__init__(*args, **kwargs)

<强> CLI

scrapy crawl thespider -a spider_id=XXX -s SETTTING_TO_OVERRIDE=YYY

如果您需要更高级的东西,请考虑编写包裹蜘蛛的自定义跑步者。以下是docs

的示例
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

process = CrawlerProcess(get_project_settings())

# 'followall' is the name of one of the spiders of the project.
process.crawl('followall', domain='scrapinghub.com')
process.start() # the script will block here until the crawling is finished

只需将get_project_settings替换为您自己的返回Settings实例的例程。

无论如何,避免使用非抓取逻辑使蜘蛛代码过载,以保持其清洁和可重用。