Python爬蟲(29)Python爬蟲高階:動態頁面處理與云原生部署全鏈路實踐(Selenium、Scrapy、K8s)

目錄

    • 引言:動態爬蟲的技術挑戰與云原生機遇
    • 一、動態頁面處理:Selenium與Scrapy的協同作戰
      • 1.1 Selenium的核心價值與局限
      • 1.2 Scrapy-Selenium中間件開發
      • 1.3 動態分頁處理實戰:京東商品爬蟲
    • 二、云原生部署:Kubernetes架構設計與優化
      • 2.1 為什么選擇Kubernetes?
      • 2.2 架構設計:Scrapy-Redis-K8s三件套
      • 2.3 關鍵配置:Deployment與HPA
        • 2.3.1 deployment.yaml
        • 2.3.2 hpa.yaml
        • 2.3.3 hpa.yaml
      • 2.4 性能優化:瀏覽器資源復用
    • 三、總結
      • 3.1 技術價值總結
      • 3.2 適用場景推薦
      • 3.3 本文技術棧版本說明
      • Python爬蟲相關文章(推薦)

引言:動態爬蟲的技術挑戰與云原生機遇

在Web3.0時代,超過80%的電商、社交和新聞類網站采用動態渲染技術(如React/Vue框架+Ajax異步加載),傳統基于requests的靜態爬蟲已無法應對無限滾動、點擊展開等交互式內容。與此同時,隨著企業級爬蟲項目從單機采集轉向百萬級URL的分布式處理,如何實現爬蟲任務的彈性伸縮、故障自愈與資源優化成為新的技術命題。

本文將結合Selenium、Scrapy與Kubernetes三大技術棧,構建一套完整的動態爬蟲云原生解決方案,涵蓋從頁面渲染到容器編排全鏈路技術實踐

一、動態頁面處理:Selenium與Scrapy的協同作戰

1.1 Selenium的核心價值與局限

Selenium作為瀏覽器自動化工具,通過模擬真實用戶操作(如點擊、滾動、表單提交)完美解決動態渲染問題。其典型應用場景包括:

  • 無限滾動加載:通過driver.execute_script(“window.scrollTo(0, document.body.scrollHeight)”)觸發懶加載
  • 復雜表單交互:處理登錄驗證、驗證碼彈窗等反爬機制
  • JavaScript依賴數據:解析由前端框架渲染的DOM結構

然而,Selenium存在明顯性能瓶頸:

  • 單線程運行模式導致并發能力不足
  • 瀏覽器啟動開銷大(約500ms-2s)
  • 無法直接利用Scrapy的中間件生態

1.2 Scrapy-Selenium中間件開發

為解決上述問題,我們開發了基于Scrapy的Selenium中間件,實現動態渲染與異步爬取的解耦:

# middlewares.py
from selenium import webdriver
from scrapy.http import HtmlResponseclass SeleniumMiddleware:def __init__(self):options = webdriver.ChromeOptions()options.add_argument("--headless")  # 無頭模式options.add_argument("--disable-gpu")self.driver = webdriver.Chrome(options=options)def process_request(self, request, spider):self.driver.get(request.url)# 模擬用戶操作(示例:滾動到底部)self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")# 返回渲染后的HTMLreturn HtmlResponse(url=self.driver.current_url,body=self.driver.page_source,encoding='utf-8',request=request)def spider_closed(self, spider):self.driver.quit()  # 爬蟲退出時關閉瀏覽器

在settings.py中啟用中間件:

DOWNLOADER_MIDDLEWARES = {'myproject.middlewares.SeleniumMiddleware': 543,  # 優先級高于默認中間件
}

1.3 動態分頁處理實戰:京東商品爬蟲

以京東商品列表為例,其分頁邏輯通過JavaScript動態加載:

# spiders/jd_spider.py
import scrapy
from scrapy_redis.spiders import RedisSpiderclass JDProductSpider(RedisSpider):name = 'jd_product'redis_key = 'jd:start_urls'  # 從Redis讀取種子URLdef parse(self, response):# 提取商品數據products = response.css('.gl-item')for product in products:yield {'sku_id': product.attrib['data-sku'],'price': product.css('.p-price i::text').get(),'title': product.css('.p-name em::text').get()}# 處理分頁(Selenium執行)next_page = response.css('a.pn-next::attr(href)').get()if next_page:yield scrapy.Request(url=response.urljoin(next_page))

二、云原生部署:Kubernetes架構設計與優化

2.1 為什么選擇Kubernetes?

傳統爬蟲部署存在以下痛點:

  • 資源利用率低:單機爬蟲無法根據負載動態伸縮
  • 故障恢復慢:單點故障導致任務中斷
  • 運維成本高:手動管理多臺服務器

Kubernetes通過以下特性解決這些問題:

  • 自動擴縮容:基于CPU/內存使用率動態調整Pod數量
  • 滾動更新:無損升級爬蟲版本
  • 服務發現:自動處理節點間通信
  • 自我修復:自動重啟崩潰的容器

2.2 架構設計:Scrapy-Redis-K8s三件套

在這里插入圖片描述

核心組件說明:

  1. Master節點:運行scrapyd-redis調度器,接收來自API的爬取任務
  2. Worker節點:部署Scrapy爬蟲容器,每個容器包含:
  • Selenium無頭瀏覽器
  • Redis客戶端(用于任務去重)
  • 自定義中間件
  1. Redis集群:存儲待爬取URL、去重BloomFilter和爬取結果

2.3 關鍵配置:Deployment與HPA

2.3.1 deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: scrapy-worker
spec:replicas: 3selector:matchLabels:app: scrapy-workertemplate:metadata:labels:app: scrapy-workerspec:containers:- name: scrapyimage: myregistry/scrapy-selenium:v1.0resources:requests:cpu: "500m"memory: "1Gi"limits:cpu: "1000m"memory: "2Gi"env:- name: REDIS_URLvalue: "redis://redis-master:6379/0"
2.3.2 hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: scrapy-worker-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: scrapy-workerminReplicas: 3maxReplicas: 20metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 70
2.3.3 hpa.yaml

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: scrapy-worker-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: scrapy-workerminReplicas: 3maxReplicas: 20metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 70

2.4 性能優化:瀏覽器資源復用

針對Selenium的高資源消耗,我們實現以下優化:

  1. 持久化瀏覽器會話:通過K8s的emptyDir卷保存Chrome用戶數據
  2. 智能請求調度:優先分配相似域名的任務給同一節點
  3. GPU加速:為需要圖像識別的爬蟲配置NVIDIA GPU
# 優化后的中間件
class OptimizedSeleniumMiddleware(SeleniumMiddleware):def __init__(self):super().__init__()self.driver.implicitly_wait(10)  # 減少顯式等待時間# 禁用非必要資源prefs = {"profile.managed_default_content_settings.images": 2,  # 禁止加載圖片"permissions.default.stylesheet": 2  # 禁止加載CSS}self.driver.get("chrome://settings/clearBrowserData")  # 清除緩存

三、總結

3.1 技術價值總結

本方案實現了以下突破:

  1. 動態渲染能力:通過Selenium破解90%的JavaScript依賴網站
  2. 分布式架構:單集群支持500+并發爬蟲實例
  3. 云原生特性:資源利用率提升400%,運維成本降低70%

3.2 適用場景推薦

  1. 電商數據采集:商品價格監控、競品分析
  2. 新聞媒體聚合:多源信息抓取與NLP處理
  3. 金融數據挖掘:上市公司公告、輿情分析

3.3 本文技術棧版本說明

Python 3.12
Scrapy 2.11
Selenium 4.15
Kubernetes 1.28
ChromeDriver 119

本文通過將動態爬蟲與云原生技術深度融合,我們不僅解決了現代Web的數據采集難題,更為企業級爬蟲項目提供了可擴展、高可用的基礎設施范式。

Python爬蟲相關文章(推薦)

Python爬蟲介紹Python爬蟲(1)Python爬蟲:從原理到實戰,一文掌握數據采集核心技術
HTTP協議解析Python爬蟲(2)Python爬蟲入門:從HTTP協議解析到豆瓣電影數據抓取實戰
HTML核心技巧Python爬蟲(3)HTML核心技巧:從零掌握class與id選擇器,精準定位網頁元素
CSS核心機制Python爬蟲(4)CSS核心機制:全面解析選擇器分類、用法與實戰應用
靜態頁面抓取實戰Python爬蟲(5)靜態頁面抓取實戰:requests庫請求頭配置與反反爬策略詳解
靜態頁面解析實戰Python爬蟲(6)靜態頁面解析實戰:BeautifulSoup與lxml(XPath)高效提取數據指南
Python數據存儲實戰 CSV文件Python爬蟲(7)Python數據存儲實戰:CSV文件讀寫與復雜數據處理指南
Python數據存儲實戰 JSON文件Python爬蟲(8)Python數據存儲實戰:JSON文件讀寫與復雜結構化數據處理指南
Python數據存儲實戰 MySQL數據庫Python爬蟲(9)Python數據存儲實戰:基于pymysql的MySQL數據庫操作詳解
Python數據存儲實戰 MongoDB數據庫Python爬蟲(10)Python數據存儲實戰:基于pymongo的MongoDB開發深度指南
Python數據存儲實戰 NoSQL數據庫Python爬蟲(11)Python數據存儲實戰:深入解析NoSQL數據庫的核心應用與實戰
Python爬蟲數據存儲必備技能:JSON Schema校驗Python爬蟲(12)Python爬蟲數據存儲必備技能:JSON Schema校驗實戰與數據質量守護
Python爬蟲數據安全存儲指南:AES加密Python爬蟲(13)數據安全存儲指南:AES加密實戰與敏感數據防護策略
Python爬蟲數據存儲新范式:云原生NoSQL服務Python爬蟲(14)Python爬蟲數據存儲新范式:云原生NoSQL服務實戰與運維成本革命
Python爬蟲數據存儲新維度:AI驅動的數據庫自治Python爬蟲(15)Python爬蟲數據存儲新維度:AI驅動的數據庫自治與智能優化實戰
Python爬蟲數據存儲新維度:Redis Edge近端計算賦能Python爬蟲(16)Python爬蟲數據存儲新維度:Redis Edge近端計算賦能實時數據處理革命
反爬攻防戰:隨機請求頭實戰指南Python爬蟲(17)反爬攻防戰:隨機請求頭實戰指南(fake_useragent庫深度解析)
反爬攻防戰:動態IP池構建與代理IPPython爬蟲(18)反爬攻防戰:動態IP池構建與代理IP實戰指南(突破95%反爬封禁率)
Python爬蟲破局動態頁面:全鏈路解析Python爬蟲(19)Python爬蟲破局動態頁面:逆向工程與無頭瀏覽器全鏈路解析(從原理到企業級實戰)
Python爬蟲數據存儲技巧:二進制格式性能優化Python爬蟲(20)Python爬蟲數據存儲技巧:二進制格式(Pickle/Parquet)性能優化實戰
Python爬蟲進階:Selenium自動化處理動態頁面Python爬蟲(21)Python爬蟲進階:Selenium自動化處理動態頁面實戰解析
Python爬蟲:Scrapy框架動態頁面爬取與高效數據管道設計Python爬蟲(22)Python爬蟲進階:Scrapy框架動態頁面爬取與高效數據管道設計
Python爬蟲性能飛躍:多線程與異步IO雙引擎加速實戰Python爬蟲(23)Python爬蟲性能飛躍:多線程與異步IO雙引擎加速實戰(concurrent.futures/aiohttp)
Python分布式爬蟲架構實戰:Scrapy-Redis億級數據抓取方案設計Python爬蟲(24)Python分布式爬蟲架構實戰:Scrapy-Redis億級數據抓取方案設計
Python爬蟲數據清洗實戰:Pandas結構化數據處理全指南Python爬蟲(25)Python爬蟲數據清洗實戰:Pandas結構化數據處理全指南(去重/缺失值/異常值)
Python爬蟲高階:Scrapy+Selenium分布式動態爬蟲架構實踐Python爬蟲(26)Python爬蟲高階:Scrapy+Selenium分布式動態爬蟲架構實踐
Python爬蟲高階:雙劍合璧Selenium動態渲染+BeautifulSoup靜態解析實戰Python爬蟲(27)Python爬蟲高階:雙劍合璧Selenium動態渲染+BeautifulSoup靜態解析實戰
Python爬蟲高階:Selenium+Splash雙引擎渲染實戰與性能優化Python爬蟲(28)Python爬蟲高階:Selenium+Splash雙引擎渲染實戰與性能優化

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

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

相關文章

數據結構(十)——排序

一、選擇排序 1.簡單選擇排序 基本思想:假設排序表為[1,…,n],第i趟排序即從[i,…,n]中選擇關鍵字最小的元素與L[i]交換 eg:給定關鍵字序列{87,45,78,32,17,65,53&…

小結:jvm 類加載過程

類加載過程 是Java虛擬機(JVM)將字節碼文件(.class文件)加載到內存中,并轉換為運行時數據結構的過程。這個過程可以分為多個步驟,每個步驟都有其特定的任務和目的。根據你提供的信息,以下是類加…

2024 山東省ccpc省賽

目錄 I(簽到) 題目簡述: 思路: 代碼: A(二分答案) 題目簡述: 思路: 代碼: K(構造) 題目: 思路: 代…

turn.js與 PHP 結合使用來實現 PDF 文件的頁面切換效果

將 Turn.js 與 PHP 結合使用來實現 PDF 文件的頁面切換效果,你需要一個中間步驟將 PDF 轉換為 Turn.js 可以處理的格式(如 HTML 頁面或圖片)。以下是實現這一功能的步驟和示例代碼: 步驟 1: 安裝必要的庫 首先,你需要…

Python實現NOA星雀優化算法優化卷積神經網絡CNN回歸模型項目實戰

說明:這是一個機器學習實戰項目(附帶數據代碼文檔視頻講解),如需數據代碼文檔視頻講解可以直接到文章最后關注獲取。 1.項目背景 在當今數據驅動的時代,卷積神經網絡(CNN)不僅在圖像分類任務中…

(面試)View相關知識

1、View繪制流程 onMeasure() 確定View的測量寬高。onLayout() 確定View的最終寬高和四個頂點的位置。onDraw() 將View 繪制到屏幕上。 2、MeasureSpec有三種測量模式: 2.1. EXACTLY(精確模式) 含義:父容器明確指定了子View的精…

數組名既可作為指針也可作為變量名

在C語言中,數組名在不同的上下文中既可以作為指向數組首個元素的指針,也可以代表整個數組,這是由C語言的設計和語法規則決定的,下面我來詳細解釋一下。 1. 數組名作為指向首元素的指針 在大多數情況下,當數組名出現在…

Java異常、泛型與集合框架實戰:從基礎到應用

在Java編程的世界里,異常處理、泛型和集合框架是構建高效、健壯應用的關鍵技術。通過掌握這些技術,我們可以更好地管理程序運行時的錯誤,提高代碼的復用性和類型安全性。今天,我將通過一系列實驗,分享如何在Java中使用…

Spring源碼之解決循環依賴 三級緩存

目錄 三級緩存核心原理 循環依賴的解決過程 1. Bean A創建過程中提前曝光工廠 2. Bean B創建時發現依賴A,從緩存獲取 3. Bean A繼續完成初始化 三級緩存的作用總結 二級緩存為何不夠解決緩存依賴? 三級緩存如何解決? 為什么不直接在…

K8S Ingress 實現AB測試、藍綠發布、金絲雀(灰度)發布

假設有如下三個節點的 K8S 集群: ? k8s31master 是控制節點 k8s31node1、k8s31node2 是工作節點 容器運行時是 containerd 一、場景分析 閱讀本文,默認您已經安裝了 Ingress Nginx。 1)A/B 測試 A/B 測試基于用戶請求的元信息將流量路由…

深入理解構造函數,析構函數

目錄 1.引言 2.構造函數 1.概念 2.特性 3.析構函數 1.概念 2.特性 1.引言 如果一個類中什么都沒有,叫作空類. class A {}; 那么我們這個類中真的是什么都沒有嗎?其實不是,如果我們類當中上面都不寫.編譯器會生成6個默認的成員函數。 默認成員函數:用戶沒有顯…

Oracle 11.2.0.4 pre PSU Oct18 設置SSL連接

Oracle 11.2.0.4 pre PSU Oct18 設置SSL連接 1 說明2 客戶端配置jdk環境3服務器檢查oracle數據庫補丁4設置ssla 服務器配置walletb 上傳測試腳本和配置文件到客戶端c 服務器修改數據庫偵聽和sqlnet.orad 修改客戶端的sqlnet.ora和tnsnames.ora的連接符e 修改java代碼的數據連接…

BrepGen中的幾何特征組裝與文件保存詳解 deepwiki occwl OCC包裝庫

有這種好東西我怎么不知道 AutodeskAILab/occwl: Lightweight Pythonic wrapper around pythonocc 組裝幾何特征以創建B-rep模型 保存為STEP和STL文件細說 Fast 快速 Searched across samxuxiang/BrepGen Ill explain how BrepGen assembles geometric features to create B-r…

重慶 ICPC 比賽游記

2025.5.9 比賽前一天晚上,激動地睡不著覺,起來收拾了好多東西。(其實就四本書,剩下的全是零食……關鍵在于這四本書基本沒用。) 2025.5.10 學校喪心病狂的讓我們 6:20 到校門口集合坐車(據說是怕趕不上比…

0x08.Redis 支持事務嗎?如何實現?

回答重點 Redis 支持事務,但它的事務與 MySQL 等關系型數據庫的事務有著本質區別。MySQL 中的事務嚴格遵循 ACID 特性,而 Redis 中的事務主要保證的是命令執行的原子性和隔離性,即所有命令在一個不可分割的操作中順序執行,不會被其他客戶端的命令請求所打斷。 最關鍵的區…

佰力博科技與您探討表面電阻的測試方法及應用領域

表面電阻測試是一種用于測量材料表面電阻值的技術,廣泛應用于評估材料的導電性能、靜電防護性能以及絕緣性能。 1、表面電阻的測試測試方法: 表面電阻測試通常采用平行電極法、同心圓電極法和四探針法等方法進行。其中,平行電極法通過在試樣…

數據庫的規范化設計方法---3種范式

第一范式(1NF):確保表中的每個字段都是不可分割的基本數據項。 第二范式(2NF):在滿足1NF的基礎上,確保非主屬性完全依賴于主鍵。 第三范式(3NF):在滿足2NF的基…

產品經理入門(2)產品體驗報告

產品體驗報告大綱:重點在產品體驗——優點。 1.產品概括 可以從各大平臺搜產品介紹。 2.市場分析 按照產品方向分析各個指標——包括有效使用時間,市場規模等。 3. 用戶分析——對用戶通過各項指標畫像。 4.產品體驗——對各項功能與設計的體驗。 5.報告總結

[Java][Leetcode simple] 13. 羅馬數字轉整數

一、自己想的 只有提到的六種情況是-&#xff0c;其他都是 public int romanToInt1(String s) {int res 0;int n s.length();Map<Character, Integer> map new HashMap<>();map.put(I, 1);map.put(V, 5);map.put(X, 10);map.put(L, 50);map.put(C, 100);map.pu…

如何在 CentOS 7 虛擬機上配置靜態 IP 地址并保持重啟后 SSH 連接

在使用 CentOS 7 的虛擬機時&#xff0c;我們通常需要配置靜態 IP 地址&#xff0c;以確保在每次虛擬機重啟后能夠通過 SSH 連接。本文將介紹如何在 CentOS 7 系統中配置靜態 IP 地址&#xff0c;并確保配置在系統重啟后依然生效。 步驟 1&#xff1a;檢查虛擬機網絡接口 首先…