中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-06-20 12:26:57 來源:網絡 閱讀:246 作者:Lickm 欄目:編程語言

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

 

模擬滾動

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

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

 

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

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

 

下面這段代碼會一直向下滾動項目頁,一直到滾不動為止:

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

# 一直滾動到最底部js1 = 'return document.body.scrollHeight'js2 = 'window.scrollTo(0, document.body.scrollHeight)'old_scroll_height = 0while browser.execute_script(js1) >= old_scroll_height:
    old_scroll_height = browser.execute_script(js1)
    browser.execute_script(js2) 
    time.sleep(1)

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

 

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

參數

描述

xpos

必需。要在窗口文檔顯示區左上角顯示的文檔的 x 坐標。

ypos

必需。要在窗口文檔顯示區左上角顯示的文檔的 y 坐標。

 

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

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

 

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

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

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

 

Chrome

代碼寫好了,接下來就用selenium+phantomJs大法實驗一下!滾到底后把項目列表提取出來看一下:

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

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"]')

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

 

程序運行結束后,顯示proje_list里面只有25個元素,而我們自己手動滾的話卻有100多個,明顯有bug。想定位這個問題很簡單,截圖即可,看看為什么停在第25個項目。對,phantomJs雖然沒有圖形界面,但是可以截圖。

browser.save_screenshot(debug.png')

 

這樣就會把圖片保存在項目目錄,打開看看:

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

 

發現項目頁只能顯示一行,這說明網頁不兼容phantomJs,這倒不是什么新鮮事,換一個瀏覽器試試唄。第一期介紹過,selenium是支持所有主流瀏覽器的。比如換成Chrome,只需改一行代碼:

browser = webdriver.Chrome()

 

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

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

 

項目全都刷出來了,想爬什么就爬吧!什么?你問我在Linux服務器上怎么爬?純命令行的那種嗎?

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

 

虛擬X Server

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

安裝:

pip install pyvirtualdisplay

用法:

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

from selenium import webdriverfrom 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()

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

 

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

 

分布式系統

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

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

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

分布式系統是一個硬件或軟件組件分布在不同的網絡計算機上,彼此之間僅僅通過消息傳遞進行通信和協調的系統。

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

分布式系統是若干獨立計算機的集合,這些計算機對于用戶來說就像是單個相關系統。

 

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

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

透明性

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

同一性

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

通信性

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

 



最后,初學者進階的福音

想學習,基礎不夠?沒關系,我們提供免費提供VIP基礎學習課程,讓你快速入門,掌握Python!

 

有基礎的小伙伴想學習項目實戰?沒問題,每晚八點都有博士大牛帶你學習操作項目!

 

只要你有一顆想學習的心,我們隨時歡迎~


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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

莱西市| 恩平市| 贵州省| 津南区| 漯河市| 临海市| 巢湖市| 玉田县| 台山市| 吴桥县| 瓮安县| 通河县| 台北县| 平阴县| 仁布县| 通辽市| 巧家县| 镇宁| 洮南市| 含山县| 米脂县| 德惠市| 吉安县| 射洪县| 册亨县| 黎平县| 青海省| 天祝| 漳州市| 栾川县| 闽清县| 竹山县| 潜山县| 乾安县| 山西省| 阿克苏市| 武山县| 封丘县| 霍山县| 昌宁县| 麻城市|