【问题标题】:Scrapy runspider command line argumentsScrapy runspider 命令行参数
【发布时间】:2021-01-21 20:29:40
【问题描述】:

我有一个我写的爬虫。它使用 gcp 数据存储。当我将数据写入数据存储时,我需要指定一个命名空间。对于脚本的每次运行,该命名空间都不相同。如何将命令行参数传递给scrapy runspider spider.py?我在 stackoverflow 上发现了另一篇文章,当您使用 scrapy crawl spider.py 时,它可以传递参数。爬行似乎对我不起作用。我需要一种使用runspider 的方法来做到这一点。有什么见解吗?

【问题讨论】:

标签: python python-3.x scrapy command-line-arguments


【解决方案1】:

所以。 scrapy 文档说您可以通过-a key=value 传递参数。在其所有示例中,它提供了使用crawl 而不是runspider 的示例。当我使用crawl 时,它甚至不是受支持的命令,我使用的是scrapy 2.3.0,根据撰写本文时的网站,它是最新版本。所以听起来他们的文档可能已经过时了。我找到了一种方法,即使在使用 runspider 时也可以将 key=value 参数传递给爬虫脚本。

要传递参数,请使用 -a key=value。

但是,要访问该键/值对,您必须像这样覆盖 __init__:

def __init__(self, key=None, *args, **kwargs):

其中“key”是传递给__init__ 函数的密钥。无,这是该键的默认值(大概)。如果您的函数签名与上述签名不完全匹配,它将无法正常工作。我的脚本之前只传入了self。在这种情况下,我无法访问键或值。

在具有上述签名的 __init__ 函数中,您必须将其作为第一行:

super(SpiderClassName, self).__init__(*args, **kwargs)

其中 SpiderClassName 是您已实例化的蜘蛛类的名称。

即:class SearchEngineSpider(scrapy.Spider):

然后,当您想在 __init__ 函数中访问该键的值时,您可以这样做:

self.key

例如:

print('key value: ', self.key)

'key' 是您使用 -a 传递的密钥的名称

您显然也可以在类内的整个代码中引用 self.key,而不仅仅是 __init__ 函数。

【讨论】:

  • “当我使用 crawl 时,它甚至不是一个受支持的命令”什么?!如果scrapy runspider 命令存在,那么scrapy crawl 命令也必须存在。
  • 这是scrapy crawl 不存在的屏幕截图。您还可以看到版本打印输出。此外,当您查询所有命令时,crawl 甚至没有列出。 i.ibb.co/dK1Yhfw/no-Command-Crawl.png
  • 哦,我想我知道发生了什么事。它仅适用于 Scrapy 项目(请参阅docs.scrapy.org/en/latest/topics/commands.html#crawl)。
  • 大概就是这样。我不想/不想建立一个scrapy项目。我只有一个要运行的脚本。因此使用scrapy runspider。感谢您的帮助。
猜你喜欢
  • 2016-10-03
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 2011-02-25
  • 2013-02-14
相关资源
最近更新 更多