很多人問寫爬蟲用什麼語言比較好,其實就和談戀愛一樣,沒有最好的,只有最合適的,選擇你最熟悉最順手的語言就好。今年各種需求不斷,寫了幾個爬蟲,都是用的 nodejs。
這裡總結一些用 nodejs 寫爬蟲的常用手段,學會了,就能爬取大部分網頁了。開發爬蟲的技巧很多也是復用的,記錄下來,日後能省不少事。
基本請求網頁方法
用 got 發送 Get 和 Post 請求,返回值均為 Promise,可以使用 async/await 和 Promise.all 來控制流程。
偽裝瀏覽器
通過設置 User-Agent 來模擬瀏覽器行為。現在很多伺服器都會檢查 User-Agent 來進行初步的反爬,設置 User-Agent 是很重要的一步。
也可以通過下面的方式,來為每個請求帶上 User-Agent,當然其他參數也是一樣的。
取消自動重定向
這裡要說明一點,got 默認會自動進行重定向,並返回重定向後的返回值,而部分網站需要處理動態的 Cookie 才能得到正確的結果,自動重定向可能會使用不正確的 Cookie 導致結果永遠不對,因此還是老老實實手動重定向吧。
獲取特定 Cookie 的值
Cookie 通常用於用戶的身份鑑別,偶爾也用於加密反爬。寫爬蟲經常需要和它打交道,但是讀取 Cookie 的值不是很方便,這裡提供一個方法來簡單地獲取所需要的 Cookie 值,該方法同樣適用於獲取 Set-Cookie 的值。
Sleep
做爬蟲也要講文明,要在不影響對方服務的前提下進行,所以要控制爬蟲的速率。但是 nodejs 本身並沒有像 python 那樣的 time.sleep() 方法,因此要自己實現一個。
頁面解析
可以使用正則表達式來解析頁面,比任何解析器都要強大。
想學習和在線測試正則表達式,強烈推薦到 RegExr,全是簡單的英文,很好懂。
除了正則,npm 上有很多做 HTML 解析的包,最常用也最多人用的就是 cheerio。
用法很簡單,和 jquery 一摸一樣。
當然,你也可以用 jquery,只不過需要 mock window 和 document 對象,所以需要配合 jsdom 來食用。
使用代理
使用爬蟲經常會碰到 IP 被封的情況,各種原因,要看具體的反爬機制,要是不幸中招,就需要使用代理來換一個 IP 繼續爬。此外,一些國外網站可能被 GFW 阻擋,導致無法訪問,如:P站,這時候就要使用科學上網,同樣需要通過代理的方式進行。
教你科學上網:程式設計師必備:正確的科學上網方式
got 有一個 agent 參數,配合 tunnel 可以實現代理。
多進程並行爬取
javascript 是單線程的,nodejs 因此也一樣,但是現在普遍多核的大背景下,nodejs 早就意識到了這點,為了能夠充分的「壓榨」機器的性能,nodejs 推出一個內置模塊 – cluster。沒錯,單機集群,由一個父進程管理一群子進程。
這樣就可以通過多個子進程的方式來實現並行爬取。
內容不多,但是非常實用,至少我自己在日常開發爬蟲的過程中經常使用,希望對各位有幫助吧。