Python爬蟲小白入門(四)PhatomJS+Selenium第一篇


一、前言


在上一篇博文中,我們的爬蟲面臨着一個問題,在爬取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 已經安裝完成,並且了解了他們的使用。

這篇就先到這里吧,下一篇開始改造我們的小爬蟲嘍。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM