我正在编写一个小片段来从网页上获取数据,而我目前正在使用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请求,但是我要知道如何告诉请求我要发送标头。
答案 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))