一個關於python3 requests庫使用代理訪問IP查詢網站的問題?

前兩天寫了個抓取代理池的爬蟲,驗證代理有效性的思路是requests帶proxies參數訪問http://ip.cip.cc/,將響應與真實IP進行對比,如果不一樣就有效。

代碼如下(循環,判斷省略):

import requests

proxy = {"HTTP": "HTTP://59.49.129.60:8998"}

r = requests.get("http://ip.cip.cc/", proxies=proxy)

print(r.text)

輸出結果是我的真實IP:170.80.*.*

結果驗證的IP沒一個有效的,重複幾次之後開始懷疑人生。下面是我的探索過程:

複製了一個IP代理設置到瀏覽器裡面,再拿瀏覽器訪問http://ip.cip.cc/z,得到的結果是代理IP的地址,訪問其它網頁的時候能明顯感覺到設置代理的延時,這證明該代理是可用的。然後單獨把這個代理IP設置到代碼裡面驗證,結果還是不行。

想請教一下究竟是我代碼有問題,還是我的系統哪的設置有問題?

這個是瀏覽器設置上面代理之後的結果

設置過程

python版本3.6,系統win10

照著十四大大的在edge瀏覽器裡面設置該代理之後訪問了一下,右邊是firefox的訪問結果


解決方案:

1:完整查看你發出的請求信息,帶代理ip去請求這個網址:https://httpbin.org/get?show_env=1

2:檢查是匿名代理還是透明代理:從請求信息中看X-Forwarded-For: "***.7.*9.8",欄位,

如果該欄位僅為你真實IP地址,則說明代理不起效果

如果該欄位僅為代理IP地址,則說明為高度匿名代理

如果該欄位為 "代理IP地址,真實ip地址",則說明為透明代理

關於代碼,請參考:luyishisi/Anti-Anti-Spider

我寫過有3種更換ip的方式,應該可以幫到你


這個問題大概是這樣的,這些有代理IP的網站我猜想是通過Nmap: the Network Mapper 等工具掃描來的。

有漏洞的企業的運維,自己也會掃描,會補上漏洞的。

等你使用的時候,可能已經被補上漏洞,所以你檢測的代理不可用。

代理還分高匿和透明。

透明代理會顯示的是http發起者的ip地址。

用Python 代碼或http 工具發起的http 返回的都是我電腦的IP,說明這個59.49.129.60:8998

代理是一個透明代理。


翻了邊官方文檔,總算找到問題了,proxies這個字典的鍵「http"要小寫。並且win10edge設置的是全局代理,其它的應用也會使用,而firefox恰好設計的是不使用全局代理。想到為了好看,我才特意把http大寫,真是自作孽,不可活……

這讓我情不自禁地想起了之前裝mysql的時候,生成的password裡面的字母究竟是0還是o還是O。


推薦閱讀:

同一域名下同一性質部分網頁無法爬蟲,請問是什麼原因造成的,應該如何處理?
關於python返回裝飾後函數的結果?
如何用 Python 爬取社交網路(如微博)?
你用 Python 或者程序語言寫過哪些好玩或者實用的小應用?
一個比較理想的分散式爬蟲架構是怎樣的?

TAG:Python | 爬蟲計算機網路 | requests |