当前位置: 首页 > news >正文

Python爬虫(26)Python爬虫高阶:Scrapy+Selenium分布式动态爬虫架构实践

目录

      • 一、背景:动态爬虫的工程化挑战
      • 二、技术架构设计
        • 1. 系统架构图
        • 2. 核心组件交互
      • 三、环境准备与项目搭建
        • 1. 安装依赖库
        • 2. 项目结构
      • 四、核心模块实现
        • 1. Selenium集成到Scrapy(中间件开发)
        • 2. 分布式配置(settings.py)
      • 五、实战:电商平台全站爬虫开发
        • 1. 爬虫逻辑(product_spider.py)
        • 2. 动态分页处理
        • 3. 分布式任务分发
      • 六、高级优化策略
        • 1. 浏览器资源复用
        • 2. 智能请求调度
      • 七、总结
        • 1. 技术优势
        • 2. 性能指标对比
        • Python爬虫相关文章(推荐)

一、背景:动态爬虫的工程化挑战

在大规模数据采集场景中,爬虫开发者面临双重技术挑战:

  1. ‌动态交互难题‌:超过60%的现代网站采用JavaScript动态渲染内容(如无限滚动、异步分页、登录验证)
  2. ‌分布式扩展需求‌:单机爬虫难以应对百万级页面的抓取任务,需实现:
  • 任务队列共享
  • 节点状态协同
  • 数据去重聚合

‌技术方案选型‌:

  • ‌Scrapy‌:Python生态最成熟的异步爬虫框架,具备可扩展架构
  • ‌Selenium‌:浏览器自动化工具,破解动态交互的黄金钥匙
  • ‌Scrapy-Redis‌:基于Redis的分布式扩展组件,实现任务分发与状态同步

二、技术架构设计

1. 系统架构图
┌─────────────┐     ┌─────────────┐
│  Master节点 │◄───►│   RedisDB   │
└─────────────┘     └─────────────┘▲                 ▲│                 │
┌───────┴───────┐ ┌───────┴───────┐
│  Worker节点1  │ │  Worker节点N  │
└───────────────┘ └───────────────┘
2. 核心组件交互
  • ‌Selenium‌:嵌入Scrapy下载器,执行页面渲染与交互
  • ‌Scrapy-Redis‌
    • RedisScheduler:中央任务调度
    • RedisPipeline:数据统一存储
    • BloomFilter:分布式去重

三、环境准备与项目搭建

1. 安装依赖库
pip install scrapy selenium scrapy-redis redis
# 下载对应版本的浏览器驱动(如chromedriver)
2. 项目结构
dynamic_spider/
├── scrapy.cfg
└── dynamic_spider/├── middlewares.py    # 自定义中间件├── settings.py       # 分布式配置├── items.py          # 数据模型├── pipelines.py      # Redis管道└── spiders/└── product_spider.py  # 爬虫逻辑

四、核心模块实现

1. Selenium集成到Scrapy(中间件开发)
# middlewares.py
from selenium import webdriver
from scrapy.http import HtmlResponseclass SeleniumMiddleware:def __init__(self):options = webdriver.ChromeOptions()options.add_argument("--headless")  # 无头模式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)
2. 分布式配置(settings.py)
# 启用Scrapy-Redis组件
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 300}# Redis连接配置
REDIS_URL = 'redis://:password@127.0.0.1:6379/0'

五、实战:电商平台全站爬虫开发

1. 爬虫逻辑(product_spider.py)
import scrapy
from scrapy_redis.spiders import RedisSpiderclass ProductSpider(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))
2. 动态分页处理
# 在中间件中增加分页逻辑
def process_request(self, request, spider):self.driver.get(request.url)# 自动滚动加载(最多滚动5次)for _ in range(5):self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")time.sleep(1)# 点击"加载更多"按钮try:load_more = self.driver.find_element(By.CSS_SELECTOR, '.load-more')load_more.click()time.sleep(2)except NoSuchElementException:passreturn HtmlResponse(...)
3. 分布式任务分发
# Master节点推送初始任务
redis-cli lpush jd:start_urls "https://www.jd.com/search?keyword=手机"# 启动多个Worker节点
scrapy runspider product_spider.py

六、高级优化策略

1. 浏览器资源复用
# 使用浏览器池提升性能
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.desired_capabilities import DesiredCapabilitiesclass BrowserPool:def __init__(self, size=5):self.browsers = []for _ in range(size):options = Options()options.add_argument("--disable-gpu")driver = webdriver.Remote(command_executor='http://localhost:4444/wd/hub',options=options)self.browsers.append(driver)
2. 智能请求调度
# 根据页面类型动态选择渲染方式
def process_request(self, request, spider):if request.meta.get('need_js'):# 需要JS渲染的页面return self.selenium_render(request)else:# 静态页面直接使用Scrapy下载return None

七、总结

1. 技术优势
  1. ‌动态渲染全覆盖‌:通过Selenium处理任意复杂度交互
  2. ‌横向扩展能力‌:基于Redis轻松实现百节点级分布式集群
  3. ‌资源利用率提升‌:浏览器池技术降低85%的初始化开销
2. 性能指标对比
方案每秒请求数内存占用JS兼容性
纯Scrapy120+
Scrapy+Splash40-60
Scrapy+Selenium分布式80-100
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自动化处理动态页面实战解析
http://www.xdnf.cn/news/430219.html

相关文章:

  • MLA (Multi-head Attention Layer) 详细说明
  • 报告研读:125页2024年大模型轻量化技术研究报告——技术详细讲解【附全文阅读】
  • 9、Activiti-任务(Task)的相关操作
  • 深入浅出MySQL 8.0:新特性与最佳实践
  • java基础-方法的重写、super关键字
  • NVMe学习资料汇总
  • 浅析AI大模型为何需要向量数据库?从记忆存储到认知进化
  • AI Agent开发第65课-DIFY和企业现有系统结合实现高可配置的智能零售AI Agent(下)
  • 2025年,大模型LLM还有哪些可研究的方向?
  • Mac上安装Mysql的详细步骤及配置
  • Python核心数据类型全解析:字符串、列表、元组、字典与集合
  • 在C#中使用YOLO的几种方式
  • 代码仓提交分支规范
  • docker安装mysql8, 字符集,SQL大小写规范,sql_mode
  • G1JVM内存分配机制详解
  • 华秋2025电子设计与制造技术研讨会(华东站)成功举办!
  • 合合信息上线智能文档处理领域首批MCP服务,助力企业快速搭建Agent
  • paimon中批和流查看过去的快照的数据及变动的数据
  • #S4U2SELF#S4U2Proxy#CVE-2021-42278/42287以及手动复现
  • 脑机接口技术:开启人类与机器融合的新时代
  • 《从像素到身份:Flutter如何打通社交应用人脸识别的技术闭环》
  • 本地缓存的三种实现
  • 检索增强生成(RAG)简介
  • Codeforces Round 998 (Div. 3)
  • STM32F103_LL库+寄存器学习笔记22 - 基础定时器TIM实现1ms周期回调
  • 深入浅出:C++数据处理类与计算机网络的巧妙类比
  • Oracle OCP认证考试考点详解083系列15
  • CVE-2016-4977 漏洞深度分析
  • TensorFlow之微分求导
  • 力扣-101.对称二叉树