在上一篇博文中,咱們的爬蟲面臨着一個問題,在爬取Unsplash網站的時候,因爲網站是下拉刷新,並無分頁。因此不可以經過頁碼獲取頁面的url來分別發送網絡請求。我也嘗試了其餘方式,好比下拉的時候監控http請求,看看請求是否有規律能夠模擬。後來發現請求並無規律,也就是不可以模擬http請求來獲取新的數據(也多是我水平有限,哪位童鞋找到了規律必定要告訴我哦)。那麼就只有模擬下拉操做了。css
想要模擬下拉操做,咱們須要用到兩個工具,一個是PhatomJs,一個是Selenium。
PhatomJS其實就是一個沒有界面的瀏覽器,最主要的功能是可以讀取js加載的頁面。
Selenium實質上是一個自動化測試工具,可以模擬用戶的一些行爲操做,好比下拉網頁。html
一直有個說法,Python + PhatomJS + Selenium 是爬蟲的無敵三件套,基本可以實現全部爬蟲需求。python
OK,咱們分別介紹下他們的使用,而後開始咱們的實戰。web
個人運行環境以下:chrome
系統版本
Windows10。api
Python版本
Python3.5,推薦使用Anaconda 這個科學計算版本,主要是由於它自帶一個包管理工具,能夠解決有些包安裝錯誤的問題。去Anaconda官網,選擇Python3.5版本,而後下載安裝。瀏覽器
IDE
我使用的是PyCharm,是專門爲Python開發的IDE。這是JetBrians的產品,點我下載。cookie
PhatomJS是一個WebKit內核的瀏覽器引擎,它能像瀏覽器同樣(它就是一個瀏覽器,只不過沒有界面)解析網頁,以及運行JavaScript腳本。網絡
迄今爲止,咱們的實戰小爬蟲只是在模擬http請求,而後獲取response,從response中解析HTML代碼得到想要的數據。可是,網頁中有些數據是用js動態加載的,這樣,咱們使用使用http請求得到的數據中並不包含js動態加載的內容。好比我在本系列的第一篇博文中請求了一下網易雲音樂的網站,原本想用網易雲音樂作實戰示例的(個人設計師小夥伴兒的另外一個需求),不過因爲它是由js動態加載的,用不到requests庫,因此就先以Unsplash網站爲實例了。寫完Unsplash網站的爬蟲後就開始網易雲音樂的實戰!框架
那麼,怎麼判斷一個網站的內容是否是js動態加載的呢?
打開網易雲音樂,在頁面上點擊右鍵-->View page source。會彈出一個新窗口,在新窗口中搜索你想要爬取的內容,發現搜不到。那就確定是js動態加載的了。
好比看下圖中的選中圖片,下面有文字:「影視歌曲|從新演繹經典 聽翻唱煥發新生命力」。
咱們在View page source頁面搜索該內容,發現搜索不到,可見這部份內容是由js動態加載的。
好了,進入正題,來看看PhatomJS如何使用。
PhatomJS 不能使用conda install 或者pip install 來安裝。須要去官網下載,選擇你的系統版本。下載完成的是一個壓縮包,解壓到你想存放的目錄(我放在了「C:\Program Files」 目錄)。
接下來須要把PhatomJS配置成環境變量,這樣就能夠直接調用了。
步驟:
1). 按win+E快捷鍵打開文件資源管理器「,在左側的「此電腦」上點擊右鍵,選擇「屬性」。
2). 在打開的窗口中左側,點擊「高級系統設置」。
3). 在彈出的窗口中點擊「環境變量」。
4). 在新窗口中選擇「PATH」,在下方點擊編輯按鈕。
5). 把phatomjs.exe所在的目錄添加到path中便可。
這樣,安裝過程就搞定了。
在網上搜了一下,沒有找到中文的官網文檔,只找到了PhatomJS英文官方文檔。
先來一個官網上的例子,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代碼。咱們後面會用到它來執行下拉操做哦。
咱們使用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
這樣會有一個屏幕截圖保存在文件所在的文件夾嘍。
還有一些功能就不細細展開了,知道經常使用的就能夠繼續我們的爬蟲了。有用到其餘功能的童鞋們去官網看看例子。
對了,官網還有許多栗子,奉上連接:Phatomjs官網栗子。
Selenium是一個自動化測試框架,普遍的用於自動化測試領域(是否是真的普遍用於自動化測試領域我也不知道,沒怎麼搞過自動化測試 -_-!,這是我臆測的 = ̄ω ̄=)。由於它可以模擬人工操做,好比能在瀏覽器中點擊按鈕、在輸入框中輸入文本、自動填充表單、還能進行瀏覽器窗口的切換、對彈出窗口進行操做。也就是說你能手動作的東西,基本都能用它來實現自動化!
本身總結的大白話介紹~,你們湊合看哦。主要是文學水平有限,青春期的時候還想當一個文藝青年,沒事兒矯情矯情寫點東西,還注重個押韻啥的,學了理工科之後,矯情的東西受不了了,喜歡直接了當的。哎呦,跑偏了,趕忙迴歸正題!
該框架還支持多種語言:Java、C#、Python、Ruby、PHP、Perl、JavaScript。
固然,咱們使用的是面向Python語言的API。
可使用pip install selenium
來安裝。使用Anaconda3版本的童鞋們,conda install selenium
在個人機器上不會下載,未找到緣由。可是一樣使用pip install selenium
安裝成功了。經過在命令行裏面輸入conda list
,能夠看到已經安裝的包。
同時裝有Python2.7和Python3.5的童鞋,使用下面的命令來安裝。
py -3 -m pip install selenium
Selenium支持不少語言的使用,上面也提到了。其餘語言的使用我沒有接觸過,直接看Python語言的使用。官網:Selenium with Python。
由於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都能作什麼。我的認爲其中比較重要的就是定位,即找到頁面中的元素,而後進行相關操做。
導航操做的使用很是簡單,徹底能夠通名字就知道它們是幹什麼的,不信先給你幾個例子瞧瞧:
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()就能夠了。
咱們想要爬取的網站有些可能須要登陸,這樣就須要在請求網站的時候添加Cookies。
driver.get("http://www.example.com") #先請求一個網頁 cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’} #設置cookie內容 driver.add_cookie(cookie) #添加cookie
還有其餘的功能,好比拖拽頁面的元素、瀏覽器切換、處理彈出框口等。我就不一一列舉了,有須要的小夥伴兒們去看看官網吧。
咱們的PhatomJS 和Selenium 已經安裝完成,而且瞭解了他們的使用。
這篇就先到這裏吧,下一篇開始改造咱們的小爬蟲嘍。