Python爬蟲小技巧(頁面解析,多進程,模擬瀏覽器,錯誤處理等)

本博文總結一些常用的爬蟲小技巧,不涉及任何爬蟲框架,適用於爲科學研究或者教育目的而從互聯網上爬取少量數據,內容較爲粗略,僅從較高抽象層次進行說明,涉及的模塊使用方法或者代碼實現可以另行搜索其他相關資料參考。

 

數據需求分析

首先,要明確實驗項目需要哪些數據,例如電商網頁中的商品名字、商品價格或者社交網站中的評論標題、評論發表時間等。

網頁結構分析

根據上一步的數據需求分析結果,分析含有所需數據的網頁的結構,看一下是否有固定的存在格式或者請求方式,就是要發現規律。

網頁內容獲取

推薦使用requests包,其中常用的參數有headers,timeout(connect timeout和read timeout),proxy。

  • 對於headers可以通過瀏覽器(chrome)的Network面板獲取Request Headers,如下圖所示:

  • headers中的cookies設置以及更新,請查閱其他資料,本文不做介紹,headers中的user-agent可以區網絡上搜集幾個,也可以使用random-user-agent包隨機生成,然後隨機替換着使用。
  • timeout包括連接超時和讀取超時,建議設置一個合理的閾值,如果只傳一個值,則該值同時爲連接超時和讀取超時時間,如果傳入一個元組,則可以爲兩種超時分別設置時間。
  • proxy,如果你需要代理,以字典形式傳入,例如proxies={"http": "234.122.9.1:4897"}

網頁內容解析

使用requests獲取內容後推薦使用BeautifulSoup和lxml包進行頁面內容解析,當頁面的結構的一致性程度高時推薦使用lxml配合xpath,當然也可以使用BeautifulSoup(例如獲取表格或列表等內容);內容非結構化程度高,推薦使用BeautifulSoup和正則表達式。

異常處理

可以先使用for循環寫一段爬蟲代碼,然後運行一小段時間,看看是否有bug造成大量異常,根據異常信息,進一步完善,不要苛求不出一點異常,差不多完善的時候,開啓日誌打印,並且將錯誤信息單獨記錄在日誌文件,最後將日誌文件中的異常進行統一處理,確保程序不會因爲偶發異常而出現運行錯誤,同時建議以追加的方式分批將數據寫入本地,提高效率的同時,確保數據不會因意外異常而全部未保存,此處推薦try...except、traceback、logging包一起使用。

多進程

當爬蟲代碼跑起來沒什麼大問題時,查看一下速度如何,如果獲取完全部數據需要的時間太長,建議使用Python的多進程,推薦multiprocessing模塊,如果在多進程處理中涉及文件的寫入,可以配合該模塊pool函數的callback參數,確保寫入的順序不會亂套,也避免了加各種鎖,可以參考博文《Python多進程寫入同一文件》,配合多進程的爬蟲一般明顯提升爬取速度。

處理網站的反爬蟲

如果在代碼層面很難處理網站的反爬蟲策略,那麼最後迫不得已可以使用selenium模擬瀏覽器行爲,也可以同時配合使用多進程,這種方式比較耗費資源,並且效率較低,好好分析網站和想想辦法避免被反爬蟲,實在不行再用這種方式。

 

上述內容僅爲個人使用經驗的總結,後續會持續更新,不免會有遺漏或者錯誤,請各位在評論中不吝賜教,共同學習和進步。

 

 

 

 

 

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