Selenium 實現自動化分頁處理與信息提取

Selenium 實現自動化分頁處理與信息提取

在 Web 自動化測試或數據抓取場景中,分頁處理是一個常見的需求。通過 Selenium,我們可以實現對多頁面內容的自動遍歷,并從中提取所需的信息。本文將詳細介紹如何利用 Selenium 進行自動化分頁處理和信息提取。


一、Selenium 分頁處理的基本思路

在實際應用中,網頁通常會采用分頁顯示數據(例如商品列表、新聞列表等)。每一頁的內容通過不同的 URL 或動態加載的方式呈現。以下是分頁處理的一般步驟:

  1. 定位分頁控件
    • 找到“下一頁”按鈕、“上一頁”按鈕或頁碼選擇器。
  2. 循環遍歷頁面
    • 通過循環點擊“下一頁”按鈕,或者直接跳轉到指定頁碼的方式,逐頁加載內容。
  3. 提取每頁數據
    • 在每一頁加載完成后,定位并提取目標信息(如文本、圖片鏈接等)。
  4. 終止條件
    • 設置終止循環的條件(例如到達最后一頁、沒有更多數據等)。

二、Selenium 分頁處理的核心技術點

1. 定位分頁控件

在 Selenium 中,我們需要通過元素定位方法(如 XPath、CSS Selector 等)找到分頁控件。常見的分頁控件包括:

  • 下一頁按鈕:例如 <button class="next-page">下一頁</button>
  • 上一頁按鈕:例如 <button class="prev-page">上一頁</button>
  • 頁碼選擇器:例如 <select class="page-select"> 包含多個頁碼選項。
2. 處理動態加載內容

部分網頁采用動態加載技術(如 AJAX),當用戶點擊“下一頁”按鈕時,頁面內容會通過 JavaScript 動態更新。此時需要等待頁面加載完成,確保數據被正確提取。

3. 循環遍歷頁面

Selenium 提供了豐富的元素操作方法,可以通過循環實現分頁的自動遍歷。例如:

  • 點擊“下一頁”按鈕,直到無法點擊為止。
  • 直接跳轉到指定頁碼(適用于支持直接輸入頁碼的場景)。
4. 數據提取與存儲

在每一頁加載完成后,使用 Selenium 或其他工具(如 BeautifulSoup、lxml)提取目標信息,并將其存儲為文件或數據庫中的數據。


三、Selenium 分頁處理的典型實現

以下是一個完整的示例代碼,展示了如何利用 Selenium 實現分頁處理和信息提取:

示例場景:從某電商網站提取商品列表

假設目標網頁是一個商品列表頁面,每一頁顯示一定數量的商品信息。我們的任務是:

  1. 遍歷所有頁面。
  2. 提取每一件商品的標題、價格和鏈接。

代碼實現

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import pandas as pd# 初始化 WebDriver(以 Chrome 為例)
options = webdriver.ChromeOptions()
options.add_argument('--start-maximized')
driver = webdriver.Chrome(options=options)try:# 打開目標頁面driver.get('https://example.com/products')# 存儲提取的數據data = []while True:# 等待當前頁面加載完成(定位商品列表容器)product_container = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '.product-list')))# 提取每一件商品的信息products = product_container.find_elements(By.CSS_SELECTOR, '.product-item')for product in products:title = product.find_element(By.CSS_SELECTOR, '.product-title').textprice = product.find_element(By.CSS_SELECTOR, '.price').textlink = product.find_element(By.CSS_SELECTOR, 'a').get_attribute('href')data.append({'標題': title,'價格': price,'鏈接': link})# 檢查是否還有下一頁next_button = driver.find_elements(By.CSS_SELECTOR, '.next-page')if len(next_button) == 0:break  # 已到達最后一頁# 點擊“下一頁”按鈕,并等待新頁面加載next_button[0].click()time.sleep(2)  # 等待頁面加載(可根據實際情況調整)except Exception as e:print(f"發生異常:{e}")finally:# 關閉瀏覽器driver.quit()# 將數據保存為 CSV 文件
df = pd.DataFrame(data)
df.to_csv('products.csv', index=False, encoding='utf-8-sig')
print("數據已成功提取并保存到 products.csv")

四、代碼解析與關鍵點

1. 初始化 WebDriver
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import pandas as pdoptions = webdriver.ChromeOptions()
options.add_argument('--start-maximized')
driver = webdriver.Chrome(options=options)
  • WebDriver: 使用 Chrome 瀏覽器進行自動化操作。
  • Options: 設置瀏覽器窗口最大化,避免因窗口大小導致的定位問題。
2. 打開目標頁面
driver.get('https://example.com/products')
  • 這里需要替換為目標網站的實際 URL。

3. 提取數據
  1. 等待當前頁面加載完成

    product_container = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '.product-list'))
    )
    
    • 使用 WebDriverWait 等待目標元素(商品列表容器)加載完成。
  2. 提取每一件商品的信息

    products = product_container.find_elements(By.CSS_SELECTOR, '.product-item')
    for product in products:title = product.find_element(By.CSS_SELECTOR, '.product-title').textprice = product.find_element(By.CSS_SELECTOR, '.price').textlink = product.find_element(By.CSS_SELECTOR, 'a').get_attribute('href')data.append({'標題': title,'價格': price,'鏈接': link})
    
    • 使用 CSS 選擇器定位商品信息,并提取標題、價格和鏈接。

4. 處理分頁
  1. 檢查是否還有下一頁

    next_button = driver.find_elements(By.CSS_SELECTOR, '.next-page')
    if len(next_button) == 0:break  # 已到達最后一頁
    
  2. 點擊“下一頁”按鈕

    next_button[0].click()
    time.sleep(2)
    
    • 點擊“下一頁”按鈕,并等待新頁面加載。

5. 數據存儲
  1. 將數據轉換為 DataFrame

    df = pd.DataFrame(data)
    
  2. 保存為 CSV 文件

    df.to_csv('products.csv', index=False, encoding='utf-8-sig')
    
    • 使用 pandas 將數據保存為 CSV 格式,便于后續分析。

五、注意事項

  1. 反爬機制:部分網站會對頻繁的請求進行限制(如 IP 封鎖)。可以考慮使用代理或調整請求頻率。
  2. 動態加載內容:對于采用動態加載技術的網頁,需要等待 JavaScript 執行完畢后再進行數據提取。
  3. 異常處理:在實際開發中,應增加更多的異常處理邏輯,確保程序健壯性。
  4. 性能優化:如果目標網站包含大量頁面和數據,可以考慮使用多線程或分布式爬蟲技術。

六、總結

通過上述代碼實現,我們展示了如何利用 Selenium 實現分頁處理和數據提取。該方法適用于大多數采用傳統分頁方式的網頁,并且具有較高的靈活性和可擴展性。

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

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

相關文章

VS qt 聯合開發環境下的多國語言翻譯

添加Linguist 文件方法&#xff0c;如同添加類文件的方式&#xff0c;那樣&#xff1a; 其他跟QT的一樣的流程&#xff0c;另外在main函數里要注冊一下&#xff0c; QTextCodec::setCodecForLocale(textCodec); QTranslator translator5; QString trans5 fi…

第十七節:高頻開放題-React未來發展趨勢

服務端組件&#xff08;RSC&#xff09;普及 React Compiler對開發模式的影響 React 未來發展趨勢深度解析&#xff1a;服務端組件與編譯器的革命性變革 一、服務端組件&#xff08;RSC&#xff09;的全面普及與生態重構 1. RSC 的核心理念與技術優勢 React Server Component…

Python爬蟲實戰:獲取B站查詢數據

一、引言 1.1 研究背景 隨著互聯網的迅猛發展,視頻分享平臺積累了海量的數據資源。以 B 站為例,其豐富的視頻內容和活躍的用戶群體蘊含著巨大的價值。對 B 站搜索數據進行爬取和分析,有助于洞察用戶興趣、市場趨勢以及內容創作方向,為市場調研、用戶行為分析和內容推薦系…

【Rust 精進之路之第3篇-變量觀】`let`, `mut` 與 Shadowing:理解 Rust 的變量綁定哲學

系列&#xff1a; Rust 精進之路&#xff1a;構建可靠、高效軟件的底層邏輯 作者&#xff1a; 碼覺客 發布日期&#xff1a; 2025-04-20 引言&#xff1a;為數據命名&#xff0c;Rust 的第一道“安全閥” 在上一篇文章中&#xff0c;我們成功搭建了 Rust 開發環境&#xff0c…

stm32(IO口的最高速度)

如果我們寫入速度 快到一種程度 肯定就不能完全按理想的來了 當我們寫01快起來 中間的保持時間就會越來越少 就逐漸往下面變化 所以其實 我們如果改變上升時間 和 下降時間 還是能將最后的波形 變成為正常的波形的。 不用追求高速 &#xff0c;滿足要求下 選低速的即可。 因…

String +memset字符串類題型【C++】

tips&#xff1a; 1、尋找最大公共子串時&#xff0c;如果字符串可以旋轉但是不能反轉&#xff0c;考慮在每個字符串后重復一次自身&#xff0c;如 "abcd" 變為 "abcdabcd"&#xff0c;這樣在用dp就可以了。 如何變環拆環為鏈&#xff1a; cin>>n&…

基于論文的大模型應用:基于SmartETL的arXiv論文數據接入與預處理(三)

上一篇 介紹了數據接入處理的整體方案設計。本篇介紹基于SmartETL框架的流程實現。 5. 流程開發 5.1.簡單采集流程 從指定時間&#xff08;yy年 mm月&#xff09;開始&#xff0c;持續采集arXiv論文。基于月份和順序號&#xff0c;構造論文ID&#xff0c;進而下載論文PDF文件…

[Swift]Xcode模擬器無法請求http接口問題

1.以前偷懶一直是這樣設置 <key>NSAppTransportSecurity</key> <dict><key>NSAllowsArbitraryLoads</key><true/><key>NSAllowsArbitraryLoadsInWebContent</key><true/> </dict> 現在我在Xcode16.3上&#xff…

Python基礎總結(八)之循環語句

文章目錄 一、for循環1.1 for循環格式1.2 for ...else1.3 for...break1.4 for...continue 二、while循環2.1 while循環格式2.2 while...break2.3 while...continue2.4 while ...else 循環語句就如其名&#xff0c;就是重復的執行一段代碼&#xff0c;直到滿足退出條件時&#x…

vuex實現同一頁面radio-group點擊不同按鈕顯示不同表單

本文實現的是點擊單一規格和多規格兩個按鈕會在頁面顯示不同的表單 方法一 <!-- 單規格和多規格的切換 --> <el-form label-width"80px" class"text-align-left"><el-form-item label"商品規格"><!-- 監聽skus_type的改…

AI編寫的“黑科技風格、自動刷新”的看板頁面

以下的 index.html 、 script.js 和 styles.css 文件&#xff0c;實現一個具有黑科技風格、自動刷新的能源管理系統實時監控看板。 html頁面 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name&q…

Vim使用完全指南:從基礎到高效編輯

Vim使用完全指南&#xff1a;從基礎到高效編輯 一、Vim簡介與基本概念 Vim&#xff08;Vi IMproved&#xff09;是從vi發展出來的一個功能強大的文本編輯器&#xff0c;以其高效性和靈活性著稱&#xff0c;特別適合程序開發和系統管理任務。與常規文本編輯器不同&#xff0c;…

時序約束高級進階使用詳解三:Create_Clock

目錄 一、前言 二、設計示例 2.1 設計代碼 2.2 schematic 2.3 no overwriteing 2.4 約束到非時鐘引腳 三、Create_clock應用 3.1 時鐘輸入端口 3.2 7系列高速收發器輸出管腳 3.3 部分原語的輸出管腳 3.4 主時鐘路徑上創建主時鐘 3.5 虛擬時鐘 3.6 差分時鐘的約束 …

箱線圖(盒須圖)QCPStatiBox

一、QCPStatisticalBox 概述 QCPStatisticalBox 是 QCustomPlot 中用于繪制箱線圖(盒須圖)的類&#xff0c;可以顯示數據的五個關鍵統計量&#xff1a;最小值、第一四分位數(Q1)、中位數、第三四分位數(Q3)和最大值&#xff0c;以及可能的異常值。 二、主要屬性 屬性類型描述…

人形機器人馬拉松:北京何以孕育“領跑者”?

“機器人每跑一小步&#xff0c;都是人類科技的一大步”&#xff0c;這句對阿姆斯特朗登月名言的仿寫&#xff0c;恰如其分地詮釋了全球首場人形機器人半程馬拉松賽事的里程碑意義。 2025年4月19日&#xff0c;北京亦莊半程馬拉松暨人形機器人半程馬拉松圓滿結束。在總長21.09…

基于Python的推薦算法的電影推薦系統的設計

標題:基于Python的推薦算法的電影推薦系統的設計與實現 內容:1.摘要 本文圍繞基于Python的推薦算法的電影推薦系統展開研究。背景在于隨著電影數量的急劇增加&#xff0c;用戶在海量電影中找到符合自身喜好的影片變得困難。目的是設計并實現一個高效準確的電影推薦系統&#x…

【深度學習】詳解矩陣乘法、點積,內積,外積、哈達瑪積極其應用|tensor系列02

博主簡介&#xff1a;努力學習的22級計算機科學與技術本科生一枚&#x1f338;博主主頁&#xff1a; Yaoyao2024往期回顧&#xff1a;【深度學習】你真的理解張量了嗎&#xff1f;|標量、向量、矩陣、張量的秩|01每日一言&#x1f33c;: “腦袋想不明白的&#xff0c;就用腳想”…

面試常用基礎算法

目錄 快速排序歸并排序堆排序 n n n皇后問題最大和子數組爬樓梯中心擴展法求最長回文子序列分割回文串動態規劃求最長回文子序列最長回文子串單調棧雙指針算法修改 分割回文串滑動窗口棧 快速排序 #include <iostream> #include <algorithm>using namespace std;…

相對路徑和絕對路徑解析

在 Linux/Unix 和文件系統中&#xff0c;絕對路徑和相對路徑是描述文件或目錄位置的兩種方式&#xff0c;它們的核心區別在于路徑的起點和使用場景。以下是詳細對比&#xff1a; 目錄 1. 定義與起點 2. 符號與語法 3. 使用場景 4. 實際示例 示例 1&#xff1a;定位文件 示…

【算法數據結構】leetcode37 解數獨

37. 解數獨 - 力扣&#xff08;LeetCode&#xff09; 題目描述&#xff1a; 題目要求每一行 &#xff0c;每一列&#xff0c;每個3*3 的子框只能出現一次。每個格子的數字范圍1-9. 需要遍歷每個空格填入可能的數字&#xff0c;并驗證符合規則。如果符合就填入&#xff0c;不符…