一個關於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 或者程序語言寫過哪些好玩或者實用的小應用?
※一個比較理想的分散式爬蟲架構是怎樣的?