第一個問題:JS加密如何突破

(1) 熟練掌握Chrome的開發者工具的各個功能,Elements, Network,Source

(2) 認真觀察,善於思考。Network查看載入流程,找可疑的xhr請求,設置xhr斷點,通過Call Stack 回溯js執行過程,邊回溯邊查看上下文代碼。能讀懂js,知道js的相關知識,比如js裡面的window變數。

(3) 以上是通過debug js找到js加密解密的代碼,然後通過Python重新實現,這個過程很長,可能耗費你幾天的時間,一旦網站改變一下js演算法你的Python實現就不能用了。

(4) 用Selenium可簡單突破,並且網站隨便該都無所謂。唯一遺憾的是,Selenium的運行效率較差。但是,作為一個能用js加密來保護數據的網站,單價的運行效率應該足以滿足網站的訪問頻率限制。這時候,更多的思考是如何增加資源(IP、賬號)來提高抓取效率。

第二個問題、多線程、協程,多進程的選擇

(1)爬蟲是IO密集型任務,大部分時間花在網路訪問上,所以多進程不適合網路爬蟲,而多線程、非同步IO協程更適合,而非同步IO是最適合的,它相比多線程,協程間的切換代價更小,我們提倡使用非同步IO而非多線程。非同步IO的模塊主要是:aysncio, aiohttp, aiomysql 等。

(2)網頁爬下來後從中提取想要的數據是CPU密集型的,這時候可以用多進程並發提取。

(3)我們推薦的爬蟲策略是,爬蟲只管爬,把爬下來的html保存起來,存到資料庫。然後單獨寫提取數據的提取器,單獨運行提取器。好處是,提取不影響爬取,爬的效率更高,並且提取程序可以隨時修改,有新的提取需求時不需要重新抓取。比如,最初寫爬蟲時只想提取網頁中的兩項數據,運行一段時間後,發現另外3項數據也很有用,如果保存了html,只需改改提取器重新跑一遍就好了。

第三個問題、如果想要保留加粗或者圖片原始位置,只能通過挖掘規律再寫正則表達式來針對性處理嗎?

網頁數據提取主要兩種方法:正則表達式,xpath。通過xpath可以獲得某個html標籤節點。比如,一篇blog網頁,它的主體內容都在某個標籤裡面,可能是某個div。用xpath得到這個div,轉換為html,就是包含了格式及其圖片的部分,你保存這段html代碼而非純文本就好了。

第四個問題、爬蟲的增量爬取、斷點續爬、去重等

(1)通過網址池的概念去管理所有的URL

(2)增量爬取就是不重複下載已經下載過的,讓網址池記住那些已經下載過的URL;

(3)斷點續爬,就是上次還沒有爬取的URL這次接著爬,還是讓網址池記住那些還沒被爬取的URL

(4)爬蟲的去重,讓網址池記錄URL的狀態以避免重複爬取。

第五個問題、爬蟲的部署問題,在公司是不是分散式爬蟲系統比較多會涉及部署問題

爬蟲的部署,不一定是分散式的。大規模的爬蟲,突破了目標網站限制的爬蟲才會涉及到分散式,分散式的好處是抓取速度提高,但是管理會比較複雜。

第六個問題、網頁的自動解析?這個話題就包含很多子任務了: 怎麼自動抽取文章的內容,如何處理各種各樣的時間格式,怎樣處理翻頁

(1)文章內容的提取,基本的是每種網頁建立一個提取模板(正則表達式),好處是提取精準,壞處是工作量大,一旦稍微改版就失敗。通過演算法建立單一提取程序,基本上都可以提取,但是可能會有寫雜質,比如文末的相關閱讀。好處是,一勞永逸,不受改版限制。

(2)時間的提取,除了正則表達式之外似乎沒有特別有效的方法。

(3)翻頁的話,如果只是抓取,把該頁的url提取出來繼續抓;如何在提取內容時要把多頁內容合併成一個網頁,那就要特別處理。

第七個問題、爬新聞類的網站時,如何做好同一新聞,各網站相互轉載,爬取時文本去重

比較著名的演算法是,Google的simhash,但具體實踐中比較複雜。網傳百度的做法是把文章的最長一句話(或多句)做hash,這個hash值就是文章的唯一性代表(指紋),這個方法準確率很高,但是召回率比較低,一旦這最長的幾句話改一個字就不能召回;我改進了該方法,對n句最長的話分別做hash,一個文章由n個指紋(如圖人的是個指頭指紋都不一樣)確定唯一性。準確率和召回率都還不錯。

第八個問題、非同步爬蟲的設計

(1)一個好的URL管理策略,見猿人學上的網址池相關文章;

網址池是一個「生產者-消費者」模型,爬蟲從中取出url去下載,下載的html中提取新的url放入池中,告訴url池剛才拿出的url是否下載成功;再從池中取出url進行下載。。。url池是核心部件,它記錄url的不同狀態:

(a)下載成功

(b)下載失敗n次

(c)正在下載

每次往池子添加url時都要檢查url在池中的狀態,避免重複下載。


爬蟲其實是一個非常複雜的系統,第一個問題通常就是數據的獲取,如何構造請求,是一個大問題,其次呢服務端要能提供良好的可擴展性,容錯性,還要能保證海量數據的存儲和去重,語言本身並沒有什麼問題,祝你好運


本文檔對日常學習中用 python 做數據爬取時所遇到的一些問題做簡要記錄,以便日後查閱,部分問題可能因為認識不到位會存在一些誤解,敬請告知,萬分感謝,共同進步。

https://blog.csdn.net/qq_23869697/article/details/80034998

搬磚


主要還是怎麼應對反爬手段。


推薦閱讀:
相关文章