如何處理python爬蟲ip被封?

用python寫的爬蟲,設置了headers,包括host和useragent,設置了cookies,訪問的結果是「訪問過於頻繁,請輸入驗證碼」,但是用瀏覽器訪問怎麼刷新都沒有問題。我認為對方並沒有封IP,否則為何瀏覽器怎麼能訪問呢?我的判斷對么?怎麼解決這個問題?謝謝!
另外,我在windows上使用requests package,裡面有代理功能,就是傳入一個代理ip作為參數,我的方法是找網路上速度很好的代理ip(ping過)作為參數傳入,但是不能用,總是顯示超時,意思是不是說我不能簡單粗暴的把參數傳入,而是應該設置下代理伺服器(自己準備代理伺服器)?


簡單來講,你通過代碼向伺服器發送的請求與瀏覽器向伺服器發送的請求不一樣,所以你可以通過瀏覽器獲取數據,但是無法通過代碼。

首先建議你打開瀏覽器的開發者工具,推薦使用Chrome瀏覽器。選中Network一欄之後重新通過瀏覽器向伺服器發送一次請求,然後,你就可以看到你剛才通過瀏覽器訪問伺服器資源的流程和數據流向。其中,數據流向包括:

  1. 瀏覽器向伺服器發送的請求頭
  2. 瀏覽器向伺服器發送的請求體
  3. (可能)伺服器向瀏覽器發送的重定向地址及瀏覽器重新向新的地址發送請求
  4. 伺服器返回的響應頭
  5. 伺服器返回的響應體

---
你面臨的問題很可能是在模擬瀏覽器發送請求這一步(1、2)。檢查代碼,修復之。

至於解決方案,既然你可以通過瀏覽器訪問,說明你的IP並沒有被伺服器禁封,加上你提到用了requests庫,我猜測你通過requests.Session()來獲取了一個對象或者指定了headers中的Cookie欄位來發送請求。這兩種方法,伺服器都會認為你的多次請求來自同一個客戶端,自然訪問過快之後,伺服器會向此客戶端彈驗證碼(伺服器端通過Session確認某一個用戶,客戶端通過Cookie[中的某一條]告訴伺服器自己是某Session對應的用戶)。

所以,你可以嘗試切換一個新的requests.Session()對象來發送請求。更甚之,你可以通過代理IP,使用代理IP需要注意的是,最好選擇高匿的IP,並在使用前校驗有效性。通過requests使用代理:

import requests

proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}

requests.get("http://example.org", proxies=proxies)

如上~~~


網站根據cookie ip和header其他部分判斷用戶的
可以把你瀏覽器的cookie導入python的爬蟲里,firefox是以資料庫的方式存儲cookie,要用sqlite讀一下,ie是按不同網站分不同文件存儲。
導入對應的cookie之後,如果爬蟲被封,就進對應的瀏覽器填個驗證碼。
這樣可以輪流切換不同的cookie,網站可能會判斷為不同的用戶(douban可以這樣爬)


把header里的數據填充好,應該就沒問題的了。 還有timeout值設置一下,不然過快的訪問也會有問題。

2017-08-10更新。。。

最近在爬安居客的數據,被封了之後用代理ip也是沒用,各種數據都已經填充了,最後返回的404.

proxies={"http": "218.11.84.198:8118"}
s=requests.get(url="https://guyuan.anjuke.com/community/p1/",headers=self.header,proxies=proxies,timeout=10)
print s.status_code
print s.text

代理測試過,可以用的。(存活不會太久)

我用瀏覽器也還是返回404 錯誤,一直無法獲取正確的返回。

好奇對方是用的什麼反扒策略,還是我自己哪裡出錯了。

在線等。


薅羊毛時要記得換羊,別盯著一隻


推薦閱讀:

怎麼用python爬qq空間的說說列表並保存到本地?
假如你有海量的QQ或者sina微博社交數據,能做哪些有趣的事情?
Python 爬蟲如何機器登錄新浪微博並抓取內容?
請問爬蟲如何爬取動態頁面的內容?
如何爬網易雲音樂的評論數?

TAG:爬蟲計算機網路 |