什么是 selenium
selenium 是瀏覽器自動化測試框架,原本被用於網頁測試。但到了爬蟲領域,它又成為了爬蟲的好幫手。selenium 可以控制你的瀏覽器,模仿人瀏覽網頁,從而獲取數據,自動操作等。一圖勝千言
安裝 selenium
和其他 Python 第三方庫的安裝一樣,我們要在命令行中使用 pip 命令安裝 selenium:
1 pip install selenium -i https://pypi.doubanio.com/simple
selenium 還需要安裝相應的瀏覽器驅動才能控制瀏覽器
chromedriver驅動下載網站:
https://registry.npmmirror.com/binary.html?path=chromedriver/
將下載好的 chromedriver 解壓縮,Windows 系統得到 chromedriver.exe,MacOS 得到 chromedriver,這個就是我們需要的瀏覽器驅動。我們要將它放到 Python 所在安裝目錄里。 如果你忘了 Python 的安裝目錄,可以根據下面的操作來找到。
1 import sys 2 print(sys.executable)
打開瀏覽器:
from selenium import webdriver browser = webdriver.Chrome() # 打開網頁 browser.get('https://wpblog.x0y1.com') # 關閉瀏覽器 browser.quit()
browser 是我們實例化的瀏覽器。我們將網址傳給 browser 對象的 get() 方法,即可打開對應的網頁。最后調用 quit() 方法將瀏覽器關閉。
我們的目的是獲取數據,接下來讓我們用 browser 對象的 page_source 屬性來獲取網頁的源代碼。值得注意的是,用 selenium 獲取的網頁源代碼是數據加載完畢后最終的源代碼,也就是網頁加載后通過 API 獲取的數據也在這個源代碼中。
因此,我們就不用再區分要爬取的網頁是靜態網頁還是動態網頁了,在 selenium 眼里統統都一樣
用 selenium 打印出博客的網頁源代碼:
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://wpblog.x0y1.com') # 打印出網頁源代碼 print(browser.page_source) browser.quit()
處理數據
我們之前掌握了用 BeautifulSoup 對獲取的網頁源代碼進行處理,提取出我們需要的內容。selenium 也同樣可以進行數據的處理,它倆原理類似,只是語法上有所不同。
接下來,我們來看看如何用 selenium 處理數據。我們以獲取博客的 h1 標簽為例,代碼可以這樣寫:
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://wpblog.x0y1.com') h1 = browser.find_element_by_tag_name('h1') print(h1.text) browser.quit()
Selenium常用的查找元素的方法:
我們來看幾個例子你就明白了,下面的例子中,注釋內容是要找的 HTML 元素代碼,下面是獲取該元素的 Python 代碼:
1 # <p>扇貝編程,帶你打開編程世界的大門</p> 2 browser.find_element_by_tag_name('p') 3 4 # <p class="slogan">扇貝編程,帶你打開編程世界的大門</p> 5 browser.find_element_by_class_name('slogan') 6 7 # <p id="slogan">扇貝編程,帶你打開編程世界的大門</p> 8 browser.find_element_by_id('slogan') 9 10 # <p name="slogan">扇貝編程,帶你打開編程世界的大門</p> 11 browser.find_element_by_name('slogan') 12 13 # <a href="http://code.shanbay.com">扇貝編程</a> 14 browser.find_element_by_link_text('扇貝編程') 15 browser.find_element_by_partial_link_text('扇貝')
selenium
新增了一種更統一的方法 find_element()
,而具體通過什么來查找(tag name, class name 等)放進了參數中。

1 # <p>扇貝編程,帶你打開編程世界的大門</p> 2 browser.find_element('tag name', 'p') 3 4 # <p class="slogan">扇貝編程,帶你打開編程世界的大門</p> 5 browser.find_element('class name', 'slogan') 6 7 # <p id="slogan">扇貝編程,帶你打開編程世界的大門</p> 8 browser.find_element('id', 'slogan') 9 10 # <p name="slogan">扇貝編程,帶你打開編程世界的大門</p> 11 browser.find_element('name', 'slogan') 12 13 # <a href="http://code.shanbay.com">扇貝編程</a> 14 browser.find_element('link text', '扇貝編程') 15 browser.find_element('partial link text', '扇貝')
這些方法找到的元素(返回值)都是 WebElement 對象,它和 BeautifulSoup 里的 Tag 對象一樣,也有一個 text 屬性,一樣也是獲取元素里的文本內容。
不同的是,Tag 對象通過字典取值的方式獲取元素的屬性值,而 WebElement 對象則使用 get_attribute() 方法來獲取。
我們來看個代碼實例加深一下印象:
# <a href="http://code.shanbay.com">扇貝編程</a> link = browser.find_element_by_link_text('扇貝編程') print(link.get_attribute('href')) # 輸出:http://code.shanbay.com print(link.text) # 輸出:扇貝編程
如果想要查找所有符合條件的元素 只要把剛才介紹的那些方法名中的 element
改成 elements
即可

1 from selenium import webdriver 2 3 browser = webdriver.Chrome() 4 browser.get('https://wpblog.x0y1.com') 5 # 注意下面是 elements 6 a_tags = browser.find_elements_by_tag_name('a') 7 # 新版本寫法: 8 # a_tags = browser.find_elements('tag name', 'a') 9 10 for tag in a_tags: 11 print(tag.text) 12 browser.quit()
控制瀏覽器
還記得我們上一關說的,登錄博客並批量獲取博客中的文章內容嗎?我們可以使用 selenium
進行同樣的操作,代碼的可讀性更強,我們寫起來也更輕松。
要想做到這些,除了剛才學的那些查找元素的方法外,只要再學兩個方法即可。這兩個方法分別是 click() 和 send_keys(),我們來看看它倆的作用:
自動登錄博客並獲取文章內容的代碼如下,請仔細閱讀注釋內容:
提示:我們在下面的代碼還用了一對新的查找元素的方法:
find_element_by_css_selector()
和find_elements_by_css_selector()
,這就運用了上一課所說的 css 選擇器的知識,將 css 選擇器以字符串的形式填入括號中,能幫我們更精准地查找元素。

from selenium import webdriver import time browser = webdriver.Chrome() # 打開博客 browser.get('https://wpblog.x0y1.com') # 找到登錄按鈕 login_btn = browser.find_element_by_link_text('登錄') # 點擊登錄按鈕 login_btn.click() # 等待 2 秒鍾,等頁面加載完畢 time.sleep(2) # 找到用戶名輸入框 user_login = browser.find_element_by_id('user_login') # 輸入用戶名 user_login.send_keys('codetime') # 找到密碼輸入框 user_pass = browser.find_element_by_id('user_pass') # 輸入密碼 user_pass.send_keys('shanbay520') # 找到登錄按鈕 wp_submit = browser.find_element_by_id('wp-submit') # 點擊登錄按鈕 wp_submit.click() # 找到 Python 分類文章鏈接 python_cat = browser.find_element_by_css_selector('section#categories-2 ul li a') # 上一句用新版本的寫法如下 # python_cat = browser.find_element('css selector', 'section#categories-2 ul li a') # 點擊該分類 python_cat.click() # 找到跳轉的頁面中的所有文章標題標簽 titles = browser.find_elements_by_css_selector('h2.entry-title a') # 上一句用新版本的寫法如下 # titles = browser.find_elements('css selector', 'h2.entry-title a') # 找到標題標簽中內含的鏈接 links = [i.get_attribute('href') for i in titles] # 依次打開 links 中的文章鏈接 for link in links: browser.get(link) # 獲取文章正文內容 content = browser.find_element_by_class_name('entry-content') print(content.text) browser.quit()
復習與總結
- 我們是從安裝瀏覽器驅動開始的,為了能讓 selenium 控制瀏覽器,驅動是必需的。
驅動安裝完成后,我們迫不及待地用代碼控制打開了瀏覽器,代碼是這樣的:

1 # 從 selenium 中導入 webdriver(驅動) 2 from selenium import webdriver 3 4 # 選擇 Chrome 瀏覽器並打開 5 browser = webdriver.Chrome()
- 接着我們調用實例化后的瀏覽器對象(browser)的 get() 方法成功地打開了一個網頁,並且通過其 page_source 屬性拿到了網頁的源代碼。注意,最后一定要調用 quit() 方法將瀏覽器關閉。
-
1 from selenium import webdriver 2 3 browser = webdriver.Chrome() 4 browser.get('https://wpblog.x0y1.com') 5 # 打印出網頁源代碼 6 print(browser.page_source) 7 # 關閉瀏覽器 8 browser.quit()
-
- 有些網站數據較多,網頁加載比較慢,打開網頁后需要暫停幾秒才能獲取到完整的網頁源代碼。以上代碼可以總結成下圖:
- 光拿到網頁源代碼還不夠,我們還要解析、處理它,從中提取出我們需要的數據。selenium 中解析與提取數據的方法如下:
上面是獲取第一個符合條件的元素的方法,獲取所有符合條件的元素的方法只需把 element 改成 elements 即可:
- 這些方法找到的元素(返回值)都是 WebElement 對象,它的常用屬性和方法如下:’
- 舉個獲取 a 標簽中鏈接和內容的例子:
-
1 # <a href="http://code.shanbay.com">扇貝編程</a> 2 link = browser.find_element_by_link_text('扇貝編程') 3 print(link.get_attribute('href')) 4 # 輸出:http://code.shanbay.com 5 print(link.text) 6 # 輸出:扇貝編程
-
- 接着我們學會了將 selenium 與 BeautifulSoup 相結合,用 selenium 獲取網頁源代碼,用 BeautifulSoup 解析、提取數據。
-
1 from selenium import webdriver 2 from bs4 import BeautifulSoup 3 4 browser = webdriver.Chrome() 5 browser.get('https://wpblog.x0y1.com') 6 # 用 BeautifulSoup 解析網頁源代碼 7 soup = BeautifulSoup(browser.page_source, 'html.parser') 8 a_tags = soup.find_all('a') 9 for tag in a_tags: 10 print(tag.text) 11 browser.quit()
-
- 最后,我們還學習了 selenium 中操作瀏覽器的方法,
- 通過 selenium 查找元素的方法找到對應的元素后,調用其 click() 方法就可以模擬點擊該元素,一般用於點擊鏈接或按鈕;調用其 send_keys() 方法用於模擬按鍵輸入,傳入要輸入的內容即可,常用於賬號密碼等輸入框的表單填寫。
-
selenium簡單明了,使用起來非常的直觀,和我們正常使用瀏覽器的步驟一樣,不需要分析瀏覽器背后發生的邏輯。
但它的缺點也很明顯,因為 selenium 需要真實的打開瀏覽器,等待網頁加載等。在大規模獲取數據時,使用 selenium 爬取數據將會非常的低效。
為了提升爬取效率,我們可以將瀏覽器設置為靜默模式,讓瀏覽器不必真的打開,而是在后台默默地獲取數據、操作頁面。代碼如下:
1 from selenium import webdriver 2 3 # 初始化配置 4 options = webdriver.ChromeOptions() 5 # headless 為靜默模式 6 options.add_argument('--headless') 7 # 將配置傳入瀏覽器 8 browser = webdriver.Chrome(options=options) 9 # 打開網頁 10 browser.get('https://wpblog.x0y1.com') 11 # 關閉瀏覽器 12 browser.quit()
即使我們將瀏覽器配置成靜默模式,在大規模爬取數據,selenium 的爬取速度和資源占用率都不太理想。所以,通常情況下,我們還是會用 requests 和 BeautifulSoup 爬取數據