Python Selenium自動化實現(xiàn)網(wǎng)頁操控
1 什么是 Selenium 自動化
Selenium 是一個用于 Web 應用程序測試的工具,支持多種瀏覽器(如 Chrome、Firefox、Edge 等)。WebDriver 是 Selenium 的核心組件,用于控制瀏覽器行為并執(zhí)行自動化操作。元素定位是通過各種方式(如 ID、Class Name、XPath 等)在網(wǎng)頁上找到特定元素。
2 為什么要使用 Selenium 自動化
Selenium 可以用于自動化測試,減少人工測試的工作量。Selenium 可以用于抓取動態(tài)加載的數(shù)據(jù),這些數(shù)據(jù)通常無法通過簡單的 HTTP 請求獲取。Selenium 支持多種瀏覽器,確保應用在不同瀏覽器上的一致性。
3 什么時候使用 Selenium 自動化
當網(wǎng)頁內(nèi)容是通過 JavaScript 動態(tài)加載時,Selenium 是抓取這些數(shù)據(jù)的理想工具。當需要模擬復雜的用戶交互(如點擊、輸入、滾動等)時,Selenium 非常有用。在需要頻繁進行回歸測試或跨瀏覽器測試時,Selenium 是首選工具。
4 如何使用 Selenium 自動化
安裝 Selenium 庫和瀏覽器驅(qū)動(如 ChromeDriver)。打開瀏覽器、導航到 URL、定位元素、點擊、輸入等。處理彈出窗口、等待元素加載、執(zhí)行 JavaScript 等。處理元素未找到、超時等異常情況。
安裝與配置
安裝 Selenium 庫
pip install selenium==4.5.0
下載瀏覽器驅(qū)動(如 ChromeDriver)
將瀏覽器驅(qū)動程序的路徑添加到系統(tǒng)環(huán)境變量中。
注意:不同版本的瀏覽器驅(qū)動程序支持的瀏覽器版本也不同,在下載瀏覽器驅(qū)動程序之前,先查看當前瀏覽器的版本號。
查看 Chrome 瀏覽器版本
單擊 Chrome 瀏覽器右上角的圖標打開 “自定義及控制 Google Chrome” 菜單,在該菜單中選擇 “幫助”→“關于 Google Chrome” 打開關于 Chrome 頁面。

訪問 chromedriver 官網(wǎng)
根據(jù) Chrome 瀏覽器的版本號,到 chromedriver官網(wǎng) 官方網(wǎng)站或者到 最新最全的外網(wǎng)
chromedriver驅(qū)動網(wǎng)站與Chrome瀏覽器版本對應的chromedriver的下載列表,下載對應版本的 ChromeDriver。

下載 chromedriver
單擊與瀏覽器相應版本的 ChromeDriver 鏈接,進入下載頁面,下載 ZIP 格式的壓縮包到本地,解壓后得到 chromedriver.exe。

WebDriver 的配置
將 WebDriver 配置到系統(tǒng)環(huán)境變量后,程序中再次使用 WebDriver 時,就不需要重復指定 WebDriver 的執(zhí)行路徑了。
5 selenium 的基本使用
from selenium import webdriver
?
url = 'https://www.baidu.com'
?
# 創(chuàng)建瀏覽器操作對象
browser = webdriver.Chrome()
?
# 打開網(wǎng)頁
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"]') |
代碼演示:selenium 的元素定位
from selenium import webdriver
# 定位元素,必須要導入By
from selenium.webdriver.common.by import By
?
url = 'https://www.baidu.com'
?
# 創(chuàng)建瀏覽器操作對象
browser = webdriver.Chrome()
?
# 打開網(wǎng)頁
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,"http://*/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
?
# 通過標簽名,并且由復數(shù)的形式獲取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
?
# 創(chuàng)建瀏覽器操作對象
browser = webdriver.Chrome()
?
url = "https://www.baidu.com"
# 打開網(wǎng)頁
browser.get(url)
?
# 獲取到新聞文本的a鏈接(通過鏈接文本內(nèi)容)
a = browser.find_element(By.LINK_TEXT,"新聞")
?
# 獲取href
a_href = a.get_attribute('href')
print(f"href:{a_href}")
# 結(jié)果:href:http://news.baidu.com/
?
# 獲取class
a_class = a.get_attribute('class')
print(f"class:{a_class}")
# 結(jié)果:class:mnav c-font-normal c-color-t
?
# 獲取文本內(nèi)容
a_text = a.text
print(a_text)
# 結(jié)果:新聞
?
# 獲取標簽名稱
a_tag_name = a.tag_name
print(a_tag_name)
# 結(jié)果:a9 交互操作
點擊、send_keys()、后退操作、前進操作、模擬 JS 滾動、執(zhí)行 JS 代碼、獲取網(wǎng)頁代碼 page_source、退出。
selenium 元素交互
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
?
# 創(chuàng)建瀏覽器操作對象
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']")
# 執(zhí)行點擊操作
get_button.click()
?
def scoll():
# 這里要進行等待,否則后面的滑動頁面沒有反應,目的是等待頁面加載
time.sleep(2)
# 執(zhí)行滑動
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,"下一頁")
# 執(zhí)行點擊操作
next_button.click()
for i in range(3):
next_page()
# 導航操作
browser.back() # 回退
time.sleep(2)
browser.forward() # 前進
input('回車鍵退出程序~')
browser.quit()10 案例練習
12306 注冊下拉框功能實現(xiàn)
# 導入模塊
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select # 專門處理下拉框
?
# 目標網(wǎng)站
url = 'https://kyfw.12306.cn/otn/regist/init'
?
# 創(chuàng)建瀏覽器操作對象
browser = webdriver.Chrome()
?
# 打開網(wǎng)頁
browser.get(url)
?
# 獲取下拉框?qū)ο?
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 案例實戰(zhàn)
目標
開發(fā)一個爬蟲程序,從蘇寧易購網(wǎng)站抓取口紅商品信息,并保存為 CSV 文件。
目標網(wǎng)址
蘇寧易購(Suning.com)
要求
- 商品信息采集:實現(xiàn)蘇寧易購平臺特定商品(口紅)信息的自動化采集,支持多頁數(shù)據(jù)連續(xù)采集。
- 用戶交互模擬:實現(xiàn)瀏覽器自動化操作,模擬真實用戶搜索行為,處理頁面動態(tài)加載內(nèi)容。
- 數(shù)據(jù)存儲與分析:結(jié)構(gòu)化存儲商品信息,支持后續(xù)數(shù)據(jù)分析處理,提供可擴展的數(shù)據(jù)存儲方案。
需求
商品信息包括:商品名、評論數(shù)、價格、店鋪名、詳情頁鏈接。
頁面結(jié)構(gòu)分析
通過分析,每個商品都是一個 <li> 標簽,這一頁的所有數(shù)據(jù)都在一個 <ul> 標簽里面。
實現(xiàn)思路分析
- 打開網(wǎng)站
- 輸入內(nèi)容(口紅)
- 點擊搜索
- 拖動滾輪到底部
- 爬取數(shù)據(jù) / 解析數(shù)據(jù)
- 翻頁處理
實現(xiàn)代碼:
# 導入模塊
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import csv
# 目標網(wǎng)站
url = 'https://www.suning.com/'
# 創(chuàng)建瀏覽器操作對象
browser = webdriver.Chrome()
browser.maximize_window()
# 打開網(wǎng)頁
browser.get(url)
# 獲取輸入框?qū)ο?
input_element = browser.find_element(By.ID,"searchKeywords")
# 執(zhí)行輸入
input_element.send_keys('口紅')
time.sleep(1)
# 獲取點擊按鈕
button_element = browser.find_element(By.ID,"searchSubmit")
# 執(zhí)行點擊
button_element.click()
time.sleep(1)
# 下滑
def drop_down():
time.sleep(6)
for x in range(1,12,2):
time.sleep(1)
j = x / 9
js = f'document.documentElement.scrollTop = document.documentElement.scrollHeight * {j}'
browser.execute_script(js)
# 獲取數(shù)據(jù)
def get_info():
# 先執(zhí)行下拉
drop_down()
# 構(gòu)建字典
info_dict = {
'商品名稱':"",
'商品價格':"",
'評論數(shù)':"",
'店鋪名稱':"",
'詳情鏈接':"",
'圖片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").text
info_dict['商品名稱'] = title
# 獲取商品價格
price = box.find_element(By.CSS_SELECTOR,".def-price").text
info_dict['商品價格'] = price
# 獲取評論數(shù)
comment = box.find_element(By.CSS_SELECTOR,".info-evaluate > a").text
info_dict['評論數(shù)'] = comment
# 獲取店鋪名稱
dianpu = box.find_element(By.CSS_SELECTOR,".store-stock > a").text
info_dict['店鋪名稱'] = dianpu
# 獲取詳情鏈接
detail_url = box.find_element(By.CSS_SELECTOR,".title-selling-point > a").get_attribute('href')
info_dict['詳情鏈接'] = detail_url
# 獲取圖片url
photo_url = box.find_element(By.CSS_SELECTOR,".sellPoint > img").get_attribute('src')
info_dict['圖片url'] = photo_url
csv_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 = ['商品名稱','商品價格','評論數(shù)','店鋪名稱','詳情鏈接','圖片url']
csv_writer = csv.DictWriter(f,fieldnames=field_list)
csv_writer.writeheader()
while flag:
try:
print(f'正在獲取第{i}頁內(nèi)容')
# 調(diào)用獲取內(nèi)容函數(shù)
get_info()
# # 獲取下一頁按鈕
# next_page_btn = browser.find_element(By.ID,"nextPage")
# # 執(zhí)行點擊下一頁
# next_page_btn.click()
# 翻頁
browser.execute_script('document.querySelector("#nextPage").click()')
time.sleep(2) # 等待頁面加載
i += 1
except Exception as e:
flag = False
print('已經(jīng)是最后一頁了')
input('回車鍵結(jié)束')
browser.quit()以上就是Python Selenium自動化實現(xiàn)網(wǎng)頁操控的詳細內(nèi)容,更多關于Python Selenium網(wǎng)頁操作的資料請關注腳本之家其它相關文章!

