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

来源:http://www.cnblogs.com/Albert-Lee/archive/2016/12/31/6238866.html
-Advertisement-
Play Games

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

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



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉載:http://blog.csdn.net/luoweifu/article/details/10721543 我進行了一些加工,不是本人原創但比原博主要更完善~ 淺談Java異常 以前雖然知道一些異常的處理,也用過一些,但是對throw和throws區別還是有不太清楚。今天用實例測試一下 異常 ...
  • 一、標準IO的效率 對比以下四個程式的用戶CPU、系統CPU與時鐘時間對比 程式1:系統IO 程式2:標準IO getc版本 程式3:標準IO fgets版本 結果: 【註:該表截取自APUE,上表中"表3-1中的最佳時間即《程式1》","表3-1中的單位元組時間指的是《程式1》中BUFSIZE為1時 ...
  • 題目大意: B進位數,每個數字i(i=0,1,...,B-1)有a[i]個。你要用這些數字組成一個最大的B進位數X(不能有前導零,不需要 用完所有數字),使得X是B-1的倍數。q次詢問,每次詢問X在B進位下的第k位數字是什麼(最低位是第0位)。 思路:由於如下定理: a*Bk≡a( mod (B-1 ...
  • 當子類繼承父類的時候,若父類沒有定義帶參的構造方法,則子類可以繼承父類的預設構造方法 當父類中定義了帶參的構造方法,子類必須顯式的調用父類的構造方法 若此時,子類還想調用父類的預設構造方法,必須在父類中明確聲明預設的構造方法 ...
  • set 的 remove() 和 discard() 方法介紹。 函數/方法名 for example: 以下運行代碼會報錯,原因在於 第9行 remove()中的‘l’在集合中不存在 而 discard()方法不會報錯。 正確的代碼如下: 運行結果如下: ...
  • Peter wants to generate some prime numbers for his cryptosystem. Help him! Your task is to generate all prime numbers between two given numbers! Input ...
  • 在上一集的討論里我們介紹並實現了強類型返回結果行。使用強類型主要的目的是當我們把後端資料庫SQL批次操作搬到記憶體里轉變成數據流式按行操作時能更方便、準確、高效地選定數據欄位。在上集討論示範里我們用集合的foreach方式模擬了一個最簡單的數據流,並把從資料庫里批次讀取的數據集轉換成一串連續的數據行來 ...
  • 雖然公司自己的網站和給客戶開發的項目中都涉及到了微信開發,自己也寫了關於微信開發的兩篇文章,但感覺自己對微信開發中的一些概念還是容易混淆,今天瀏覽了下微信公眾平臺、微信開放平臺的後臺和相關文檔,算是弄清楚了下麵這些東西,至於其他還沒弄清楚的,以後想到了再說。 1,微信公眾平臺(https://mp. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...