使用Python的请求发送HTTPS请求时没有标头

时间:2016-02-09 09:28:09

标签: python https http-headers python-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请求和请求请求之间存在一些差异。将User-Agent设置为假curl版本后,代理会立即让我执行HTTP请求,因此我认为User-Agent的代理过滤请求。

所以,现在我知道为什么我的代码失败了,我可以做HTTP请求,但代码继续使用HTTPS失败。我使用与HTTP相同的方式设置标头,但在查看Wireshark后,CONNECT消息中没有发送标头,因此代理看不到User-Agent并返回ACCESS DENIED响应。

我认为,如果我只能使用CONNECT消息发送标头,我可以轻松地执行HTTPS请求,但是我要知道如何告诉请求我要发送标头。

1 个答案:

答案 0 :(得分:0)

好的,所以我在查看http.client之后找到了一条路。它比使用请求稍低,但至少它可以工作。

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))