Python爬蟲:學習selenium的正確方式

selenium的安裝

是否是會有不少小夥伴會認爲這個安裝有必要講嗎?不就是一個pip就能夠搞定嘛,固然沒有那麼簡單了。javascript

selenium是一個自動化測試工具,利用它咱們能夠驅動瀏覽器執行特定的動做,如點擊、下拉等操做。對於一些javascript渲染的頁面來講,這招仍是頗有效的。css

pip 安裝

安裝方式:我推薦pip安裝java

 

驗證安裝

進入Python命令交互模式,導入selenium包,若是沒有報錯,那麼就說明安裝成功。python

 

 

可是這樣還不夠,可是這樣還不夠,由於咱們須要用到瀏覽器(如Chrome、Firefox)來配合selenium工做。有了瀏覽器咱們才能配合selenium進行頁面抓取。web

ChromeDriver的安裝

固然,首先得下載好Chrome瀏覽器,能夠自行百度下載並安裝。chrome

隨後安裝ChromeDriver。由於只有安裝了ChromeDriver以後,才能驅動Chrome瀏覽器完成相應的操做。npm

  • 一、準備工做
    在這以前請務必肯定已經安裝成功Chrome瀏覽器。
  • 二、查看版本
    點擊Chrome設置——>點擊關於Chrome,便可查看Chrome的版本。以下圖所示:瀏覽器


這裏個人瀏覽器版本號是88.0。安全

請記住Chrome的版本號,由於等一下選擇ChromeDriver版本的時候須要用到。cookie

下載ChromeDriver

下載網址以下:
http://npm.taobao.org/mirrors/chromedriver
選擇與你的瀏覽器相符合的版本,以下圖所示:

 

環境變量配置

將剛剛下載好的驅動解壓出來,並將其放入Python的Scripts目錄下便可。以下圖所示:

 

驗證安裝

配置完成以後能夠在命令行輸入chromedriver命令,若是輸入以後出現以下圖所示的界面,則說明環境變量配置好了。

 

selenium的基本使用介紹

簡單示例

 


那麼接下來就是對上面的代碼進行簡單的分析。
selenium.webdriver提供了全部的webdriver實現,當前支持的webdriver有:Firefox、Chrome、IE和Remote。Keys類提供鍵盤支持,好比:F一、enter等等。


接下來建立一個Chrome實例


driver.get()方法將打開URL中填寫的地址,webdriver將等待,直到頁面徹底加載完畢(實際上是等待onload方法執行完畢),而後繼續執行腳本。值得注意的是,若是頁面使用了大量的Ajax加載,webdriver可能不知道何時加載完畢。


下一行使用assert的方式確認標題是否含有python一詞。當assert語句後面爲False時,將會拋出異常。


同時webdriver也提供了大量的查找頁面元素的方法。,例如:find_element_by_*, *就是屬性。

 

接下來發送一個關鍵字,這個方法相似於使用鍵盤輸入關鍵字。特殊的按鍵可使用Keys類來輸入,該類是繼承selenium.webdriver.common.keys,爲了安全起見,須要先清除input輸入框裏面的內容,避免對搜索結果存在影響。


提交頁面以後,你會獲得全部的結果。爲了使特定的結果被找到,使用assert以下:


最後關閉瀏覽器。值得注意的是close()方法只會關閉一個標籤,所以,可使用quit()方法代替close()方法,quit()方法是關閉整個瀏覽器。

 

查找元素

在一個頁面中有不少不一樣的策略能夠定位一個元素。在你的項目中能夠選擇最合適的方法去查找元素。selenium提供的方法以下所示:

  • 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

一次查找多個元素(這些元素會返回一個list列表)

  • find_elements_by_id
  • 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

等待頁面加載完成

如今大多數的web應用程序是使用Ajax技術。當一個頁面被加載到瀏覽器時,該頁面內的元素能夠在不一樣的時間點被加載。這使得定位元素變得困難,若是元素再也不頁面之中,會拋出ElementNotVisibleException 異常。使用waits,咱們能夠解決這個問題。waits提供了一些操做之間的間隔,主要是定位元素或針對該元素的任何操做。

selenium webdriver提供兩種等待方式,一種是顯示等待,一種是隱式等待。

顯式等待

它指定要查找的節點,而後指定一個最長的等待時間,若是規定時間內加載出來了這個節點,就返回查找的節點;若是規定時間內沒有加載出該節點,就拋出超時異常。

接下來,咱們就用一個簡單的例子來表示:

首先打開京東並打開開發者工具。以下圖所示:

 

 

如上圖,咱們須要尋找id爲key的節點和class爲button的節點。具體代碼以下所示:

 


接下來對上面代碼進行簡單的說明,首先引入WebDriverWait這個對象,並指定最長時間,而後調用它的until()方法,傳入要等待的條件expected_conditions,好比這裏傳入了presence_of_element_located這個條件,表明節點出現的意思,其參數是節點定位的元組,也就是ID爲key的搜索框。

這樣作到的效果是,在10秒若是ID爲key的節點成功加載出來,就返回該節點;若是超過20秒尚未加載出來就會拋出異常。

運行代碼以後,網速不錯的話,是能夠成功加載出來的。

輸出結果以下:

<selenium.webdriver.remote.webelement.WebElement (session="54576c743c2ef8ec50ae1e02e826f5c0", element="cc0ff331-146f-4756-b738-82eb65016c41")> <selenium.webdriver.remote.webelement.WebElement (session="54576c743c2ef8ec50ae1e02e826f5c0", element="d38b49d7-550b-4619-bee9-f268ff7b4bf9")> 

能夠看到,控制檯成功輸出了兩個節點,它們都是WebElement類型。

隱式等待

當使用隱式等待執行測試的時候,若是Selenium沒有在DOM中找到節點,將繼續等待,超出設定時間後,則拋出找不到節點的異常。換句話說,當查找節點而節點並無出現的時候,隱式等待將等待一段時間再查找DOM,默認時間是0,示例以下:

 

 

這裏的implicitly_wait()方法實現了隱式等待。

隱式等待的效果其實沒有那麼好,由於咱們只規定了一個固定時間,而頁面的加載時間會受到網絡條件的影響。

等待條件

關於等待條件,其實還有不少,好比判斷標題內容,判斷某個節點是否出現了某文字等。具體以下表所示:

 

前進和後退

日常使用的瀏覽器都有前進和後退的功能,Selenium也能夠完成這個操做,它使用back()方法後退,使用forward()方法前進,具體代碼以下所示:

 

 

這裏咱們連續訪問了三個頁面,而後調用back()方法返回第二個頁面,等待2秒以後,再次進入第三個頁面。

Cookie

使用Selenium,還能夠方便的對Cookies進行操做,例如獲取、添加、刪除Cookies等。具體代碼以下所示:

 

 

在這裏須要注意一點,在增長cookie的時候,長度須要與你獲取的cookie的長度相同。當所有cookie刪除的時候,獲取到的cookie就爲空。

異常處理

在使用selenium的時候,不免會遇到一些異常,例如超時、節點未找到的錯誤等等。一旦出現此類錯誤,程序便沒法運行下去了。這裏咱們可使用try except語句來捕獲異常。

具體代碼以下所示:

 

 

這裏咱們使用的是try except來捕獲異常。好比,咱們對find_element_by_id()查找節點的方法捕獲NoSuchElementException的異常。一旦出現了這樣的錯誤,就進行異常處理,程序就不會中斷了。

本次的分享到這裏就結束了。

最後

沒有什麼事情是能夠一蹴而就的,生活如此,學習亦是如此。所以,哪裏會有什麼三天速成、七天速成的說法呢?惟有堅持,方能成功!

相關文章
相關標籤/搜索