2016-02-09 45 views
0

我正在編寫一個小片段來從網頁中獲取數據,而我目前正在使用HTTP/HTTPS代理。請求是這樣創建的:HTTPS請求發送時沒有包含Python請求的頭文件

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

好的,所以我看了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)) 
相關問題