Selenium動態網頁爬蟲編寫與解釋

使用Selenium來抓取動態網頁。動態網頁通常是指那些通過JavaScript動態加載內容的網頁,這些內容在初始HTML中并不存在,因此使用傳統的requests庫無法獲取到這些動態生成的內容。Selenium可以模擬瀏覽器行為,等待JavaScript執行并渲染頁面,從而獲取到完整的頁面內容。

在這里插入圖片描述

下面是一個使用 Selenium 編寫的動態網頁爬蟲示例,用于抓取京東商品搜索頁面的信息(商品名稱和價格),并附有詳細注釋:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time# 設置 Chrome 瀏覽器選項
chrome_options = Options()
chrome_options.add_argument('--headless')  # 無頭模式,不顯示瀏覽器窗口
chrome_options.add_argument('--disable-gpu')  # 禁用GPU加速
chrome_options.add_argument('--no-sandbox')  # Linux 系統需要添加此參數# 創建 WebDriver 服務 (需要下載對應版本的 chromedriver)
service = Service(executable_path='./chromedriver')  # 替換為你的 chromedriver 路徑# 初始化瀏覽器驅動
driver = webdriver.Chrome(service=service, options=chrome_options)try:# 1. 打開目標網頁driver.get('https://search.jd.com/Search?keyword=手機')print("已打開京東搜索頁面...")# 2. 等待頁面加載 - 顯式等待(推薦)# 等待直到商品列表元素出現(最長等待10秒)WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".gl-item")))print("商品列表加載完成!")# 3. 模擬滾動頁面以加載更多內容(針對懶加載頁面)# 動態頁面通常需要滾動才能加載更多元素for i in range(3):  # 滾動3次driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")print(f"滾動頁面 {i+1}/3...")time.sleep(1.5)  # 等待新內容加載# 4. 定位所有商品元素# 使用 CSS 選擇器獲取商品列表項items = driver.find_elements(By.CSS_SELECTOR, '.gl-item')print(f"共找到 {len(items)} 個商品")# 5. 遍歷并提取數據results = []for item in items:try:# 在單個商品元素內查找名稱和價格name = item.find_element(By.CSS_SELECTOR, '.p-name em').text.strip()price = item.find_element(By.CSS_SELECTOR, '.p-price i').text.strip()results.append({'name': name, 'price': price})except Exception as e:print(f"提取商品時出錯: {str(e)}")continue# 6. 打印抓取結果print("\n抓取結果:")for i, result in enumerate(results[:5], 1):  # 只打印前5個結果print(f"{i}. {result['name']} - 價格: {result['price']}")print(f"\n共抓取 {len(results)} 條商品數據")except Exception as e:print(f"爬蟲執行出錯: {str(e)}")finally:# 7. 關閉瀏覽器driver.quit()print("瀏覽器已關閉")

代碼詳細解釋:

1、導入必要模塊

  • webdriver:控制瀏覽器
  • By:元素定位方式
  • WebDriverWaitexpected_conditions:顯式等待
  • Options:瀏覽器配置選項

2、瀏覽器設置

  • headless 模式:后臺運行不顯示界面
  • 禁用 GPU 和沙盒模式:提高穩定性和兼容性

3、、初始化驅動

  • 需要下載對應 Chrome 版本的 chromedriver
  • 指定 driver 路徑和服務

4、頁面加載等待

  • 使用顯式等待(WebDriverWait)確保目標元素加載完成
  • time.sleep() 更高效智能

5、模擬滾動

  • 執行 JavaScript 滾動到底部
  • 分次滾動并等待加載(針對懶加載頁面)

6、元素定位

  • 使用 CSS 選擇器定位商品列表項
  • 在單個商品元素內進一步提取名稱和價格

7、異常處理

  • 捕獲單個商品提取時的異常
  • 整體爬蟲的異常捕獲

8、資源清理

  • finally 塊確保關閉瀏覽器釋放資源

使用前準備:

1、安裝必要庫:

pip install selenium webdriver-manager

2、下載對應瀏覽器版本的驅動:

  • Chrome:https://chromedriver.chromium.org/downloads

  • 或使用 webdriver-manager 自動管理:

    from webdriver_manager.chrome import ChromeDriverManager
    service = Service(ChromeDriverManager().install())
    

常見問題解決:

1、元素定位失敗

  • 檢查網頁結構是否更新
  • 使用瀏覽器開發者工具驗證選擇器

2、內容加載不全

  • 增加滾動次數和等待時間
  • 調整顯式等待超時時間

3、反爬措施應對

  • 添加 user-agent 頭:

    chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36')
    
  • 添加代理:

    chrome_options.add_argument('--proxy-server=http://your-proxy-ip:port')
    

這個爬蟲可以擴展用于其他動態網站,只需修改:目標 URL、元素定位選擇器、滾動/等待策略、數據提取邏輯等就能實現一個完整的爬蟲過程。如有不懂可以留言討論。

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

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

相關文章

element el-table中使用el-image圖片預覽被其他表格遮擋

或者::v-deep .el-table__cell {position: static !important;}

MyBatis與Spring整合優化實戰指南:從配置到性能調優

一、SqlSessionFactory配置最佳實踐 1.1 數據源配置優化 <!-- Spring配置示例 --> <bean id"dataSource" class"com.zaxxer.hikari.HikariDataSource" destroy-method"close"><property name"driverClassName" value&q…

LUA(初學)

條件語句if if then endlocal a 2 if a < 6 thenprint(a) end2條件語句if else if then else endlocal a 2 local b 3 if a > 6 thenprint(a) elseprint(b) end3while循環語句 while do endlocal a 2 while a < 5 doa a 1print(a) end3 4 5for循環語句 for do …

JMeter 連接與配置 ClickHouse 數據庫

其他人都需要好幾十積分提供jar包&#xff0c;我5積分提供給大家 jar包地址&#xff1a;https://download.csdn.net/download/weixin_41853064/91370401 1、將jar包內的文件放入jmeter/lib/exc目錄并重啟jmeter 2、配置jmeter JDBC連接 3、復制 click hourse的類名&#xff1…

Kmeams聚類算法詳解

文章目錄一、聚類任務的簡介1.1 聚類的核心特征1.2 聚類的典型應用場景二、Kmeans的思想和數學原理2.1 核心思想2.2 數學原理三、Kmeans計算過程示例3.1 數據集3.2 步驟1&#xff1a;確定K值并初始化簇中心3.3 步驟2&#xff1a;計算樣本到簇中心的距離并分配簇3.4 步驟3&#…

平升智慧水務整體解決方案,大數據驅動的智慧水務,讓城市供水更智能

平升電子智慧水務整體解決方案 智慧供水整體解決方案&#xff0c;在調度中心搭建智慧水務平臺&#xff0c;為供水各環節安裝智能測控設備&#xff0c;應用物聯網、互聯網、大數據、云計算、人工智能等新一代信息技術&#xff0c;構建智慧水務綜合管理系統&#xff0c;貫穿從水源…

Samba配置使用

主要作用&#xff1a;將Linux系統中的文件共享給windows配置過程&#xff1a;&#xff08;1&#xff09;打開命令終端&#xff1a;獲取超級用戶權限后運行以下指令:apt-get install samba&#xff08;2&#xff09;修改samba配置文件&#xff1a;gedit /etc/samba/smb.conf :找…

Datawhale AI數據分析 筆記

Part1&#xff1a;數據分析入門--信息統計知識點&#xff1a;什么是提示詞&#xff08;Prompt&#xff09;&#xff1f;在人工智能&#xff08;AI&#xff09;領域&#xff0c;"提示詞"是一個關鍵概念&#xff0c;它指的是輸入給AI模型的文本或指令&#xff0c;用于引…

JAVA青企碼協會模式系統源碼支持微信公眾號+微信小程序+H5+APP

Java青企碼協會系統源碼&#xff1a;構建全渠道數字化管理平臺&#xff08;多端融合精準服務&#xff09;在政策紅利與數字化轉型的雙重驅動下&#xff0c;青年企業協會正面臨資源對接低效、會員粘性不足、跨域協同困難等痛點。基于Java技術棧的青企碼協會系統&#xff0c;通過…

Python 中調用阿里云 OCR(Optical Character Recognition,光學字符識別)服務

在 Python 中調用阿里云 OCR&#xff08;Optical Character Recognition&#xff0c;光學字符識別&#xff09;服務&#xff0c;通常需要使用阿里云的 SDK。OCR 服務屬于阿里云“視覺智能&#xff08;Vision Intelligence&#xff09;”產品線的一部分&#xff0c;調用時需通過…

網絡基礎協議綜合實驗

本文結合所學的一些基礎網絡協議來完成一個綜合性的實驗&#xff08;實驗完整代碼放在最后&#xff09;會先說明使用協議的原理&#xff0c;然后分析具體在拓補圖中的應用過程&#xff0c;最后再給出配置明確實驗目標&#xff1a;拓撲分 核心層&#xff08;R1&#xff09;、匯聚…

圖機器學習(5)——無監督圖學習與淺層嵌入方法

圖機器學習&#xff08;5&#xff09;——無監督圖學習0. 前言1. 無監督圖嵌入2. 矩陣分解2.1 圖分解2.2 高階鄰接保留嵌入2.3 帶有全局結構信息的圖表示3. skip-gram 模型3.1 DeepWalk3.2 Node2Vec3.3 Edge2Vec3.4 Graph2Vec0. 前言 無監督機器學習是指訓練過程中不利用任何目…

lua中檢查靜態常量是否正確引用

lua中檢查靜態常量是否正確引用思路代碼因在項目開發中會出現引用了不存在的常量&#xff0c;為了方便檢查這種情況&#xff0c;所以想著添加針對性腳本check 思路 加載要檢查的常量結構到KEYWORD通過gmatch匹配指定路徑下的所有文件&#xff0c;依次檢查引用到目標變量的key是…

考完數通,能轉云計算/安全方向嗎?轉型路徑與拓展路線分析

不少網工考完 HCIE數通 后&#xff0c;都會面臨一個現實問題&#xff1a;“能不能往云計算、安全這些熱門方向轉&#xff1f;”可以&#xff0c;而且非常值得。但怎么轉、學什么、有沒有路線圖&#xff0c;是關鍵。一、為什么考完HCIE數通后適合轉方向&#xff1f;技術基礎扎實…

2.邏輯回歸、Softmax回歸——鳶尾花大作戰

邏輯回歸 邏輯回歸其實并不是回歸&#xff0c;而是一個分類算法 分類問題&#xff1a;郵件分類、圖像識別、疾病診斷、文字情感分析、金融欺詐檢測 根據歷史數據&#xff0c;預測樣本是屬于哪個類別&#xff0c;通過數據擬合分界 主要用于二分類任務 邏輯回歸公式 事實上是在多…

【Lucene/Elasticsearch】**Query Rewrite** 機制

這段話描述的是 Lucene/Elasticsearch 的 **Query Rewrite** 機制&#xff0c;核心一句話&#xff1a;> **把“高級”或“邏輯”查詢&#xff08;如 PrefixQuery、WildcardQuery、RangeQuery&#xff09;在真正執行前&#xff0c;拆成最底層的、可直接倒排索引查的“原子查詢…

小智完整MCP交互流程(以調節音量為例)

1. 初始化階段 - MCP工具注冊 在 mcp_server.cc 中&#xff0c;音量控制工具在 AddCommonTools() 中注冊&#xff1a; AddTool("self.audio_speaker.set_volume", "Set the volume of the audio speaker. If the current volume is unknown, you must call self…

極狐GitLab CEO 柳鋼——極狐 GitLab 打造中國企業專屬 AI 編程平臺,引領編程新潮流

當下&#xff0c;AI 編程已成為人工智能大模型領域的耀眼明星&#xff0c;是公認的最好應用領域之一。其發展速度驚人&#xff0c;從最初簡單的代碼建議、代碼補全等基礎智能功能&#xff0c;一路高歌猛進&#xff0c;如今已涵蓋智能單元測試、智能代碼審核、智能體編程、代碼倉…

tiktok 彈幕 逆向分析

聲明: 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 逆向分析部分python代碼部分python代碼…

Java學習打卡22(JAVA中的錯誤Error和異常Exception)

異常&#xff08; Exception &#xff09;&#xff1a;軟件程序在運行過程中&#xff0c;出現的不期而至的各種情況&#xff0c;如&#xff1a;文件找不到、網絡連接失敗、非法參數等。要理解JAVA異常處理是如何工作的&#xff0c;需要掌握以下三種類型的異常&#xff1a;檢查性…