Python爬蟲第20節-使用 Selenium 爬取小米商城空調商品

目錄

前言

一、 本文目標

二、環境準備

2.1 安裝依賴

2.2 配置 ChromeDriver

三、小米商城頁面結構分析

3.1 商品列表結構

3.2 分頁結構

四、Selenium 自動化爬蟲實現

4.1 腳本整體結構

4.2 代碼實現

五、關鍵技術詳解

5.1 Selenium 啟動與配置

5.2 頁面等待與異步加載

5.3 商品數據解析

5.4 分頁處理

5.5 異常處理

5.6 可選:保存到 MongoDB

六、Headless 模式與瀏覽器兼容

七、常見問題與優化建議

7.1 反爬機制

7.2 頁面結構變動

7.3 數據完整性

7.4 性能優化

八、總結


?🎬 攻城獅7號:個人主頁

🔥 個人專欄:?《python爬蟲教程》

?? 君子慎獨!

?🌈 大家好,歡迎來訪我的博客!
?? 此篇文章主要介紹 Selenium 的實戰
📚 本期文章收錄在《python爬蟲教程》,大家有興趣可以自行查看!
?? 歡迎各位 ?? 點贊 👍 收藏 ?留言 📝!

前言

????????在實際數據采集和電商分析中,很多網站采用了前端渲染和復雜的 Ajax 請求,直接分析接口變得困難。小米商城就是這樣一個典型案例。與淘寶類似,小米商城的商品列表和分頁都依賴于前端 JavaScript 動態渲染,Ajax 接口參數復雜且可能包含加密校驗。對于這種頁面,最直接、最穩定的抓取方式就是使用 Selenium 模擬真實用戶操作。

????????本篇文章將以"空調"為例,詳細講解如何用 Selenium 自動化爬取小米商城的空調商品信息,包括商品名稱、價格、圖片鏈接、商品詳情鏈接等,并實現自動翻頁抓取。文章內容涵蓋環境準備、頁面結構分析、Selenium 腳本編寫、數據解析、翻頁處理、異常處理、可選的 MongoDB 存儲、Headless 模式、常見問題與優化建議等,幫助你系統掌握電商前端動態頁面的爬取方法。

一、 本文目標

- 利用 Selenium 自動化爬取小米商城空調商品信息

- 用 PyQuery 解析商品名稱、價格、圖片、鏈接等數據

- 實現自動翻頁抓取多頁商品

- 可選:將數據保存到 MongoDB

- 兼容 Headless(無界面)模式

- 具備異常處理和反爬優化思路

二、環境準備

2.1 安裝依賴

- Chrome 瀏覽器(建議最新版)

- ChromeDriver(版本需與 Chrome 主版本一致)

- Python 3.7+

- Selenium

- PyQuery

- (可選)MongoDB

安裝 Python 依賴:

pip install selenium pyquery# 可選:pip install pymongo

ChromeDriver 下載地址:( https://googlechromelabs.github.io/chrome-for-testing/ )

注意: ChromeDriver 版本必須和 Chrome 瀏覽器主版本號一致,否則 Selenium 啟動會報錯。

2.2 配置 ChromeDriver

- 將 chromedriver.exe 放到 PATH 路徑下,或在代碼中指定其絕對路徑。

- 建議用 ChromeDriver 的"可分離"模式,便于調試。

三、小米商城頁面結構分析

以( https://www.mi.com/shop/search?keyword=空調 ) 為例,打開開發者工具,分析商品列表和分頁結構。

?

3.1 商品列表結構

????????點擊網頁元素,按鼠標右鍵的檢查項,快速定位

?

商品列表在如下結構下:

<ul class="goods-list"><li><a href="商品詳情鏈接"><img src="圖片鏈接" ...><div class="title">商品名稱</div><div class="price">價格</div>...</a></li>...</ul>

??????? 實際頁面可能有多種 class,如 `.goods-list li`、`.product-list li`、`.goods-item` 等。需根據實際頁面調整選擇器。

3.2 分頁結構

????????同樣點擊網頁分頁標簽元素,按鼠標右鍵的檢查項,快速定位分析

?

分頁欄如下:

<div class="mi-pagenav"><span class="numbers current">1</span><a class="numbers">2</a><a class="numbers">3</a>...</div>

- 當前頁為 `<span class="numbers current">1</span>`

- 其它頁為 `<a class="numbers">2</a>`

- 需用 Selenium 模擬點擊 `<a class="numbers">2</a>` 實現翻頁

四、Selenium 自動化爬蟲實現

4.1 腳本整體結構

核心流程:

1. 啟動 Selenium,打開小米商城空調搜索頁

2. 解析當前頁商品數據

3. 模擬點擊分頁按鈕,依次抓取多頁

4. 解析每頁數據并輸出

5. 關閉瀏覽器

4.2 代碼實現

from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom pyquery import PyQuery as pqimport timeKEYWORD = '空調'MAX_PAGE = 3chrome_options = Options()# chrome_options.add_argument('--headless')  # 如需無頭模式可取消注釋chrome_options.add_argument('--disable-gpu')chrome_options.add_argument('--no-sandbox')chrome_options.add_argument('--disable-dev-shm-usage')chrome_options.add_experimental_option("detach", True)service = Service()browser = webdriver.Chrome(service=service, options=chrome_options)wait = WebDriverWait(browser, 20)def get_products(page):html = browser.page_sourcedoc = pq(html)products = []for item in doc('.goods-list li, .product-list li, .list li, .goods-item, .product-item').items():title = item.find('.title, .name, .pro-title, .text').text()price = item.find('.price, .pro-price, .num').text()img = item.find('img').attr('src') or item.find('img').attr('data-src')link = item.find('a').attr('href')if title and ('空調' in title or '空調' in item.text()):products.append({'title': title,'price': price,'img': img,'link': link})if not products:for a in doc('a').items():text = a.text()if '空調' in text:img = a.find('img').attr('src') or a.find('img').attr('data-src')price = ''parent = a.parent()for p in parent.parents():price = p.find('.price, .pro-price, .num').text()if price:breakproducts.append({'title': text,'price': price,'img': img,'link': a.attr('href')})print(f'第{page}頁空調商品:')for p in products:print(p)return productsdef main():browser.get(f'https://www.mi.com/shop/search?keyword={KEYWORD}')for page in range(1, MAX_PAGE + 1):wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'body')))time.sleep(2)get_products(page)if page < MAX_PAGE:try:page_btn = browser.find_element(By.XPATH, f'//div[contains(@class,"mi-pagenav")]//a[@class="numbers" and text()="{page+1}"]')browser.execute_script("arguments[0].click();", page_btn)time.sleep(2)except Exception as e:print(f'點擊第{page+1}頁失敗:', e)breakbrowser.quit()if __name__ == '__main__':main()

運行爬取截圖:

?

五、關鍵技術詳解

5.1 Selenium 啟動與配置

- 推薦用 Chrome 瀏覽器,需保證 ChromeDriver 版本匹配

- 可選用 Headless 模式,適合服務器環境

- `detach` 選項可讓瀏覽器調試時不自動關閉

5.2 頁面等待與異步加載

- 小米商城商品列表為異步渲染,需用 WebDriverWait 等待元素加載

- `time.sleep()` 可適當延遲,確保頁面渲染完成

5.3 商品數據解析

- 用 PyQuery 解析 HTML,支持 jQuery 風格選擇器

- 兼容多種商品卡片結構,適應頁面變動

- 兜底方案:遍歷所有 a 標簽,抓取帶"空調"字樣的商品

5.4 分頁處理

- 不能直接拼接 URL 翻頁,需模擬點擊分頁按鈕

- 用 XPath 精確定位 `<a class="numbers">`,并用 JS 執行點擊,兼容前端事件綁定

- 每次翻頁后需等待頁面刷新再抓取數據

5.5 異常處理

- 分頁點擊失敗時自動中斷,避免死循環

- 可根據實際需求增加重試機制

5.6 可選:保存到 MongoDB

如需將數據保存到 MongoDB,可參考如下代碼:

import pymongoMONGO_URL = 'localhost'MONGO_DB = 'xiaomi'MONGO_COLLECTION = 'ac_products'client = pymongo.MongoClient(MONGO_URL)db = client[MONGO_DB]def save_to_mongo(result):try:if db[MONGO_COLLECTION].insert_one(result):print('存儲到 MongoDB 成功')except Exception:print('存儲到 MongoDB 失敗')

在 `get_products` 中調用 `save_to_mongo(product)` 即可。

六、Headless 模式與瀏覽器兼容

- Headless 模式適合服務器、云主機等無桌面環境

- 啟用方式:

chrome_options.add_argument('--headless')

- 也可用 Firefox、Edge 等瀏覽器,Selenium 語法基本一致

七、常見問題與優化建議

7.1 反爬機制

- 有些網站如頻繁訪問可能彈出驗證碼

- 有些網站需要登錄才能進行下一步數據獲取,如果有登錄步驟,就需要自己通過Selenium自行實現

- 建議適當延遲、降低抓取頻率

- 可用代理池、賬號池等方式進一步優化

7.2 頁面結構變動

- 商品卡片 class 可能變動,需定期檢查并調整選擇器

- 建議用多種選擇器兜底,提升健壯性

7.3 數據完整性

- 某些商品可能缺少價格、圖片等字段,需容錯處理

- 可用 try/except 或默認值兜底

7.4 性能優化

- Headless 模式+禁用圖片加載可提升速度

- 可用多進程/多線程并發抓取不同關鍵詞

八、總結

????????本文系統講解了如何用 Selenium 自動化爬取小米商城空調商品信息,涵蓋了環境準備、頁面結構分析、自動化腳本實現、數據解析、翻頁處理、異常處理、可選的 MongoDB 存儲、Headless 模式、常見問題與優化建議等內容。通過這種"可見即可爬"的方式,可以高效應對前端動態渲染和復雜 Ajax 的電商頁面,極大提升數據采集的靈活性和穩定性。

????????你可以根據實際需求,擴展腳本支持更多商品類型、更多字段、并發抓取、數據存儲等功能,打造屬于自己的電商數據采集工具。

看到這里了還不給博主點一個:
?? 點贊??收藏 ?? 關注

💛 💙 💜 ?? 💚💓 💗 💕 💞 💘 💖
再次感謝大家的支持!
你們的點贊就是博主更新最大的動力!

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

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

相關文章

聚類分析的原理、常用算法及其應用

聚類分析的原理、常用算法及其應用 一、聚類分析的基本原理 &#xff08;一&#xff09;什么是聚類分析 聚類分析是一種無監督學習方法&#xff0c;其目標是將數據集中的樣本劃分為若干個簇&#xff0c;每個簇包含相似的樣本。聚類分析的核心思想是通過某種相似性度量&#…

Aware和InitializingBean接口以及@Autowired注解失效分析

Aware 接口用于注入一些與容器相關信息&#xff0c;例如&#xff1a; ? a. BeanNameAware 注入 Bean 的名字 ? b. BeanFactoryAware 注入 BeanFactory 容器 ? c. ApplicationContextAware 注入 ApplicationContext 容器 ? d. EmbeddedValueResolverAware 注入 解析器&a…

JDK 安裝與配置

JDK 全稱是 Java SE Development Kit&#xff0c;翻譯成中文就是&#xff1a;Java 標準版開發包&#xff0c;是 Sun 公司&#xff08;后被 Oracle 公司收購&#xff09;專門外 Java 開發人員提供的一套用于開發 Java 應用程序的工具包。 JDK 提供了用于編譯和運行 Java 應用程序…

防火墻來回路徑不一致導致的業務異常

案例拓撲&#xff1a; 拓撲描述&#xff1a; 服務器有2塊網卡&#xff0c;內網網卡2.2.2.1/24 網關2.2.254 提供內網用戶訪問&#xff1b; 外網網卡1.1.1.1/24&#xff0c;外網網關1.1.1.254 80端口映射到公網 這個時候服務器有2條默認路由&#xff0c;分布是0.0.0.0 0.0.0.0 1…

Java面試高頻問題(36-37)

三十六、服務網格核心能力與設計模式 服務網格架構分層模型 mermaid graph TB subgraph 數據平面 ASidecar代理 -->攔截流量 BEnvoy B -->協議轉換 CHTTP/gRPC B -->策略執行 D熔斷/限流 end subgraph 控制平面 E配置中心 -->下發策略 Fistiod F -->證書管理 …

redis數據結構-02(INCR、DECR、APPEND)

字符串操作&#xff1a;INCR、DECR、APPEND Redis 字符串不僅僅是簡單的文本&#xff0c;它們還可以表示數字。此功能使我們能夠直接對存儲在 Redis 中的字符串值執行原子的遞增和遞減操作。此外&#xff0c;Redis 還提供了一種附加到現有字符串的方法&#xff0c;從而可以輕松…

Spring MVC 中Model, ModelMap, ModelAndView 之間有什么關系和區別?

在 Spring MVC 中&#xff0c;Model, ModelMap, 和 ModelAndView 都是用來在 Controller 和 View 之間傳遞數據的&#xff0c;但它們在使用方式和功能上有所不同。 它們的核心在于&#xff1a;Spring MVC 需要知道兩件事來渲染視圖&#xff1a;① 數據 (Model) ② 視圖名稱 (V…

配置Hadoop集群-免密登錄

在 Hadoop 集群中配置免密登錄是確保各節點間高效通信的關鍵步驟。以下是基于 SSH 密鑰認證的免密登錄配置方案&#xff0c;支持主節點&#xff08;NameNode&#xff09;到所有從節點&#xff08;DataNode&#xff09;的無密碼訪問&#xff1a; 1. 環境準備 集群規劃&#xff…

C++類與對象(二):六個默認構造函數(一)

在學C語言時&#xff0c;實現棧和隊列時容易忘記初始化和銷毀&#xff0c;就會造成內存泄漏。而在C的類中我們忘記寫初始化和銷毀函數時&#xff0c;編譯器會自動生成構造函數和析構函數&#xff0c;對應的初始化和在對象生命周期結束時清理資源。那是什么是默認構造函數呢&…

嵌入式培訓之數據結構學習(一)數據結構的基礎概念、線性表

一、基礎概念 1、數據結構&#xff1a;相互之間存在一種或多種特定關系的數據元素的集合。&#xff08;特定關系有邏輯關系與線性關系&#xff09; &#xff08;1&#xff09;邏輯結構 集合&#xff0c;所有數據在同一個集合中&#xff0c;關系平等&#xff08;數組&#xff…

Android Exoplayer 實現多個音視頻文件混合播放以及音軌切換

在之前的文章ExoPlayer中常見MediaSource子類的區別和使用場景中介紹了Exoplayer中各種子MediaSource的使用場景&#xff0c;這篇我們著重詳細介紹下實現多路流混合播放的用法。常見的使用場景有&#xff1a;視頻文件電影字幕、正片視頻廣告視頻、背景視頻背景音樂等。 初始化…

推特逆向算法,推特爬蟲,數據分析,推特關鍵詞搜索

祝大家五一假期快樂&#xff01; 最近推特加了逆向&#xff0c;頻繁出現404&#xff0c;無法正常抓取數據&#xff0c;這里給出推特逆向的思路及代碼&#xff0c;供大家參考學習&#xff01; 本文將介紹如何使用 Python 模擬請求 Twitter 的 GraphQL 接口&#xff0c;結合 re…

圖形化編程平臺的破局之道:從工具同質化到生態差異化

一、同質化困局的底層邏輯剖析 在全球圖形化編程市場中&#xff0c;工具功能趨同已成為行業共識。據 Statista 2024 年數據顯示&#xff0c;主流平臺的基礎功能重合度高達 78%&#xff0c;核心模塊&#xff08;如條件判斷、循環結構&#xff09;的實現方式高度相似。這種現象的…

【Rust】枚舉和模式匹配

目錄 枚舉和模式匹配枚舉的定義Option 枚舉控制流運算符 match簡潔控制流 if let 枚舉和模式匹配 枚舉的定義 結構體給予你將字段和數據聚合在一起的方法&#xff0c;像 Rectangle 結構體有 width 和 height 兩個字段。而枚舉給予你一個途徑去聲明某個值是一個集合中的一員。…

應急響應靶機——WhereIS?

用戶名及密碼&#xff1a;zgsf/zgsf 下載資源還有個解題.exe: 1、攻擊者的兩個ip地址 2、flag1和flag2 3、后門程序進程名稱 4、攻擊者的提權方式(輸入程序名稱即可) 之前的命令&#xff1a; 1、攻擊者的兩個ip地址 先獲得root權限&#xff0c;查看一下歷史命令記錄&#x…

變量函數實戰:高保真APP原型“發票頁面”動態交互教程

變量函數是高保真交互原型設計中常見的高級交互功能&#xff0c;能夠避免重復復制與手動修改頁面元素和邏輯標注&#xff0c;讓演示更有真實體驗感。本文分享一個高保真APP交互原型頁面的實操案例&#xff0c;結合原型設計工具中的變量函數與邏輯判斷功能&#xff0c;手把手教你…

量子加密通信:守護信息安全的未來之盾

摘要 在數字化時代&#xff0c;信息安全成為全球關注的焦點。傳統加密技術面臨著被量子計算破解的風險&#xff0c;而量子加密通信作為一種基于量子力學原理的新型加密技術&#xff0c;提供了理論上無條件安全的通信保障。本文將詳細介紹量子加密通信的基本原理、技術實現、應用…

《Vue.js》閱讀之響應式數據與副作用函數

Vue.js 《Vue.js設計與實現》&#xff08;霍春陽&#xff09; 適合&#xff1a;從零手寫Vue3響應式系統&#xff0c;大廠面試源碼題直接覆蓋。重點章節&#xff1a;第4章&#xff08;響應式&#xff09;、第5章&#xff08;渲染器&#xff09;、第8章&#xff08;編譯器&…

數據處理專題(十三)

學會基本的圖像處理技術。? OpenCV 基礎 實踐&#xff1a;使用 OpenCV 進行圖像讀取、顯示和基本處理? 03 代碼示例 1. 導入必要的庫 import cv2import numpy as npimport matplotlib.pyplot as plt 2. 圖像讀取 # 讀取圖像image_path path_to_your_image.jpg # 替換…

springboot旅游小程序-計算機畢業設計源碼76696

目 錄 摘要 1 緒論 1.1研究背景與意義 1.2研究現狀 1.3論文結構與章節安排 2 基于微信小程序旅游網站系統分析 2.1 可行性分析 2.1.1 技術可行性分析 2.1.2 經濟可行性分析 2.1.3 法律可行性分析 2.2 系統功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系統…