使用代理的 http GET - Curl 命令有效,但 python“请求”库不

Posted

技术标签:

【中文标题】使用代理的 http GET - Curl 命令有效,但 python“请求”库不【英文标题】:http GET using proxy - Curl command works but python "requests" library does not 【发布时间】:2017-09-15 21:16:51 【问题描述】:

我有以下工作 curl 命令:

curl -x http://<PROXY URL>:3128 -u myUsername 'https://logs.company.net/daily-2017.04.13/_search?pretty' -d 'BIG JSON BLOB

我正在尝试使用 requests 库将其转换为 python。这是我目前所拥有的:

json_string = '''BIG JSON BLOB'''

print(json_string)
mydict = json.loads(json_string)    # obj now contains a dict of the data

proxies = "http" : "http://<proxy url>:3128"
r = requests.get("https://logs.company.net/daily-2017.04.13/_search?pretty", data=json_string,auth=(self.username, self.password), proxies=proxies, verify= False) #
print(r.status_code, r.reason)
print(str(r.content))

据我了解,这与上述基本相同,但是当 curl 命令没有时,它在我的测试服务器上超时。

有谁知道这里有什么问题或者我该如何调试它?我本可以使用 subprocess 模块破解 curl 命令,但我对调试网络东西还很陌生,我想了解它为什么不起作用,因此决定在这里提问。

谢谢!

【问题讨论】:

【参考方案1】:

根据curl 命令的手册页,-d 标志用于使用 POST 请求发布数据:

-d/--数据

(HTTP) 将 POST 请求中的指定数据发送到 HTTP 服务器,就像浏览器在用户填写 html 表单并按下提交按钮时所做的那样。这将导致 curl 使用内容类型 application/x-www-form-urlencoded 将数据传递给服务器。与 -F/--form 比较。

因此,您需要使用requests.post() 函数而不是requests.get()

例如:

r = requests.post("https://logs.company.net/daily-2017.04.13/_search?pretty",
                  data=json_string,
                  auth=(self.username, self.password),
                  proxies=proxies,
                  verify=False)

【讨论】:

感谢 Laurent 我对此感到有些困惑,因为我在网上看到了仍然使用 get() 发送数据的示例。不幸的是,改变它仍然会导致超时。 @OnMyWayToGodDontKnow:代理或远程服务器是否超时? 代理超时。我想知道它是否可能与此有关:***.com/a/8816739/2765131

以上是关于使用代理的 http GET - Curl 命令有效,但 python“请求”库不的主要内容,如果未能解决你的问题,请参考以下文章

Linux curl 命令模拟 POST/GET 请求

5.linux进价命令curl和jq

Linux curl 命令模拟 POST/GET 请求

Shell 命令 curl 和 wget 使用代理采集网页的总结大全

Linux命令发送Http GET/POST请求

libcurl get和post的区别