如何在scrapy中通过CrawlerProcess传递自定义设置?

时间:2017-02-17 14:37:58

标签: python web-scraping scrapy scrapy-spider

我有两个CrawlerProcesses,每个都调用不同的蜘蛛。我想将自定义设置传递给其中一个进程以将蜘蛛的输出保存到csv,我想我可以这样做:

storage_settings = {'FEED_FORMAT': 'csv', 'FEED_URI': 'foo.csv'}
process = CrawlerProcess(get_project_settings())
process.crawl('ABC', crawl_links=main_links, custom_settings=storage_settings )
process.start() 

在我的蜘蛛中,我把它们作为一个论点来读:

    def __init__(self, crawl_links=None, allowed_domains=None, customom_settings=None,  *args, **kwargs):
    self.start_urls = crawl_links
    self.allowed_domains = allowed_domains
    self.custom_settings = custom_settings
    self.rules = ......
    super(mySpider, self).__init__(*args, **kwargs)

但是如何告诉我的项目设置文件“settings.py”有关这些自定义设置?我不想对它们进行硬编码,而是希望它们能够自动读取。

2 个答案:

答案 0 :(得分:3)

您无法告诉您的文件有关这些设置。您可能在爬虫设置和蜘蛛设置之间感到困惑。在scrapy中,此时的饲料参数需要传递给爬行过程而不是蜘蛛。您必须将它们作为参数传递给爬网程序进程。我和你有相同的用例。您所做的是读取当前项目设置,然后为每个爬网程序进程覆盖它。请参阅下面的示例代码:

s = get_project_settings()
s['FEED_FORMAT'] = 'csv'
s['LOG_LEVEL'] = 'INFO'
s['FEED_URI'] = 'Q1.csv'
s['LOG_FILE'] = 'Q1.log'

proc = CrawlerProcess(s)

然后您对process.crawl()的来电不正确。蜘蛛的名称应作为第一个参数作为字符串传递,如下所示:process.crawl('MySpider', crawl_links=main_links)当然MySpider应该是赋予spider类中name属性的值。

答案 1 :(得分:0)

不要将设置传递给crawl()方法。并将您的蜘蛛的类名作为第一个参数传递给crawl()

from my_crawler.spiders.my_scraper import MySpider
from scrapy.crawler import CrawlerProcess
from scrapy.settings import Settings
from scrapy.utils.project import get_project_settings
from twisted.internet import reactor

process = CrawlerProcess(get_project_settings())

process.crawl(MySpider(), crawl_links=main_links)

process.start()