本博文總結一些常用的爬蟲小技巧,不涉及任何爬蟲框架,適用於爲科學研究或者教育目的而從互聯網上爬取少量數據,內容較爲粗略,僅從較高抽象層次進行說明,涉及的模塊使用方法或者代碼實現可以另行搜索其他相關資料參考。
數據需求分析
首先,要明確實驗項目需要哪些數據,例如電商網頁中的商品名字、商品價格或者社交網站中的評論標題、評論發表時間等。
網頁結構分析
根據上一步的數據需求分析結果,分析含有所需數據的網頁的結構,看一下是否有固定的存在格式或者請求方式,就是要發現規律。
網頁內容獲取
推薦使用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模擬瀏覽器行爲,也可以同時配合使用多進程,這種方式比較耗費資源,並且效率較低,好好分析網站和想想辦法避免被反爬蟲,實在不行再用這種方式。
上述內容僅爲個人使用經驗的總結,後續會持續更新,不免會有遺漏或者錯誤,請各位在評論中不吝賜教,共同學習和進步。