是否可以在蜘蛛的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
答案 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实例的例程。
无论如何,避免使用非抓取逻辑使蜘蛛代码过载,以保持其清洁和可重用。