人生苦短,我用 Python
前文傳送門:
小白學 Python 爬蟲(1):開篇
小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝
小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門
小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門
小白學 Python 爬蟲(5):前置準備(四)數據庫基礎
小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝
小白學 Python 爬蟲(7):HTTP 基礎
小白學 Python 爬蟲(8):網頁基礎
小白學 Python 爬蟲(9):爬蟲基礎
小白學 Python 爬蟲(10):Session 和 Cookies
小白學 Python 爬蟲(11):urllib 基礎使用(一)
小白學 Python 爬蟲(12):urllib 基礎使用(二)
小白學 Python 爬蟲(13):urllib 基礎使用(三)
小白學 Python 爬蟲(14):urllib 基礎使用(四)
小白學 Python 爬蟲(15):urllib 基礎使用(五)
小白學 Python 爬蟲(16):urllib 實戰之爬取妹子圖
小白學 Python 爬蟲(17):Requests 基礎使用
小白學 Python 爬蟲(18):Requests 進階操作
小白學 Python 爬蟲(19):Xpath 基操
小白學 Python 爬蟲(20):Xpath 進階
小白學 Python 爬蟲(21):解析庫 Beautiful Soup(上)
小白學 Python 爬蟲(22):解析庫 Beautiful Soup(下)
小白學 Python 爬蟲(23):解析庫 pyquery 入門
小白學 Python 爬蟲(24):2019 豆瓣電影排行
小白學 Python 爬蟲(25):爬取股票信息
小白學 Python 爬蟲(26):為啥買不起上海二手房你都買不起
引言
前面連續幾篇爬蟲實戰不知道各位同學玩的怎麼樣,小編是要繼續更新了,本篇我們來介紹一個前面已將安裝過的工具: Selenium ,如果說是叫爬蟲工具其實並不合適,在業界很多時候是拿來做自動化測試的,所以本篇的標題也就叫成了自動化測試框架。
至於為什麼叫這個名字我們就不去深究了,老外起名字的想象力還是相當可以的。
它可以通過驅動程序驅動瀏覽器執行特定的動作,這個特性對我們爬取由 JavaScript 動態渲染的頁面是非常友好的。
因為由 JavaScript 動態渲染的頁面,這種頁面上的 JavaScript 通常經過了編譯打包,看到的都是簡碼,非常難以閱讀。
其實他們編譯打包的目的就是不想讓別人看,但是由於瀏覽器的特性由所有人都看得到,這個就比較尷尬了。。。
比較常見的打包方式有 webpack 打包等等。
有感興趣的同學可以在留言區留言,人多的話小編後續可以分享一些前端的內容。
前置準備
在開始之前,如果還沒安裝過環境的同學建議還是翻一翻前面你的文章,先把環境搞定。
請確認自己已經安裝了 Chrome 瀏覽器並且也已經正確的配置了 ChromeDriver ,然後還需要正常的安裝了 Selenium 庫。
首先,還是官方網址敬上:
官方文檔:https://selenium.dev/selenium/docs/api/py/api.html
有任何問題找官方,看不懂可以使用翻譯軟件。
基礎操作
以上前置準備都 ok 了以後,我們開始瞭解一下 Selenium 的一些基礎操作把。先寫一點簡單的小功能演示一下:
<code>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)
/<code>
運行以上代碼,可以看到自動彈出來一個 Chrome 瀏覽器,並且上面標示了: Chrome 正受到自動軟件的控制 。然後打開了百度,在輸入框中輸入了 “極客挖掘機” 進行搜索。
再搜索結果出來後控制檯打印了當前的 URL 、 cookies 和網頁的源代碼。
控制檯的運行結果就截個圖吧,內容太長就不貼了。
可以看到, Selenium 拿到的內容,都是真實展示在瀏覽器中的內容。由 JavaScript 動態加載的頁面生成的 DOM 節點在 Selenium 下也無所遁形。
這個很好解釋,因為 Selenium 是直接拿到的瀏覽器展示的內容。
Selenium 支持非常多的瀏覽器,如:
<code>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()
/<code>
可以看到有我熟悉的 IE 瀏覽器、 Edge 瀏覽器、 FireFox 瀏覽器、 Opera 瀏覽器等等。
訪問網頁
訪問網頁可以使用 get() 方法,參數傳入我們想要訪問的網站即可:
<code>from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.jd.com/')
print(browser.page_source)
/<code>
通過上面兩行代碼,我們可以看到自動打開了瀏覽器並訪問的京東,在控制檯打印了京東的源代碼。
當然,如果想要程序自動關閉瀏覽器的話可以使用:
<code>browser.close()
/<code>
這句話加在上面可以看到瀏覽器打開後訪問京東一閃而過就關掉了。
查找單個節點
我們獲取到網頁後,第一步肯定是要先查找到 DOM 節點啊,然後可以直接從 DOM 節點中獲取數據。
不過有了 Selenium 以後,我們不僅可以查找到節點獲取數據,還可以模擬用戶操作,比如在搜索框輸入某些內容,點擊按鈕等等操作,不過還是先看看怎麼查找節點:
從上面這張圖可以看到,我們想要獲取輸入框,可以通過 id 進行獲取,那麼我們接下來的代碼要這麼寫:
<code>from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.jd.com/')
input_key = browser.find_element_by_id('key')
print(input_key)
/<code>
結果如下:
<code><selenium.webdriver.remote.webelement.webelement>
/<selenium.webdriver.remote.webelement.webelement>/<code>
可以看到,我們獲得的元素類型是 WebElement 。
小編這裡順手列出所有的獲得單個節點的方法:
<code>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
/<code>
此外, selenium 還未我們提供了一個通用方法 find_element() ,它需要傳入兩個參數:查找方式 By 和值。實際上上面示例中的查找方式還可以這麼寫(效果完全一樣哦~~~):
<code>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)
/<code>
結果小編就不貼了,各位同學可以自己運行下進行對比。
查找多個節點
比如我們要查找左邊的這種導航條的所有條目:
可以這麼寫:
<code>lis = browser.find_elements_by_css_selector('.cate_menu li')
print(lis)
/<code>
結果如下:
<code>[<selenium.webdriver.remote.webelement.webelement>, <selenium.webdriver.remote.webelement.webelement>,
......]
/<selenium.webdriver.remote.webelement.webelement>/<selenium.webdriver.remote.webelement.webelement>/<code>
下面列出來所有的多節點選擇的方法:
<code>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
/<code>
同樣,多節點選擇也有一個 find_elements() 的方法,小編這裡就不展示,各位同學自己試一試。
本篇先到這裡,下一篇我們接著介紹交互操作。
示例代碼
本系列的所有代碼小編都會放在代碼管理倉庫 Github 和 Gitee 上,方便大家取用。
示例代碼-Github
示例代碼-Gitee
參考
https://selenium-python.readthedocs.io/api.html
https://cuiqingcai.com/5630.html
閱讀更多 極客挖掘機 的文章