Scrapy-在运行时根据提供的属性更改设置

时间:2019-02-04 20:21:54

标签: python python-3.x scrapy scrapy-spider

我很乐于做文章,正在研究这个project,这是Facebook帖子的蜘蛛。

如果要提供布尔属性,我想在运行时更改settings.py中的CONCURRENT_REQUESTS参数

我尝试如下重写 from_crawler 方法,但似乎不起作用

@classmethod
def from_crawler(cls, crawler, **kwargs):
    settings = cls(crawler.settings)
    if 'conc' in kwargs:
        settings.set('CONCURRENT_REQUESTS',32)
    return settings

能否请您告诉我如何正确使用它,以及如何更改__init__。我应该将所有解析的属性移到from_crawler吗? 谢谢!

3 个答案:

答案 0 :(得分:0)

我刚刚注意到,因为我可以在运行时使用“ -s CONCURRENT_REQUESTS = 32”。另一个选择是覆盖update_settings方法,这是遇到此问题的任何人的参考: Update scrapy settings based on spider property

答案 1 :(得分:0)

scrapy.core.downloader.total_concurrency中使用的

ntohl()设置。
设置本身是不可变的。但是CONCURRENT_REQUESTS对象是可变的。

您可以通过Spider方法动态更改此值。

scrapy.core.downloader

....

答案 2 :(得分:0)

基于此信息丰富的issue#4196telnet console的结合,甚至可以在执行后执行。

在启动1234命令时将telnet客户端连接到 port (例如scrapy crawl)和 password 并记录以下内容修改当前运行的downloader的Python语句:

$ telnet  127.0.0.1  6023  # Read the actual port from logs.
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Username: scrapy
Password: <copy-from-logs>
>>> engine.downloader.total_concurrency
8
>>> engine.downloader.total_concurrency = 32
>>> est()
Execution engine status

time()-engine.start_time                        : 14226.62803554535
engine.has_capacity()                           : False
len(engine.downloader.active)                   : 28
engine.scraper.is_idle()                        : False
engine.spider.name                              : <foo>
engine.spider_is_idle(engine.spider)            : False
engine.slot.closing                             : False
len(engine.slot.inprogress)                     : 32
len(engine.slot.scheduler.dqs or [])            : 531
len(engine.slot.scheduler.mqs)                  : 0
len(engine.scraper.slot.queue)                  : 0
len(engine.scraper.slot.active)                 : 0
engine.scraper.slot.active_size                 : 0
engine.scraper.slot.itemproc_size               : 0
engine.scraper.slot.needs_backout()             : False

以上相同的交互式语句可以用Crawler.parse()方法编写为代码。

相关问题