記python開發網絡爬蟲所遇問題

最近幾天一直在寫網絡爬蟲,用的是python,圖的是方便省事,不過中間確實遇到過幾次讓人頭疼的問題,現記錄如下:


一.建立網絡鏈接的問題

使用的是python提供的urllib2模塊,用urllib2.urlopen()函數建立鏈接,該函數拋錯率高,還可能不響應,因此要設定timeout,並使用try except else來容錯。


二.從鏈接中讀取數據的問題

使用urlopen獲得response後,調用respons.read()讀取網頁數據,這也是程序假死的罪魁禍首之一,更無奈的是該函數不接受timeout參數,導致線程直接卡死在這兒,並且python不像ruby一樣直接支持函數的timeout寫法,因此這個問題很棘手,目前尚未解決。

今天看來可能不是read函數出問題,還是出在print上面。一個解決方法是主程序將需要爬的url列表分成若干份,每次創建多線程去讀取其中一份並將數據記錄下來,如此依次解決掉所有的url。不算完美,但還是一個較容易實現的記錄中間結果的辦法。


三.多線程問題

爬數據當然要用到多線程,比如threading模塊,多線程最要注意的就是死鎖現象,但是在只使用了一把鎖的情況下依然出現了,查了半天,發現極大可能是臨界區中的print函數造成的。按理說print應該是時間片佔用,到時間了該自動釋放,但事實卻是它造成了死鎖(不算很嚴密的驗證過),將print從臨界區移除後死鎖現象消失了,但是爲什麼會這樣不太理解。

今天又出現了數次類似現象,都是線程在做pinrt操作時,沒有完成,並且一直卡在那,並且還是在非臨界區。難道python的print和多線程真有衝突?如果是這樣只有採用寫log文件的方法了。


四. 編碼問題

從網頁上面爬下來的內容編碼常常特別混亂,即使網頁上的charset寫明是某種編碼,如'gb2312',也往往不太可靠,用python進行String的decode操作時常常出錯,尤其是要把其中部分內容放入數據庫時。

一種做法是採用decode函數的 'ignore' 參數,這樣可以忽略網頁上的小部分亂碼,避免一顆老鼠屎壞一鍋湯的問題。但是很可能做完parsing以後要把結果存入DB,這時這些內容很可能亂碼,即使你把內容輸出到屏幕時是正常的。針對這種情況,我的一個經驗是利用剪貼板,比如你把結果都寫入到 result.txt 文件,然後新建一個 true_result.txt 文件,並且把 result.txt 文件裏面的內容複製粘貼過來,通過這個過程,不規範的亂碼被去除了,剩下乾淨的編碼,然後存入Database。

發佈了23 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章