根据请求模块将curl执行的post请求转换为python请求

时间:2013-02-21 18:10:55

标签: python post curl python-requests

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

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

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

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

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

提前致谢。

1 个答案:

答案 0 :(得分:3)

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

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

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

  

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

     

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

换句话说,在--foo=bar=baz中,foonamebar=bazvalue,因为=不是字母数字字符或短划线。

同样,curl处理选项-d foo=bar=baz,其中foonamebar=baz为值。

你无法直接从任何规范中推断出,你甚至无法直接推断出curl完全遵循GNU参数语法,因为它不是GNU程序而且(IIRC)是自己的自定义参数解析。所以,你必须阅读the source才能完全确定。

或者,更简单地说,测试它。捕获curl发出的表单编码请求。 (如果您不知道如何操作:尝试在{/ 1}}上运行假的服务器,例如,在Mac / BSD系统上运行netcat,然后nc -kl 8888,并查看显示的内容在命令行上。)

但只要你有curl http://localhost:8888/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1对,这种行为就是一种隐含的标准。