1. 程式人生 > >手把手教你寫網路爬蟲(5):PhantomJS實戰

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

有需要Python學習資料的小夥伴嗎?小編整理【一套Python資料、原始碼和PDF】,感興趣者可以加學習群:548377875或者加小編微信:【mmp9972】反正閒著也是閒著呢,不如學點東西啦~~

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

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

1

2

3

4

5

6

7

8

# 一直滾動到最底部

js1 = 'return document.body.scrollHeight'

js2 = 'window.scrollTo(0, document.body.scrollHeight)'

old_scroll_height = 0

while browser.execute_script(js1) >= old_scroll_height:

    old_scroll_height = browser.execute_script(js1)

    browser.execute_script(js2)

    time.sleep(1)

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大法實驗一下!滾到底後把專案列表提取出來看一下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

browser = webdriver.PhantomJs()

url = 'https://www.kaistart.com/project/more.html'

try:

    browser.get(url)

    wait = ui.WebDriverWait(browser, 20)

    wait.until(lambda dr: dr.find_element_by_class_name('project-detail').is_displayed())

    # 一直滾動到最底部

    js1 = 'return document.body.scrollHeight'

    js2 = 'window.scrollTo(0, document.body.scrollHeight)'

    old_scroll_height = 0

    while browser.execute_script(js1) >= old_scroll_height:

        old_scroll_height = browser.execute_script(js1)

        browser.execute_script(js2)

        time.sleep(1)

    sel = Selector(text=browser.page_source)

    proj_list = sel.xpath('//li[@class="project-li"]')

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

1

browser.save_screenshot(debug.png')

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

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

1

browser = webdriver.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

用法:

1

2

3

4

5

6

7

8

9

10

from selenium import webdriver

from pyvirtualdisplay import Display

display = Display(visible=0, size=(800, 600))

display.start()

driver = webdriver.Chrome()

driver.get("http://www.baidu.com")

print (driver.page_source.encode('utf-8'))

driver.quit()

display.stop()

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

分散式系統

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

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

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

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

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

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

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

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

透明性

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

同一性

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

通訊性

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

有需要Python學習資料的小夥伴嗎?小編整理【一套Python資料、原始碼和PDF】,感興趣者可以加學習群:548377875或者加小編微信:【mmp9972】反正閒著也是閒著呢,不如學點東西啦~~

相關推薦

手把手網路爬蟲5PhantomJS實戰

有需要Python學習資料的小夥伴嗎?小編整理【一套Python資料、原始碼和PDF】,感興趣者可以加學習群:548377875或者加小編微信:【mmp9972】反正閒著也是閒著呢,不如學點東西啦~~ 如果想看到更多專案,並不能像網易雲音樂那樣點“下一頁”翻頁,而是

手把手網路爬蟲2迷你爬蟲架構

語言&環境 有需要Python學習資料的小夥伴嗎?小編整理【一套Python資料、原始碼和PDF】,感興趣者可以加學習群:548377875或者加小編微信:【mmp9972】反正閒著也是閒著呢,不如學點東西啦~~ 語言:帶足彈藥,繼續用Python開路! t

手把手網路爬蟲8徹底解決亂碼問題

字元編解碼是爬蟲裡必學的一項知識,在我們的爬蟲生涯中早晚會爬到亂碼的網頁,與其遇到時驚慌失措,不如早學早好,徹底避免亂碼問題。 字元編碼簡介 什麼是字符集 在介紹字元編碼之前,我們先了解下什麼是字符集。 字元(Character)是各種文字和符號的總稱,包括各國家文字、標點

手把手網路爬蟲1網易雲音樂歌單

Selenium:是一個強大的網路資料採集工具,其最初是為網站自動化測試而開發的。近幾年,它還被廣泛用於獲取精確的網站快照,因為它們可以直接執行在瀏覽器上。Selenium 庫是一個在WebDriver 上呼叫的API。WebDriver 有點兒像可以載入網站的瀏覽器,但是它也可以像BeautifulSoup

爬蟲手把手網路爬蟲1

介紹 什麼是爬蟲? 先看看百度百科的定義: 簡單的說網路爬蟲(Web crawler)也叫做網路鏟(Web scraper)、網路蜘蛛(Web spider),其行為一般是先“爬”到對應的網頁上,再把需要的資訊“鏟”下來。 為什麼學習爬蟲? 看到這裡,有人就要問了:Google、百度等

手把手指令碼引擎——簡單的高階語言3,符號表

手把手教你寫指令碼引擎(五)——簡單的高階語言(3,符號表) 陳梓瀚 華南理工大學軟體本科05級 符號表的結構的複雜度跟語言的語義規則的複雜度有關。對於C#來說,每一個符號都附帶了一大堆資訊,譬如位置啦,所在的namespace啦,型別啦什麼的。對於JavaScript來說,

Android開發之手把手ButterKnife框架

系列文章目錄導讀: 一、概述 JakeWharton我想在Android界無人不知,無人不曉的吧, ButterKnife這個框架就是出自他隻手。這個框架我相信很多人都用過,本系列部落格就是帶大家更加深入的認識這個框架,ButterKnife截至目前

Android開發之手把手ButterKnife框架

系列文章目錄導讀: 一、概述 然後在Processor裡生成自己的程式碼,把要輸出的類,通過StringBuilder拼接字串,然後輸出。 try { // write the file JavaFileObject

Http框架——三個樣例帶深入理解AsyncTask

func implement oncreate 其它 層疊 worker dcl 例如 人員 這個標題大家不要奇怪,扯Http框架怎麽扯到AsyncTask去了,有兩個原因:首先是Http框架除了核心http理論外。其技術實現核心也是線程池 + 模板 +

手把手安卓入門

部落格 學院 下載 GitChat 論壇 寫部落格 發Chat

手把手智慧硬體開發 開關按鈕

第5節 按鈕開關 對於硬體的控制,我們常用硬體開關來控制Arduino開發板上其他外接硬體的通斷邏輯。比如,一盞LED燈,硬體上最好有個開關,按一下開關,就讓LED燈亮,再按一下開關,就讓LED燈關閉。 開關的外形有多種式樣,四根引腳、三根引腳。不論是三引腳

手把手樹莓派3 】裝機

概述 raspberry pi其實可以看做一個微型的計算機,我們可以在上面裝各種作業系統,然後搭建伺服器,當然這只是它的一小點功能罷了。。。與我們常用的PC機不同的是,ras pi有GPIO,我們可以讓raspberry pi來控制這些引腳,從而傳送一些物理訊號給其他的裝置

手把手智慧硬體開發 藍芽傳輸

第4節 藍芽傳輸 智慧硬體基本上都需要和手機相連,然後讓手機控制這些硬體的工作。相連的方式不外乎以下三種, 資料線有線連線,通過一根資料線把智慧硬體和手機連線起來。採用這種方式,需要一個特殊的帶USB HOST功能的擴充套件板; WIFI連線,智慧硬體和手

手把手實現SVM演算法

什麼是機器學習 (Machine Learning)       機器學習是研究計算機怎樣模擬或實現人類的學習行為,以獲取新的知識或技能,重新組織已有的知識結構使之不斷改善自身的效能。它是人工智慧的核心,是使計算機具有智慧的根本途徑,其應用遍及人工智慧的各個領域。 機器學習

【25】手把手響應式佈局

一:佈局方式有如下幾種: 1. 固定佈局:固定佈局以PX(畫素)作為單位的,在PC端,設計稿多少PX就寫多少PX,前幾年都是這種佈局,常見的是以960px或者1000px來設計的,但是這樣設計有如下缺點: 1.1.頁面很死板,在更大的螢幕上,頁面左右2邊留白。 1.2.不適

Http框架

大家都知道,從本質上來說app實際只是整個大系統當中的View層,因為設計優秀的系統中,app基本都不會承擔任何實際的業務邏輯處理,只是負責向用戶展示資料以及從使用者端蒐集使用者資料。而這個資料的一來一去,自然離不開網路通訊協議,而我們用得最多的,自然是這個ht

手把手智慧硬體開發直流馬達

第6節 直流馬達 馬達是我們經常使用到的電動裝置,它可以將電能轉化成動能,驅動其他東西的運動。聽起來很抽象,舉幾個例子吧。 我們小時候玩的四驅車,帶動輪子轉動的那個小裝置就是馬達;夏天讓風扇旋轉帶給我們涼意,也是馬達的功勞。 根據使用電源的不同,可以將

手把手智慧硬體開發 控制LED燈

第3節 控制LED燈 現在我們開始嘗試用程式碼控制一個真正的直觀的硬體裝置。 第一個例子:讓Arduino開發板上的一個LED小燈週期性的開啟、關閉。 第二個例子:讓LED燈亮度逐漸的變亮變暗。 3.1 LED燈的開關 3.1.1 原理介紹

手把手搭建FastDFS叢集

          由於部落格圖片量大,篇幅太長,因此需要分上、中、下三篇部落格來寫,上篇和中篇我們已經一起學習完了,這篇部落格我們一起學習下剩餘部分。 一、配置反向代理        我們需要在兩個跟蹤器上安裝nginx(也就是192.168.156.5和192.168.

手把手智慧硬體開發 從HelloWorld開始

第2節 Hello World 萬事開頭難,這一節我們將寫一個最簡單的程式,讓它在Arduino MEGA開發板上執行起來。 為此,我們需要準備, Arduino MEGA開發板; 一臺開發用的電腦,Window、Linux、MacOS作業系統都可以;