HTTPS 请求在没有 headers 和 Python 的请求的情况下发送

HTTPS requests are sent without headers with Python's Requests

我正在编写一小段代码以从网页中获取数据,目前我使用 HTTP/HTTPS 代理。请求是这样创建的:

headers = {'Proxy-Connection': 'Keep-Alive',
       'Connection':None,
       'User-Agent':'curl/1.2.3',
       }
r = requests.get("https://www.google.es", headers=headers, proxies=proxyDict)

一开始HTTP和HTTPS都不行,请求后代理返回403。我可以使用 curl 执行 HTTP/HTTPS 请求,使用 apt-get 获取包或浏览网页也很奇怪。查看 Wireshark,我注意到 curl 请求和 Requests 请求之间存在一些差异。将 User-Agent 设置为伪造的 curl 版本后,代理立即让我执行 HTTP 请求,所以我假设代理过滤器请求由 User-Agent.

所以,现在我知道为什么我的代码失败了,而且我可以执行 HTTP 请求,但是代码总是因 HTTPS 而失败。我以与 HTTP 相同的方式设置 headers,但是在查看 Wireshark 后,CONNECT 消息中没有发送 headers,因此代理看不到 User-Agent 和 returns拒绝访问响应。

我认为如果我可以发送带有 CONNECT 消息的 headers,我可以轻松地执行 HTTPS 请求,但是我正在思考如何告诉 Requests 我想发送 headers.

好的,所以我看了http.client之后找到了一个方法。它比使用 Requests 级别低一点,但至少它有效。

def HTTPSProxyRequest(method, host, url, proxy, header=None, proxy_headers=None, port=443):
    https = http.client.HTTPSConnection(proxy[0], proxy[1])
    https.set_tunnel(host, port, headers=proxy_headers)
    https.connect()
    https.request(method, url, headers=header)
    response = https.getresponse()
    return response.read(), response.status

# calling the function
HTTPSProxyRequest('GET','google.com', '/index.html', ('myproxy.com',8080))