同一域名下同一性質部分網頁無法爬蟲,請問是什麼原因造成的,應該如何處理?

最近在做一個項目,需要爬取某論壇的汽車配置信息,但在用urllib2.urlopen(url)爬取網頁的時候,發現部分配置信息頁獲取失敗,返回錯誤「urllib2.HTTPError: HTTP Error 503: Service Temporarily Unavailable」,加上header之後也如此。

而且今天和昨天返回error的是不同的配置信息頁(也就是偶發性的,昨天讀取失敗的頁面,今天讀取成功了,但是同一天內是讀取失敗相同的配置信息頁)。

用urllib和requests雖然返回結果了,但明顯是錯誤結果。

拜求大神解惑。


503是伺服器錯誤,除非對方發現你是爬蟲了,故意返回錯誤代碼(可能性比較小),否則跟你爬蟲關係不大。解決辦法:

(1)你可以設置重試機制,即當某一次獲取失敗之後,重啟將url放入待抓取隊列。

(2)不建議使用urllib2,建議換為requests。

(3)建議使用一些成熟框架,裡邊會有一些重試機制,以及其他一些sleep、maxdeep機制等。

順便做個宣傳,我自用的Python多線程/協程爬蟲框架:xianhu/PSpider,支持重試機制等,支持自定義抓取、解析、保存流程。


錯誤信息顯示:當時對方網站伺服器有些內部問題。5開頭的錯誤碼都是代碼對方網站伺服器有問題。

所以你在第二天重新嘗試會成功,一般情況下發現5開頭的錯誤碼時,只需要稍後重新嘗試就可以了。這個沒有更好的辦法。

在八爪魚採集器裡面,系統在採集過程中發現此類錯誤會自動重試幾次,如果重試還是不行,則會自動生成一個錯誤報告,告訴你當時採集具體哪個網址時出現了什麼具體問題。並且會有關於錯誤碼的詳細解釋鏈接。點擊就可以看到錯誤原因和常見的處理措施。

我摘錄了八爪魚網站一段關於5、6開頭的錯誤碼的常見分析給你參考:

5、6字頭狀態碼

這類狀態碼代表了被採集網站伺服器在處理請求的過程中有錯誤或者異常狀態發生,請檢查以下幾個方面:

1.被採集網站伺服器崩潰

查看網站或採集的目標網頁是否能訪問,通常是因為網站內部代碼運行出錯、崩潰等原因無法正常訪問,八爪魚也將無法採集數據

部分流量不大的網站,平時沒什麼人訪問,突然訪問量增大,網站伺服器無法負荷崩潰掉了,可以嘗試調整執行前等待,放慢採集速度,訪問慢些也許就不會崩潰,如果不能換網站非要采這個網站只能慢慢采了。

2.被採集網站伺服器不穩定

偶爾可以打開,或者打開較慢,不穩定等問題,可以在打開網頁或點擊元素的高級設置里設置重試。

具體狀態碼詳細解釋如下:

500 Internal Server Error

伺服器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。一般來說,這個問題都會在伺服器端的源代碼出現錯誤時出現。

501 Not Implemented

伺服器不支持當前請求所需要的某個功能。當伺服器無法識別請求的方法,並且無法支持其對任何資源的請求。

502 Bad Gateway

作為網關或者代理工作的伺服器嘗試執行請求時,從上游伺服器接收到無效的響應。

503 Service Unavailable

由於臨時的伺服器維護或者過載,伺服器當前無法處理請求。這個狀況是臨時的,並且將在一段時間以後恢復。如果能夠預計延遲時間,那麼響應中可以包含一個 Retry-After 頭用以標明這個延遲時間。如果沒有給出這個 Retry-After 信息,那麼客戶端應當以處理500響應的方式處理它。

注意:503狀態碼的存在並不意味著伺服器在過載的時候必須使用它。某些伺服器只不過是希望拒絕客戶端的連接。

504 Gateway Timeout

作為網關或者代理工作的伺服器嘗試執行請求時,未能及時從上游伺服器(URI標識出的伺服器,例如HTTP、FTP、LDAP)或者輔助伺服器(例如DNS)收到響應。

注意:某些代理伺服器在DNS查詢超時時會返回400或者500錯誤

505 HTTP Version Not Supported

伺服器不支持,或者拒絕支持在請求中使用的 HTTP 版本。這暗示著伺服器不能或不願使用與客戶端相同的版本。響應中應當包含一個描述了為何版本不被支持以及伺服器支持哪些協議的實體。

506 Variant Also Negotiates

由《透明內容協商協議》擴展,代表伺服器存在內部配置錯誤:被請求的協商變元資源被配置為在透明內容協商中使用自己,因此在一個協商處理中不是一個合適的重點。

507 Insufficient Storage

伺服器無法存儲完成請求所必須的內容。這個狀況被認為是臨時的。WebDAV

509 Bandwidth Limit Exceeded

伺服器達到帶寬限制。這不是一個官方的狀態碼,但是仍被廣泛使用。

510 Not Extended

獲取資源所需要的策略並沒有沒滿足。

600 Unparseable Response Headers

源站沒有返迴響應頭部,只返回實體內容


如果你抓谷歌的話, 用request模擬得再真, 也會被發現是爬蟲, 返回503, 原因是人家對你的滑鼠點擊等行為都有analyse, 最好模擬能解析js的瀏覽器去做, selenium+ xxxxxx隨便什麼都行, 幾點要注意

1. user-agent要隨機, 不要自己亂造

2. 同IP太頻繁, 絕對會被幹掉, 再牛逼的爬蟲也抵不過人家發現你IP流量過大而幹掉你

3. cookie的問題, 能存久一點就久一點,不要反覆登錄或者讓對方新建cookie給你, 同一個cookie的話保持同一請求特徵, 不要跳IP或者ua


第一個問題,正常瀏覽器是否能請求到頁面?如果可以,那就證明你的爬蟲請求構建有問題。

第二個問題,該論壇是否需要cookie,如果需要,是否考慮了使用的cookie過期問題。

第三個問題,也是比較重要的問題,是否使用了代理ip,如果沒有,考慮使用代理,這也是我覺得這個問題的關鍵,爬蟲被禁不止會返回40x,如果使用了,考慮代理時效性。

第四個問題,爬蟲爬取的速率,大部分反爬策略即是基於單位時間內的請求數,如果過快,控制並發數或者任務


補充一種可能:你抓取的參數設置不當,導致伺服器生成這個頁面出錯。


推薦閱讀:

關於python返回裝飾後函數的結果?
如何用 Python 爬取社交網路(如微博)?
你用 Python 或者程序語言寫過哪些好玩或者實用的小應用?
一個比較理想的分散式爬蟲架構是怎樣的?
Python 編碼為什麼那麼蛋疼?

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