Selenium自動化:輕松實現網頁操控

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 標識符示例
IDBy.IDfind_element(By.ID, "kw")
Name 屬性By.NAMEfind_element(By.NAME, "wd")
Class nameBy.CLASS_NAMEfind_element(By.CLASS_NAME, "s_ipt")
標簽名By.TAG_NAMEfind_elements(By.TAG_NAME, "input")
鏈接文本By.LINK_TEXTfind_element(By.LINK_TEXT, "新聞")
部分鏈接文本By.PARTIAL_LINK_TEXTfind_element(By.PARTIAL_LINK_TEXT, "新")
CSS 選擇器By.CSS_SELECTORfind_element(By.CSS_SELECTOR, "#su")
XPathBy.XPATHfind_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)-換新到蘇寧 省錢更省心!

要求
  1. 商品信息采集:實現蘇寧易購平臺特定商品(口紅)信息的自動化采集,支持多頁數據連續采集。

  2. 用戶交互模擬:實現瀏覽器自動化操作,模擬真實用戶搜索行為,處理頁面動態加載內容。

  3. 數據存儲與分析:結構化存儲商品信息,支持后續數據分析處理,提供可擴展的數據存儲方案。

需求

商品信息包括:商品名、評論數、價格、店鋪名、詳情頁鏈接。

頁面結構分析

通過分析,每個商品都是一個 <li> 標簽,這一頁的所有數據都在一個 <ul> 標簽里面。

實現思路分析
  1. 打開網站

  2. 輸入內容(口紅)

  3. 點擊搜索

  4. 拖動滾輪到底部

  5. 爬取數據 / 解析數據

  6. 翻頁處理

實現代碼:

# 導入模塊
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()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94069.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94069.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

又開發了一個優雅的小工具!

在開源項目中&#xff0c;Issues是一個強大的功能&#xff0c;用于跟蹤bug、功能請求和任務。然而&#xff0c;隨著項目的發展&#xff0c;Issues可能會變得難以管理&#xff0c;特別是當你需要離線訪問或進行深入分析時。 當然GitHub Issues除了上述功能以外&#xff0c;做在線…

【安裝教程】Docker Desktop 安裝與使用教程

文章目錄一、環境要求二、安裝步驟2.1 安裝 WSL 2&#xff08;適用于非專業版 Windows 10 及 Windows 11&#xff09;2.2 安裝 Docker Desktop2.3 漢化 DDocker Desktop2.4 卸載 Docker Desktop三、使用 Docker3.1驗證安裝3.2. 拉取鏡像3.3. 運行容器3.4. 查看容器3.5.更改容器…

Hutool 的 WordTree(敏感詞檢測)

package cn.hutool.dfa;WordTree 繼承自 HashMap<Character, WordTree>&#xff0c;表示一個字符到子樹的映射&#xff0c;構成一顆“詞樹”&#xff08;類似 Trie 樹&#xff09;&#xff0c;用于快速匹配字符串中的詞語&#xff08;敏感詞檢測、關鍵詞匹配等&#xff0…

Makefile 從入門到精通:自動化構建的藝術

引入 在軟件開發的世界里&#xff0c;“編譯” 是繞不開的環節&#xff0c;但手動編譯大型項目時&#xff0c;重復輸入編譯命令的痛苦&#xff0c;相信每個開發者都深有體會。Makefile 作為自動化構建的基石&#xff0c;能讓編譯過程“一鍵完成”&#xff0c;甚至智能判斷文件變…

利用DeepSeek將Rust程序的緩沖輸出改寫為C語言實現提高輸出效率

在前面多語言測試中&#xff0c;遇到一個難以置信的問題&#xff0c;rust的輸出到文件比c語言還快&#xff0c;這是不合情理的&#xff0c;通過對兩者輸出語句的比較&#xff0c;發現了不同。 rust程序在輸出到stdout前有這么一句 let mut writer BufWriter::with_capacity(6…

Java Optional 類教程詳解

一、Optional 類核心定位Optional 是 Java 8 引入的函數式容器類&#xff08;java.util.Optional&#xff09;&#xff0c;專為??顯式空值處理??設計。其核心價值在于&#xff1a;消除 60% 以上的傳統 null 檢查代碼通過類型系統強制空值聲明&#xff0c;降低 NPE 風險支持…

Agent X MCP 把想法編譯成現實

多模態GUI智能體協作型AI魔搭社區MCPMCP 硬件

cv快速input

效果<view class"miniWhether-box-lss"><view class"content-inp-text">快遞單號</view><input class"content-inp-input" type"text"v-model"expressInfo.expressNo" placeholder"填寫快遞單號&…

[AI8051U入門第十二步]W5500-Modbus TCP從機

學習目標: 1、了解Modbus Tcp協議 2、學習Modbus Tcp 從機程序驅動 3、使用 Modbus Pull調試一、Modbus TCP介紹? Modbus TCP 是一種基于 TCP/IP 網絡的工業通信協議,是 Modbus 協議家族中的一員,專門為以太網環境設計。它是 Modbus RTU(串行通信)協議的擴展,將 Modbus…

Python編程基礎與實踐:Python循環結構基礎

循環結構 學習目標 通過本課程的學習&#xff0c;學員可以掌握Python中for循環和while循環的基本使用方法&#xff0c;了解如何利用循環結構來重復執行代碼塊&#xff0c;以及如何使用break和continue語句來控制循環的執行流程。 相關知識點 循環結構 學習內容 1 循環結構 1.1 …

趣談設計模式之模板方法模式-老板,你的數字咖啡制作好了,請享用!

模板方法模式 定義了一套算法的骨架&#xff0c;講某些具體的步驟延遲到子類中實現。 主要用于不改變算法結構的情況下重新定義算法的某些步驟&#xff0c;以適應新的需求。 模板方法的角色 抽象類&#xff1a; 作為算法的骨架&#xff0c;該抽象類中包含了算法的核心部分和…

技術棧:基于Java語言的搭子_搭子社交_圈子_圈子社交_搭子小程序_搭子APP平臺

一、市場背景1、社會發展與生活方式轉變城市化進程加快&#xff1a;隨著城市化不斷推進&#xff0c;大量人口涌入城市&#xff0c;人們生活的物理空間距離拉近了&#xff0c;但人際關系卻在一定程度上變得疏離。傳統的基于血緣、地緣建立起的緊密社交關系難以滿足城市生活中的多…

字典在VBA與VB.NET的區別,舉例說明

簡述&#xff1a;在VBA中&#xff0c;字典通常使用Scripting.Dictionary對象&#xff0c;通過CreateObject("Scripting.Dictionary")創建。它需要引用Microsoft Scripting Runtime庫&#xff08;scrrun.dll&#xff09;。VBA字典的方法包括Exists、Add、Remove等&…

2024年網絡安全案例

以下是2024年造成嚴重損失的網絡安全典型案例&#xff0c;涵蓋市政系統、金融交易、區塊鏈平臺、國家級攻擊及全球性IT故障五大領域&#xff0c;按損失規模和技術危害性綜合排序&#xff1a;---一、市政基礎設施攻擊 1. 加拿大漢密爾頓市勒索軟件事件 - 損失&#xff1a;183…

PINN+貝葉斯:深度學習中的魔改新思路

2025深度學習發論文&模型漲點之——PINN貝葉斯PINN通過將物理定律&#xff08;如偏微分方程PDEs&#xff09;嵌入神經網絡的損失函數中&#xff0c;使得模型能夠利用已知的物理規律來指導學習過程&#xff0c;從而在數據有限或噪聲較多的情況下實現更高的準確性。然而&…

零基礎-動手學深度學習-8.3. 語言模型和數據集

很至關重要的一章: 8.3.1. 學習語言模型 8.3.2. 馬爾可夫模型與n元語法 n元語法看的序列長度是固定的&#xff0c; 存儲的序列長是有限且可控的&#xff0c;使用統計方法的時候通常使用這個模型&#xff01;&#xff01;&#xff01;統計方法&#xff01;&#xff01;&#x…

C++ 模板初階

什么是模板&#xff1f; 模板&#xff08;Template&#xff09;是 C 中實現泛型編程的核心工具。它允許我們編寫與具體數據類型無關的代碼&#xff0c;從而實現代碼復用和類型安全。為什么需要模板&#xff1f; 舉個生活中的例子&#xff1a;如果你要造一個能裝水的杯子&#x…

DockerFile文件執行docker bulid自動構建鏡像

文章目錄一、Dockerfile介紹二、Dockerfile鏡像制作和流程使用三、Dockerfile文件的制作鏡像的分層結構四、Dockerfile文件格式五、Dockerfile相關指令5.1 FROML&#xff1a;指定基礎鏡像5.2 LABEL&#xff1a;指定鏡像元數據5.3 RUN&#xff1a;執行shell指令5.4 ENV&#xff…

osloader!DoGlobalInitialization函數分析之HW_CURSOR--NTLDR源代碼分析之設置光標

第一部分&#xff1a; VOID DoGlobalInitialization(IN PBOOT_CONTEXT BootContextRecord){//// Turn the cursor off//HW_CURSOR(0,127);D:\srv03rtm\base\boot/inc/bldrx86.h:258:#define HW_CURSOR (*ExternalServicesTable->HardwareCursor)第二部分&#xff…

Elasticsearch 索引及節點級別增刪改查技術

以下是針對 Elasticsearch 索引及節點級別增刪改查技術做的簡短總結&#xff1a; 一、索引操作創建索引 功能&#xff1a;指定分片、副本數及映射規則[2][4]。示例&#xff1a;PUT /<index_name>?&#xff0c;可定義 settings&#xff08;如分片數&#xff09;和 mappin…