小白學 Python 爬蟲:自動化測試框架 Selenium 從入門到實戰

引言

前面連續幾篇爬蟲實戰不知道各位同窗玩的怎麼樣,小編是要繼續更新了,本篇咱們來介紹一個前面已將安裝過的工具: Selenium ,若是說是叫爬蟲工具其實並不合適,在業界不少時候是拿來作自動化測試的,因此本篇的標題也就叫成了自動化測試框架。css

至於爲何叫這個名字咱們就不去深究了,老外起名字的想象力仍是至關能夠的。html

它能夠經過驅動程序驅動瀏覽器執行特定的動做,這個特性對咱們爬取由 JavaScript 動態渲染的頁面是很是友好的。前端

由於由 JavaScript 動態渲染的頁面,這種頁面上的 JavaScript 一般通過了編譯打包,看到的都是簡碼,很是難以閱讀。android

其實他們編譯打包的目的就是不想讓別人看,可是因爲瀏覽器的特性由全部人都看獲得,這個就比較尷尬了。。。webpack

比較常見的打包方式有 webpack 打包等等。nginx

有感興趣的同窗能夠在留言區留言,人多的話小編後續能夠分享一些前端的內容。web

前置準備

在開始以前,若是還沒安裝過環境的同窗建議仍是翻一翻前面你的文章,先把環境搞定。chrome

請確認本身已經安裝了 Chrome 瀏覽器而且也已經正確的配置了 ChromeDriver ,而後還須要正常的安裝了 Selenium 庫。json

首先,仍是官方網址敬上:swift

官方文檔:https://selenium.dev/selenium/docs/api/py/api.html

有任何問題找官方,看不懂可使用翻譯軟件。

基礎操做

以上前置準備都 ok 了之後,咱們開始瞭解一下 Selenium 的一些基礎操做把。先寫一點簡單的小功能演示一下:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome()

browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
input.send_keys('極客挖掘機')
input.send_keys(Keys.ENTER)
print(browser.current_url)
print(browser.get_cookies())
print(browser.page_source)

運行以上代碼,能夠看到自動彈出來一個 Chrome 瀏覽器,而且上面標示了: Chrome 正受到自動軟件的控制 。而後打開了百度,在輸入框中輸入了 「極客挖掘機」 進行搜索。

再搜索結果出來後控制檯打印了當前的 URL 、 cookies 和網頁的源代碼。

控制檯的運行結果就截個圖吧,內容太長就不貼了。

能夠看到, Selenium 拿到的內容,都是真實展現在瀏覽器中的內容。由 JavaScript 動態加載的頁面生成的 DOM 節點在 Selenium 下也無所遁形。

這個很好解釋,由於 Selenium 是直接拿到的瀏覽器展現的內容。

聲明瀏覽器對象

Selenium 支持很是多的瀏覽器,如:

from selenium import webdriver

# 聲明瀏覽器對象,需對應的驅動程序方可以使用
browser = webdriver.android()
browser = webdriver.blackberry()
browser = webdriver.chrome()
browser = webdriver.edge()
browser = webdriver.firefox()
browser = webdriver.ie()
browser = webdriver.opera()
browser = webdriver.phantomjs()
browser = webdriver.safari()

能夠看到有我熟悉的 IE 瀏覽器、 Edge 瀏覽器、 FireFox 瀏覽器、 Opera 瀏覽器等等。

訪問網頁

訪問網頁可使用 get() 方法,參數傳入咱們想要訪問的網站便可:

from selenium import webdriver

browser = webdriver.Chrome()

browser.get('https://www.jd.com/')
print(browser.page_source)

經過上面兩行代碼,咱們能夠看到自動打開了瀏覽器並訪問的京東,在控制檯打印了京東的源代碼。

固然,若是想要程序自動關閉瀏覽器的話可使用:

browser.close()

這句話加在上面能夠看到瀏覽器打開後訪問京東一閃而過就關掉了。

查找單個節點

咱們獲取到網頁後,第一步確定是要先查找到 DOM 節點啊,而後能夠直接從 DOM 節點中獲取數據。

不過有了 Selenium 之後,咱們不只能夠查找到節點獲取數據,還能夠模擬用戶操做,好比在搜索框輸入某些內容,點擊按鈕等等操做,不過仍是先看看怎麼查找節點:

從上面這張圖能夠看到,咱們想要獲取輸入框,能夠經過 id 進行獲取,那麼咱們接下來的代碼要這麼寫:

from selenium import webdriver

browser = webdriver.Chrome()

browser.get('https://www.jd.com/')
input_key = browser.find_element_by_id('key')
print(input_key)

結果以下:

<selenium.webdriver.remote.webelement.WebElement (session="86d1ae1419bee22099a168dfbf921a27", element="53047804-ad39-4dfd-b3fb-a149fb1c8ac8")>

能夠看到,咱們得到的元素類型是 WebElement 。

小編這裏順手列出全部的得到單個節點的方法:

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

此外, selenium 還未咱們提供了一個通用方法 find_element() ,它須要傳入兩個參數:查找方式 By 和值。實際上上面示例中的查找方式還能夠這麼寫(效果徹底同樣哦~~~):

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()

browser.get('https://www.jd.com/')
input_key1 = browser.find_element(By.ID, 'key')
print(input_key1)

結果小編就不貼了,各位同窗能夠本身運行下進行對比。

查找多個節點

好比咱們要查找左邊的這種導航條的全部條目:

能夠這麼寫:

lis = browser.find_elements_by_css_selector('.cate_menu li')
print(lis)

結果以下:

[<selenium.webdriver.remote.webelement.WebElement (session="6341ab4f39733b5f6b6bd51508b62f1d", element="8e0d1a8c-d5dc-4b1f-8250-7f0eca864ea7")>, <selenium.webdriver.remote.webelement.WebElement (session="6341ab4f39733b5f6b6bd51508b62f1d", element="15cd4dc9-42f4-4ed7-9258-9aa29073243c")>, 
......]

太多了,小編後面的結果就省略掉了。

下面列出來全部的多節點選擇的方法:

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

一樣,多節點選擇也有一個 find_elements() 的方法,小編這裏就不展現,各位同窗本身試一試。

本篇先到這裏,下一篇咱們接着介紹交互操做。

相關文章
相關標籤/搜索