3

当我运行蜘蛛时,我必须将扩展设置发送到scrapy。当我使用 curl 时真的很容易:

 http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1

但是当我想根据模块请求将它插入python脚本时,我对设置=DOWNLOAD_DELAY=2有点困惑,因为它不遵循通常的形式(key=value)。所以我尝试了这个:

r = requests.post("http://httpbin.org/get", params={'arg1': 'val1', 'setting=DOWNLOAD_DELAY': '2'})

但对通常的scrapy行为没有影响。

提前致谢。

4

1 回答 1

4

通常,在命令行上传递的键值对中,您拆分第一个 =,而不是第二个。所以,这样做:

r = requests.post("http://httpbin.org/get", params={'arg1': 'val1', 'setting': 'DOWNLOAD_DELAY=2'})

例如,在Program Argument Syntax Conventions的 GNU 文档中:

长选项由 '--' 后跟由字母数字字符和破折号组成的名称组成。选项名称通常为一到三个单词,并用连字符分隔单词。只要缩写是唯一的,用户就可以缩写选项名称。

要为长选项指定参数,请编写“--name=value”。此语法允许长选项接受本身是可选的参数。

换句话说, in --foo=bar=baz,fooname,bar=bazvalue, 因为=不是字母数字字符或破折号。

同样,将curl选项作为-d foo=bar=baz和作为值处理。foonamebar=baz

您不能从任何规范中直接推断出这一点——事实上,您甚至根本无法直接推断出curl遵循 GNU 参数语法,因为它不是 GNU 程序,并且 (IIRC) 进行自己的自定义参数解析。因此,您必须阅读源代码才能确定。

或者,更简单地说,测试它。curl捕获发出的表单编码请求。(如果您不知道如何操作:尝试仅使用 运行假服务器netcat,例如nc -kl 8888在 Mac/BSD 系统上,然后curl http://localhost:8888/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1查看命令行上显示的内容。)

name=value但是,只要你有对,这种行为几乎就是一个隐含的标准。

于 2013-02-21T18:54:00.670 回答