selenium自動化
1 什么是 Selenium 自動化
Selenium 是一個用于 Web 應用程序測試的工具,支持多種瀏覽器(如 Chrome、Firefox、Edge 等)。WebDriver 是 Selenium 的核心組件,用于控制瀏覽器行為并執行自動化操作。元素定位是通過各種方式(如 ID、Class Name、XPath 等)在網頁上找到特定元素。
2 為什么要使用 Selenium 自動化
Selenium 可以用于自動化測試,減少人工測試的工作量。Selenium 可以用于抓取動態加載的數據,這些數據通常無法通過簡單的 HTTP 請求獲取。Selenium 支持多種瀏覽器,確保應用在不同瀏覽器上的一致性。
3 什么時候使用 Selenium 自動化
當網頁內容是通過 JavaScript 動態加載時,Selenium 是抓取這些數據的理想工具。當需要模擬復雜的用戶交互(如點擊、輸入、滾動等)時,Selenium 非常有用。在需要頻繁進行回歸測試或跨瀏覽器測試時,Selenium 是首選工具。
4 如何使用 Selenium 自動化
安裝 Selenium 庫和瀏覽器驅動(如 ChromeDriver)。打開瀏覽器、導航到 URL、定位元素、點擊、輸入等。處理彈出窗口、等待元素加載、執行 JavaScript 等。處理元素未找到、超時等異常情況。
安裝與配置
安裝 Selenium 庫
pip install selenium==4.5.0
下載瀏覽器驅動(如 ChromeDriver)
將瀏覽器驅動程序的路徑添加到系統環境變量中。
注意:不同版本的瀏覽器驅動程序支持的瀏覽器版本也不同,在下載瀏覽器驅動程序之前,先查看當前瀏覽器的版本號。
查看 Chrome 瀏覽器版本
單擊 Chrome 瀏覽器右上角的圖標打開 “自定義及控制 Google Chrome” 菜單,在該菜單中選擇 “幫助”→“關于 Google Chrome” 打開關于 Chrome 頁面。
訪問 chromedriver 官網
根據 Chrome 瀏覽器的版本號,到 chromedriver官網 官方網站或者到 最新最全的外網
chromedriver驅動網站與Chrome瀏覽器版本對應的chromedriver的下載列表,下載對應版本的 ChromeDriver。
下載 chromedriver
單擊與瀏覽器相應版本的 ChromeDriver 鏈接,進入下載頁面,下載 ZIP 格式的壓縮包到本地,解壓后得到 chromedriver.exe。
WebDriver 的配置
將 WebDriver 配置到系統環境變量后,程序中再次使用 WebDriver 時,就不需要重復指定 WebDriver 的執行路徑了。
5 代碼演示:selenium 的基本使用
from selenium import webdriver
?
url = 'https://www.baidu.com'
?
# 創建瀏覽器操作對象
browser = webdriver.Chrome()
?
# 打開網頁
browser.get(url)
# 獲取源碼(同requests.text)
print(browser.page_source)
input('用戶按下回車鍵退出')
# 退出
browser.quit()
6 Selenium 元素定位
元素定位首先要找到它們,WebDriver 提供很多定位元素的方法:
定位方式 | By 標識符 | 示例 |
---|---|---|
ID | By.ID | find_element(By.ID, "kw") |
Name 屬性 | By.NAME | find_element(By.NAME, "wd") |
Class name | By.CLASS_NAME | find_element(By.CLASS_NAME, "s_ipt") |
標簽名 | By.TAG_NAME | find_elements(By.TAG_NAME, "input") |
鏈接文本 | By.LINK_TEXT | find_element(By.LINK_TEXT, "新聞") |
部分鏈接文本 | By.PARTIAL_LINK_TEXT | find_element(By.PARTIAL_LINK_TEXT, "新") |
CSS 選擇器 | By.CSS_SELECTOR | find_element(By.CSS_SELECTOR, "#su") |
XPath | By.XPATH | find_element(By.XPATH, '//input[@id="su"]') |
6.1 代碼演示:selenium 的元素定位
from selenium import webdriver
# 定位元素,必須要導入By
from selenium.webdriver.common.by import By
?
url = 'https://www.baidu.com'
?
# 創建瀏覽器操作對象
browser = webdriver.Chrome()
?
# 打開網頁
browser.get(url)
?
# 通過id獲取輸入框
res1 = browser.find_element(By.ID,'kw')
print(res1)
?
# 通過name獲取輸入框
res2 = browser.find_element(By.NAME,'wd')
print(res2)
?
# 通過XPath獲取輸入框
res3 = browser.find_element(By.XPATH,"//*/input[@id='kw']")
print(res3)
print(res1==res2 and res2==res3)# True
?
# 通過類名獲取輸入框
res4 = browser.find_element(By.CLASS_NAME,"s_ipt")
?
# 通過css選擇器來獲取輸入框
res5 = browser.find_element(By.CSS_SELECTOR,"#kw")
print(res3==res4 and res4==res5)# True
?
# 通過通過鏈接文本獲取標簽
res6 = browser.find_element(By.LINK_TEXT,"新聞")
?
# 通過部分鏈接文本獲取標簽
res7 = browser.find_element(By.PARTIAL_LINK_TEXT,"聞")
print(res6==res7)# True
?
# 通過標簽名,并且由復數的形式獲取a標簽
res8 = browser.find_elements(By.TAG_NAME,"a")
print(res8)
?
input('用戶按下回車鍵退出~')
# 退出
browser.quit()
7 訪問元素信息
獲取元素屬性 .get_attribute('class')
,獲取元素文本 .text
,獲取標簽名.tag_name
。
8 代碼演示:元素信息獲取
from selenium import webdriver
from selenium.webdriver.common.by import By
?
# 創建瀏覽器操作對象
browser = webdriver.Chrome()
?
url = "https://www.baidu.com"
# 打開網頁
browser.get(url)
?
# 獲取到新聞文本的a鏈接(通過鏈接文本內容)
a = browser.find_element(By.LINK_TEXT,"新聞")
?
# 獲取href
a_href = a.get_attribute('href')
print(f"href:{a_href}")
# 結果:href:http://news.baidu.com/
?
# 獲取class
a_class = a.get_attribute('class')
print(f"class:{a_class}")
# 結果:class:mnav c-font-normal c-color-t
?
# 獲取文本內容
a_text = a.text
print(a_text)
# 結果:新聞
?
# 獲取標簽名稱
a_tag_name = a.tag_name
print(a_tag_name)
# 結果:a
?
9 交互操作
點擊、send_keys()
、后退操作、前進操作、模擬 JS 滾動、執行 JS 代碼、獲取網頁代碼 page_source
、退出。
9.1 代碼演示:selenium 元素交互
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
?
# 創建瀏覽器操作對象
browser = webdriver.Chrome()
# 將窗口最大化
# browser.maximize_window()
?
url = 'https://www.baidu.com'
# 打開瀏覽器
browser.get(url)
?
# 獲取輸入框
get_input = browser.find_element(By.ID,"kw")
# 輸入周杰倫
get_input.send_keys('周杰倫')
?
# 獲取點擊按鈕
get_button = browser.find_element(By.CSS_SELECTOR,"input[type='submit']")
# 執行點擊操作
get_button.click()
?
def scoll():# 這里要進行等待,否則后面的滑動頁面沒有反應,目的是等待頁面加載time.sleep(2)# 執行滑動js = 'document.documentElement.scrollTop=100000'browser.execute_script(js)
def next_page():scoll()time.sleep(2)# 獲取下一頁按鈕next_button = browser.find_element(By.PARTIAL_LINK_TEXT,"下一頁")# 執行點擊操作next_button.click()
for i in range(3):next_page()
# 導航操作
browser.back() ?# 回退
time.sleep(2)
browser.forward() # 前進
input('回車鍵退出程序~')
browser.quit()
10 案例練習
12306 注冊下拉框功能實現
# 導入模塊
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select ?# 專門處理下拉框
?
# 目標網站
url = 'https://kyfw.12306.cn/otn/regist/init'
?
# 創建瀏覽器操作對象
browser = webdriver.Chrome()
?
# 打開網頁
browser.get(url)
?
# 獲取下拉框對象
get_selector = browser.find_element(By.ID,'cardType')
# 實例化Selectors對象
selector = Select(get_selector)
time.sleep(2)
# 使用value來選定
# selector.select_by_value('B')
# 使用索引來選擇
selector.select_by_index(5)
input('回車鍵退出程序~')
browser.quit()
11 案例實戰
目標
開發一個爬蟲程序,從蘇寧易購網站抓取口紅商品信息,并保存為 CSV 文件。
目標網址
蘇寧易購(Suning.com)-換新到蘇寧 省錢更省心!
要求
-
商品信息采集:實現蘇寧易購平臺特定商品(口紅)信息的自動化采集,支持多頁數據連續采集。
-
用戶交互模擬:實現瀏覽器自動化操作,模擬真實用戶搜索行為,處理頁面動態加載內容。
-
數據存儲與分析:結構化存儲商品信息,支持后續數據分析處理,提供可擴展的數據存儲方案。
需求
商品信息包括:商品名、評論數、價格、店鋪名、詳情頁鏈接。
頁面結構分析
通過分析,每個商品都是一個 <li>
標簽,這一頁的所有數據都在一個 <ul>
標簽里面。
實現思路分析
-
打開網站
-
輸入內容(口紅)
-
點擊搜索
-
拖動滾輪到底部
-
爬取數據 / 解析數據
-
翻頁處理
實現代碼:
# 導入模塊
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import csv# 目標網站
url = 'https://www.suning.com/'# 創建瀏覽器操作對象
browser = webdriver.Chrome()browser.maximize_window()
# 打開網頁
browser.get(url)# 獲取輸入框對象
input_element = browser.find_element(By.ID,"searchKeywords")
# 執行輸入
input_element.send_keys('口紅')
time.sleep(1)# 獲取點擊按鈕
button_element = browser.find_element(By.ID,"searchSubmit")
# 執行點擊
button_element.click()
time.sleep(1)
# 下滑
def drop_down():time.sleep(6)for x in range(1,12,2):time.sleep(1)j = x / 9js = f'document.documentElement.scrollTop = document.documentElement.scrollHeight * {j}'browser.execute_script(js)
# 獲取數據
def get_info():# 先執行下拉drop_down()# 構建字典info_dict = {'商品名稱':"",'商品價格':"",'評論數':"",'店鋪名稱':"",'詳情鏈接':"",'圖片url':""}# 獲取每一個盒子list_box = browser.find_elements(By.CLASS_NAME,"product-box ")if list_box:for box in list_box:# 獲取商品名稱title = box.find_element(By.CSS_SELECTOR,".title-selling-point > a").textinfo_dict['商品名稱'] = title# 獲取商品價格price = box.find_element(By.CSS_SELECTOR,".def-price").textinfo_dict['商品價格'] = price# 獲取評論數comment = box.find_element(By.CSS_SELECTOR,".info-evaluate > a").textinfo_dict['評論數'] = comment# 獲取店鋪名稱dianpu = box.find_element(By.CSS_SELECTOR,".store-stock > a").textinfo_dict['店鋪名稱'] = dianpu# 獲取詳情鏈接detail_url = box.find_element(By.CSS_SELECTOR,".title-selling-point > a").get_attribute('href')info_dict['詳情鏈接'] = detail_url# 獲取圖片urlphoto_url = box.find_element(By.CSS_SELECTOR,".sellPoint > img").get_attribute('src')info_dict['圖片url'] = photo_urlcsv_writer.writerow(info_dict)print(info_dict)else:print('沒有獲取到所有盒子')
flag = True
i = 1
with open('蘇寧易購_口紅.csv','w',newline='',encoding='utf-8') as f:field_list = ['商品名稱','商品價格','評論數','店鋪名稱','詳情鏈接','圖片url']csv_writer = csv.DictWriter(f,fieldnames=field_list)csv_writer.writeheader()while flag:try:print(f'正在獲取第{i}頁內容')# 調用獲取內容函數get_info()# # 獲取下一頁按鈕# next_page_btn = browser.find_element(By.ID,"nextPage")# # 執行點擊下一頁# next_page_btn.click()# 翻頁browser.execute_script('document.querySelector("#nextPage").click()')time.sleep(2) # 等待頁面加載i += 1except Exception as e:flag = Falseprint('已經是最后一頁了')input('回車鍵結束')browser.quit()