Python 寫的爬蟲爬久了就假死怎麼回事?

自己做一個網址過濾,爬久了就假死了,後來把每一個urlopen全部都加上了timeout
還是會假死,自己windbg調試了下python進程,大概都是在ZwWaitForMultipleObjects函數裡面,已經進入0環了。等待對象是三個timer類型的句柄。

有人知道怎麼回事么 。
內存當然不存在什麼泄露的情況。

就是感覺python裡面哪裡沒處理好一樣————或者我自己寫的不好。

對了,每次urlopen都會有user-aget的添加。 感覺添加前和添加後的速度對比明顯不是一個檔次,不知道有沒有這個原因。


socket中添加一個超時 應該就能解決了:

import socket
socket.setdefaulttimeout(timeout)

建議看一下gevent,可以應用到爬蟲中,gevent可以將系統socke全部patch成非阻塞的
你可以同時維持N個連接,這樣速度也會提高很多


你可以根據日誌查一下,看看程序再抓哪些頁面的時候死了,再分析一下為什麼死。有些網站為了防止爬蟲會採取一些措施,比如給你設計一個鏈接,你打開這個鏈接後跳到另一個頁面,這個頁面上還有一個鏈接,又鏈接到原來的頁面,如果處理不好爬蟲就在這死了。還有就是有些跳轉會對爬蟲有些干擾。其他的話有可能有些網站為了防止爬蟲,直接返回403也有可能。
具體原因不清楚,但是你可以採取一些措施來避免。
比如你可以設計一個像硬體看門狗電路一樣的程序,正常情況下,每隔一段時間就「喂狗」,當程序假死後,狗餓了,就會回來「咬你一口」,其實就是讓程序複位啦。你如果是多進程的話,可以沒隔一段時間給一個監控進程發信號,當監控進程收不到信號的時候就說明那個程序死了,然後強制終止爬蟲進程,再開啟一個新爬蟲進程繼續。


寫爬蟲不建議使用urllib2,以前自己用遇到過莫名其妙的假死,而且不支持 keep-alive 速度暴慢。大型的可以用scrapy框架也可以自己造輪子用 gevent,twisted 。小型的可以用requests。


求助,要幫別人爬8000多個記錄嗎,現在每次爬到幾百個就假死了。。


推薦閱讀:

TAG:Python | 爬蟲計算機網路 | Python框架 |