手把手教你寫網路爬蟲(5):PhantomJS實戰

發表於2018-05-06

大家好!從今天開始,我要與大家一起打造一個屬於我們自己的分散式爬蟲平臺,同時也會對涉及到的技術進行詳細介紹。大家如果有什麼好的想法請多留言,多提意見,一起來完善我們的爬蟲平臺。在正式介紹平臺之前,先用一些篇幅對基礎篇做一點補充。模擬滾動

這次的目標是爬一個眾籌網站的所有專案,專案列表頁如下:https://www.kaistart.com/project/more.html。開啟後進行分析,頁面顯示出10個專案:

如果想看到更多專案,並不能像網易雲音樂那樣點“下一頁”翻頁,而是需要向下拉滾動條或者向下滾動滑鼠滾輪來觸發非同步請求。爬蟲該如何應對這種情況呢?我們可以使用selenium的api執行js程式碼將螢幕內容滾動到指定位置。

下面這段程式碼會一直向下滾動專案頁,一直到滾不動為止:

scrollTo() 方法可把內容滾動到指定的座標:

引數 描述
xpos 必需。要在視窗文件顯示區左上角顯示的文件的 x 座標。
ypos 必需。要在視窗文件顯示區左上角顯示的文件的 y 座標。

這裡用到了scrollHeight,它和ClientHeight還有OffsetHeight有什麼區別呢?

offsetHeight: 包括內容可見部分的高度,border,可見的padding,水平方向的scrollbar(如果存在);不包括margin。

clientHeight: 包括內容可見部分的高度,可見的padding;不包括border,水平方向的scrollbar,margin。

scrollHeight: 包括內容的高度(可見與不可見),padding(可見與不可見);不包括border,margin。

Chrome

程式碼寫好了,接下來就用selenium+phantomJs大法實驗一下!滾到底後把專案列表提取出來看一下:

程式執行結束後,顯示proje_list裡面只有25個元素,而我們自己手動滾的話卻有100多個,明顯有bug。想定位這個問題很簡單,截圖即可,看看為什麼停在第25個專案。對,phantomJs雖然沒有圖形介面,但是可以截圖。

這樣就會把圖片儲存在專案目錄,開啟看看:

發現專案頁只能顯示一行,這說明網頁不相容phantomJs,這倒不是什麼新鮮事,換一個瀏覽器試試唄。第一期介紹過,selenium是支援所有主流瀏覽器的。比如換成Chrome,只需改一行程式碼:

再次執行程式,不出所料,Chrome瀏覽器彈出來,不僅能夠正確顯示頁面,還一直在滾動:

專案全都刷出來了,想爬什麼就爬吧!什麼?你問我在Linux伺服器上怎麼爬?純命令列的那種嗎?

虛擬X Server

PhantomJs是無介面瀏覽器,可以在Linux伺服器上正常執行,但Chrome會在呼叫GUI介面時報錯。既然Linux伺服器沒有圖形介面服務,也就是X Server,我們就要虛擬出來一個,才能讓Chrome正常執行。於是找到了Xvfb(X virtual frame buffer),它可以用來作為完整X服務程式的替代。Xvfb有一個Python的封裝叫PyVirtualDisplay,我們就用它來解決這個問題。

安裝:

pip install pyvirtualdisplay

用法:

執行程式後列印出了baidu的頁面內容,現在可以完美執行Chrome了。需要補充的是,在Linux上執行Chrome需要額外安裝一個ChromeDriver,比較簡單,就不詳細介紹了。

分散式系統

既然我們要打造自己的分散式爬蟲平臺,就要先知道什麼是分散式系統,百度百科是這樣定義的:

分散式系統(distributed system)是建立在網路之上的軟體系統。正是因為軟體的特性,所以分散式系統具有高度的內聚性和透明性。因此,網路和分散式系統之間的區別更多的在於高層軟體(特別是作業系統),而不是硬體。內聚性是指每一個資料庫分佈節點高度自治,有本地的資料庫管理系統。透明性是指每一個資料庫分佈節點對使用者的應用來說都是透明的,看不出是本地還是遠端。在分散式資料庫系統中,使用者感覺不到資料是分佈的,即使用者不須知道關係是否分割、有無副本、資料存於哪個站點以及事務在哪個站點上執行等。

這個定義不太好理解,看看書上怎麼說。《分散式系統概念與設計》一書中對分散式系統做了如下定義:

分散式系統是一個硬體或軟體元件分佈在不同的網路計算機上,彼此之間僅僅通過訊息傳遞進行通訊和協調的系統。

《分散式系統原理和範型》一書中是這樣定義分散式系統的:

分散式系統是若干獨立計算機的集合,這些計算機對於使用者來說就像是單個相關係統。

簡單來說就是一群獨立計算機集合共同對外提供服務,但是對於系統的使用者來說,就像是一臺計算機在提供服務一樣。分散式意味著可以採用更多的普通計算機(相對於昂貴的大型機)組成分散式叢集對外提供服務。計算機越多,CPU、記憶體、儲存資源等也就越多,能夠處理的併發訪問量也就越大。

從分散式系統的概念中我們知道,各個主機之間通訊和協調主要通過網路進行,所以,分散式系統中的計算機在空間上幾乎沒有任何限制,這些計算機可能被放在不同的機櫃上,也可能被部署在不同的機房中,還可能在不同的城市中,對於大型的網站甚至可能分佈在不同的國家。但是,無論空間上如何分佈,一個標準的分散式系統應該具有以下幾個主要特徵:

透明性

系統資源被所有計算機共享。每臺計算機的使用者不僅可以使用本機的資源,還可以使用本分散式系統中其他計算機的資源。

同一性

系統中的若干臺計算機可以互相協作來完成一個共同的任務,或者說一個程式可以分佈在幾臺計算機上並行地執行。

通訊性

系統中的計算機都可以通過通訊來交換資訊。

下一步

今天先了解下基本概念,熱熱身。整個系統的架構及流程留到下次一起奉上。下期再見!

相關文章