一、前言 在上一篇博文中,我們的爬蟲面臨著一個問題,在爬取Unsplash網站的時候,由於網站是下拉刷新,並沒有分頁。所以不能夠通過頁碼獲取頁面的url來分別發送網路請求。我也嘗試了其他方式,比如下拉的時候監控http請求,看看請求是否有規律可以模擬。後來發現請求並沒有規律,也就是不能夠模擬http ...
一、前言
在上一篇博文中,我們的爬蟲面臨著一個問題,在爬取Unsplash網站的時候,由於網站是下拉刷新,並沒有分頁。所以不能夠通過頁碼獲取頁面的url來分別發送網路請求。我也嘗試了其他方式,比如下拉的時候監控http請求,看看請求是否有規律可以模擬。後來發現請求並沒有規律,也就是不能夠模擬http請求來獲取新的數據(也可能是我水平有限,哪位童鞋找到了規律一定要告訴我哦)。那麼就只有模擬下拉操作了。
想要模擬下拉操作,我們需要用到兩個工具,一個是PhatomJs,一個是Selenium。
PhatomJS其實就是一個沒有界面的瀏覽器,最主要的功能是能夠讀取js載入的頁面。
Selenium實質上是一個自動化測試工具,能夠模擬用戶的一些行為操作,比如下拉網頁。
一直有個說法,Python + PhatomJS + Selenium 是爬蟲的無敵三件套,基本能夠實現所有爬蟲需求。
OK,我們分別介紹下他們的使用,然後開始我們的實戰。
二、運行環境
我的運行環境如下:
系統版本
Windows10。Python版本
Python3.5,推薦使用Anaconda 這個科學計算版本,主要是因為它自帶一個包管理工具,可以解決有些包安裝錯誤的問題。去Anaconda官網,選擇Python3.5版本,然後下載安裝。IDE
我使用的是PyCharm,是專門為Python開發的IDE。這是JetBrians的產品,點我下載。
三、PhatomJS
1. 簡介
PhatomJS是一個WebKit內核的瀏覽器引擎,它能像瀏覽器一樣(它就是一個瀏覽器,只不過沒有界面)解析網頁,以及運行JavaScript腳本。
迄今為止,我們的實戰小爬蟲只是在模擬http請求,然後獲取response,從response中解析HTML代碼獲得想要的數據。但是,網頁中有些數據是用js動態載入的,這樣,我們使用使用http請求獲得的數據中並不包含js動態載入的內容。比如我在本系列的第一篇博文中請求了一下網易雲音樂的網站,本來想用網易雲音樂做實戰示例的(我的設計師小伙伴兒的另一個需求),不過由於它是由js動態載入的,用不到requests庫,所以就先以Unsplash網站為實例了。寫完Unsplash網站的爬蟲後就開始網易雲音樂的實戰!
那麼,怎麼判斷一個網站的內容是不是js動態載入的呢?
打開網易雲音樂,在頁面上點擊右鍵-->View page source。會彈出一個新視窗,在新視窗中搜索你想要爬取的內容,發現搜不到。那就肯定是js動態載入的了。
比如看下圖中的選中圖片,下麵有文字:“影視歌曲|重新演繹經典 聽翻唱煥發新生命力”。
我們在View page source頁面搜索該內容,發現搜索不到,可見這部分內容是由js動態載入的。
好了,進入正題,來看看PhatomJS如何使用。
2. 安裝 PhatomJS
PhatomJS 不能使用conda install 或者pip install 來安裝。需要去官網下載,選擇你的系統版本。下載完成的是一個壓縮包,解壓到你想存放的目錄(我放在了“C:\Program Files\” 目錄)。
接下來需要把PhatomJS配置成環境變數,這樣就可以直接調用了。
步驟:
1). 按win+E快捷鍵打開文件資源管理器“,在左側的“此電腦”上點擊右鍵,選擇“屬性”。
2). 在打開的視窗中左側,點擊“高級系統設置”。
3). 在彈出的視窗中點擊“環境變數”。
4). 在新視窗中選擇“PATH”,在下方點擊編輯按鈕。
5). 把phatomjs.exe所在的目錄添加到path中即可。
這樣,安裝過程就搞定了。
3. PhatomJS 的使用
在網上搜了一下,沒有找到中文的官網文檔,只找到了PhatomJS英文官方文檔。
3.1 舉個慄子
先來一個官網上的例子,PhatomJS執行js文件,輸出“Hello, World!”
新建一個js文件,包含下麵的代碼,然後保存為hello.js。
console.log('Hello, world!');
phantom.exit(); #用來終止phtomjs程式
打開cmd命令視窗,進入到hello.js 文件所在目錄,執行下麵的命令:
phantomjs hello.js
輸出:
Hello, world!
這個例子雖然方法比較笨,需要先創建一個js文件,然後再去執行。但是演示了PhatomJS的一個很重要的功能,就是執行js代碼。我們後面會用到它來執行下拉操作哦。
3.2 再來個慄子
我們使用PhatomJS來請求一個網頁,然後把網頁截圖保存。
創建一個js文件,包含下麵的代碼,保存為music.js
var page = require('webpage').create();
page.open('http://music.163.com/', function(status) {
console.log("Status: " + status);
if(status === "success") {
page.render('music.png');
}
phantom.exit();
});
然後使用cmd命令視窗,在music.js文件所在目錄,執行下麵的命令:
phatomjs music.js
這樣會有一個屏幕截圖保存在文件所在的文件夾嘍。
3.3 其他慄子
還有一些功能就不細細展開了,知道常用的就可以繼續咱們的爬蟲了。有用到其他功能的童鞋們去官網看看例子。
對了,官網還有許多慄子,奉上鏈接:Phatomjs官網慄子。
四、Selenium
1. 簡介
Selenium是一個自動化測試框架,廣泛的用於自動化測試領域(是不是真的廣泛用於自動化測試領域我也不知道,沒怎麼搞過自動化測試 -_-!,這是我臆測的 = ̄ω ̄=)。因為它能夠模擬人工操作,比如能在瀏覽器中點擊按鈕、在輸入框中輸入文本、自動填充表單、還能進行瀏覽器視窗的切換、對彈出視窗進行操作。也就是說你能手動做的東西,基本都能用它來實現自動化!
自己總結的大白話介紹~,大家湊合看哦。主要是文學水平有限,青春期的時候還想當一個文藝青年,沒事兒矯情矯情寫點東西,還註重個押韻啥的,學了理工科以後,矯情的東西受不了了,喜歡直接了當的。哎呦,跑偏了,趕緊回歸正題!
該框架還支持多種語言:Java、C#、Python、Ruby、PHP、Perl、JavaScript。
當然,我們使用的是面向Python語言的API。
2. 安裝 Selenium
可以使用pip install selenium
來安裝。使用Anaconda3版本的童鞋們,conda install selenium
在我的機器上不會下載,未找到原因。但是同樣使用pip install selenium
安裝成功了。通過在命令行裡面輸入conda list
,可以看到已經安裝的包。
同時裝有Python2.7和Python3.5的童鞋,使用下麵的命令來安裝。
py -3 -m pip install selenium
3. Selenium 的使用
Selenium支持很多語言的使用,上面也提到了。其他語言的使用我沒有接觸過,直接看Python語言的使用。官網:Selenium with Python。
3.1 同樣先來個慄子
因為PhatomJS沒有界面,在使用的時候沒有直觀感受。所以,我們暫時使用Chrome瀏覽器代替PhatomJS。
首先下載Chrome瀏覽器驅動:下載地址,選擇自己的系統版本,然後下載。這是一個壓縮包,解壓後存到一個目錄中,然後把該目錄添加到環境變數。因為上面的PhatomJS已經演示過添加環境變數的流程,這裡就不贅述了。
在PyCharm中輸入下麵代碼,然後運行看看有什麼反應。
from selenium import webdriver #導入Selenium的webdriver
from selenium.webdriver.common.keys import Keys #導入Keys
driver = webdriver.Chrome() #指定使用的瀏覽器,初始化webdriver
driver.get("http://www.python.org") #請求網頁地址
assert "Python" in driver.title #看看Python關鍵字是否在網頁title中,如果在則繼續,如果不在,程式跳出。
elem = driver.find_element_by_name("q") #找到name為q的元素,這裡是個搜索框
elem.clear() #清空搜索框中的內容
elem.send_keys("pycon") #在搜索框中輸入pycon
elem.send_keys(Keys.RETURN) #相當於回車鍵,提交
assert "No results found." not in driver.page_source #如果當前頁面文本中有“No results found.”則程式跳出
driver.close() #關閉webdriver
哎呀,其實瀏覽器的變化流程我都寫到上面的代碼的註釋中了,就不再說一遍了哦。
通過上面的例子,我們可以大概的瞭解了Selenium都能做什麼。個人認為其中比較重要的就是定位,即找到頁面中的元素,然後進行相關操作。
3.2 導航操作 Navigating
導航操作的使用非常簡單,完全可以通名字就知道它們是乾什麼的,不信先給你幾個例子瞧瞧:
element = driver.find_element_by_id("passwd-id") #通過id獲取元素
element = driver.find_element_by_name("passwd") #通過name獲取元素
element = driver.find_element_by_xpath("//input[@id='passwd-id']") #通過使用xpath匹配獲取元素
下麵列出詳細的定位方法。有定位一個元素的,也有定位多個元素的。
定位一個元素:
find_element_by_id find_element_by_name find_element_by_xpath find_element_by_link_text find_element_by_partial_link_text find_element_by_tag_name find_element_by_class_name find_element_by_css_selector
定位多個元素:
find_elements_by_name find_elements_by_xpath find_elements_by_link_text find_elements_by_partial_link_text find_elements_by_tag_name find_elements_by_class_name find_elements_by_css_selector
通過導航操作,我們就可以在找到想找的元素,然後進行接下來的處理,比如,想在一個輸入框中輸入數據。看3.1的那個慄子,通過導航,找到了name為p的輸入框,然後使用send_keys
在輸入框中寫入數據:
elem.send_keys("pycon")
我們知道瞭如何在輸入框中輸入數據,那如果我們碰到了下拉框該怎麼辦呢?
from selenium.webdriver.support.ui import Select #導入Select
select = Select(driver.find_element_by_name('name')) #通過Select來定義該元素是下拉框
select.select_by_index(index) #通過下拉元素的位置來選擇
select.select_by_visible_text("text") #通過下拉元素的內容來選擇
select.select_by_value(value) #通過下拉元素的取值來選擇
來看一個下拉框的HTML:
<select name="cars">
<option value ="volvo">沃爾沃</option>
<option value ="bmw">寶馬</option>
<option value="benz">賓士</option>
<option value="audi">奧迪</option>
</select>
結合上面的例子:
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_name('cars')) #找到name為cars的select標簽
select.select_by_index(1) #下拉框選中沃爾沃
select.select_by_visible_text("寶馬") #下拉框選中寶馬
select.select_by_value("benz") #下拉框選中奧迪
嗯...,讓我想想還有什麼... ...。對了,還有一個操作特別常用,就是點擊操作。這個很簡單:
elem.click()
在找到的元素後面加上click()就可以了。
3.3 Cookies
我們想要爬取的網站有些可能需要登錄,這樣就需要在請求網站的時候添加Cookies。
driver.get("http://www.example.com") #先請求一個網頁
cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’} #設置cookie內容
driver.add_cookie(cookie) #添加cookie
3.4 其他
還有其他的功能,比如拖拽頁面的元素、瀏覽器切換、處理彈出框口等。我就不一一列舉了,有需要的小伙伴兒們去看看官網吧。
五、後語
我們的PhatomJS 和Selenium 已經安裝完成,並且瞭解了他們的使用。
這篇就先到這裡吧,下一篇開始改造我們的小爬蟲嘍。