瀏覽器自動化


什么是 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()
獲取源代碼中所有的a標簽

 

控制瀏覽器

還記得我們上一關說的,登錄博客並批量獲取博客中的文章內容嗎?我們可以使用 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 # 輸出:扇貝編程
      獲取a標簽
  • 接着我們學會了將 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與BeautifulSoup結合
  • 最后,我們還學習了 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 爬取數據

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM