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.mzph.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;检查虚拟机网络接口 首先…