Python爬虫(22)Python爬虫进阶:Scrapy框架动态页面爬取与高效数据管道设计

news2025/5/10 6:30:40

目录

      • 一、背景:Scrapy在现代爬虫中的核心价值
      • 二、Scrapy项目快速搭建
        • 1. 环境准备与项目初始化
        • 2. 项目结构解析
      • 三、动态页面处理:集成Splash与中间件
        • 1. 配置Splash渲染服务(Docker部署)
        • 2. 修改settings.py启用中间件
        • 3. 在Spider中处理JavaScript渲染
      • 四、Scrapy核心组件深度解析
        • 1. Spider类:爬虫逻辑中枢
        • 2. Item管道:数据流处理核心
      • 五、性能优化与反爬策略
        • 1. 并发控制与限速
        • 2. 中间件扩展:随机User-Agent
        • 3. IP代理池集成
      • 六、总结与扩展方向
        • 1. 技术优势
        • 2. 典型应用场景
        • 3. 提示‌
        • Python爬虫相关文章(推荐)

一、背景:Scrapy在现代爬虫中的核心价值

随着Web应用复杂度提升,传统爬虫工具(如requests+BeautifulSoup)在应对以下场景时面临瓶颈:

  • ‌多层级页面抓取‌(如电商分类→列表→详情页)
  • ‌分布式任务调度与去重‌
  • ‌动态内容渲染‌(JavaScript/Ajax加载)
  • ‌数据清洗与存储自动化‌

Scrapy作为Python生态中‌专业级爬虫框架‌,通过模块化设计提供完整解决方案:

  • 内置高性能请求调度引擎
  • 支持中间件扩展(动态页面渲染/IP代理)
  • 结构化数据管道(Item Pipeline)
  • 原生支持分布式扩展(Redis/Kafka)

二、Scrapy项目快速搭建

1. 环境准备与项目初始化
# 安装Scrapy及动态渲染依赖
pip install scrapy scrapy-splash selenium

# 创建爬虫项目
scrapy startproject product_spider
cd product_spider
scrapy genspider amazon amazon.com

2. 项目结构解析
product_spider/
├── scrapy.cfg
└── product_spider/
    ├── items.py         # 数据模型定义
    ├── middlewares.py   # 中间件扩展(动态渲染/代理)
    ├── pipelines.py     # 数据管道处理
    ├── settings.py      # 全局配置
    └── spiders/         # 爬虫逻辑
        └── amazon.py

三、动态页面处理:集成Splash与中间件

1. 配置Splash渲染服务(Docker部署)
docker run -p 8050:8050 scrapinghub/splash

2. 修改settings.py启用中间件
# 启用Splash下载中间件
DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
}

# 配置Splash服务地址
SPLASH_URL = 'http://localhost:8050'

# 启用去重过滤
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'

3. 在Spider中处理JavaScript渲染
import scrapy
from scrapy_splash import SplashRequest

class AmazonSpider(scrapy.Spider):
    name = 'amazon'
    
    def start_requests(self):
        url = 'https://www.amazon.com/s?k=python+books'
        yield SplashRequest(
            url, 
            args={'wait': 2, 'timeout': 90},  # 等待页面渲染
            endpoint='render.html'
        )

    def parse(self, response):
        # 提取动态加载的商品列表
        products = response.css('div[data-component-type="s-search-result"]')
        for product in products:
            yield {
                'title': product.css('h2 a::text').get(),
                'price': product.css('.a-price span::text').get(),
                'rating': product.css('i.a-icon-star-small span::text').get()
            }

四、Scrapy核心组件深度解析

1. Spider类:爬虫逻辑中枢
class BookSpider(scrapy.Spider):
    name = 'book'
    allowed_domains = ['example.com']
    custom_settings = {
        'CONCURRENT_REQUESTS': 16,  # 并发优化
        'AUTOTHROTTLE_ENABLED': True  # 自动限速
    }

    def start_requests(self):
        # 多入口配置
        urls = [
            'https://example.com/category/programming',
            'https://example.com/category/data-science'
        ]
        for url in urls:
            yield scrapy.Request(url, callback=self.parse_category)

    def parse_category(self, response):
        # 分页处理
        total_pages = response.css('.pagination::attr(data-pages)').get()
        for page in range(1, int(total_pages)+1):
            yield SplashRequest(
                f"{response.url}?page={page}", 
                callback=self.parse_product_list
            )

    def parse_product_list(self, response):
        # 详情页跳转
        detail_links = response.css('.product-card a::attr(href)').getall()
        for link in detail_links:
            yield response.follow(link, self.parse_product_detail)

    def parse_product_detail(self, response):
        # 数据提取
        yield {
            'ISBN': response.css('#isbn::text').get(),
            'description': response.xpath('//div[@id="description"]/text()').get(),
            'author': response.css('.author-info::text').get()
        }

2. Item管道:数据流处理核心
# items.py
import scrapy
from itemloaders.processors import TakeFirst, MapCompose

class BookItem(scrapy.Item):
    title = scrapy.Field(
        input_processor=MapCompose(str.strip),
        output_processor=TakeFirst()
    )
    price = scrapy.Field(
        input_processor=MapCompose(lambda x: x.replace('$', '')),
        output_processor=TakeFirst()
    )
    stock = scrapy.Field(output_processor=TakeFirst())

# pipelines.py
from itemadapter import ItemAdapter
import pymongo

class MongoPipeline:
    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE')
        )

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def close_spider(self, spider):
        self.client.close()

    def process_item(self, item, spider):
        self.db['books'].insert_one(ItemAdapter(item).asdict())
        return item

# settings.py激活管道
ITEM_PIPELINES = {
    'product_spider.pipelines.MongoPipeline': 300,
}

五、性能优化与反爬策略

1. 并发控制与限速
# settings.py
CONCURRENT_REQUESTS = 32      # 全局并发数
DOWNLOAD_DELAY = 0.25         # 基础下载延迟
AUTOTHROTTLE_START_DELAY = 5  # 动态限速初始延迟

2. 中间件扩展:随机User-Agent
# middlewares.py
from fake_useragent import UserAgent

class RandomUserAgentMiddleware:
    def process_request(self, request, spider):
        request.headers['User-Agent'] = UserAgent().random

3. IP代理池集成
# settings.py
PROXY_POOL_ENABLED = True

# middlewares.py
class ProxyMiddleware:
    def process_request(self, request, spider):
        request.meta['proxy'] = 'http://proxy_server:port'

六、总结与扩展方向

1. 技术优势
  • 工程化架构‌:模块化设计支持大型项目开发
  • 动态渲染支持‌:通过Splash/Selenium中间件突破
  • ‌数据流控制‌:Item Pipeline实现清洗→验证→存储全链路管理
2. 典型应用场景
  1. 需要登录认证的爬虫系统
  2. 分布式商品价格监控
  3. 社交媒体动态信息采集
  4. 搜索引擎结果抓取
3. 提示‌
  1. 优先使用网站官方API(若有)
  2. 遵守robots.txt协议设置DOWNLOAD_DELAY
  3. 关键数据存储增加MD5去重校验
  4. 使用scrapy shell进行快速调试
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.coloradmin.cn/o/2372083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PDF文档解析新突破:图表识别、公式还原、手写字体处理,让AI真正读懂复杂文档!

要想LLM大模型性能更佳,我们需要喂给模型看得懂的高质量数据。那有没有一种方法,能让我们把各种文档“读懂”,再喂给大模型使用呢? 如果你用传统OCR工具直接从PDF中提取文本,结果往往是乱序、缺失、格式错乱。因为实际…

Redis 主从复制集群搭建教程

目录 为什么要搭建 Redis 主从复制集群?搭建 Redis 主从复制集群前提条件步骤一:创建 Docker 网络步骤二:启动 Redis 主节点步骤三:启动 Redis 从节点步骤四:验证复制状态步骤五:使用 Python 连接 Redis 集…

共模电感在开关电源交流侧的应用原理与原因

在开关电源的设计中,共模电感是一个关键的电子元件,它常被连接在开关电源的交流一侧。然而,很多人虽然对共模电感并不陌生,但对于它为何要接在交流一侧,可能并没有深入理解。接下来,我们将详细探讨共模电感…

MySQL——七、索引

优势:极高查询效率;极高排序效率 劣势:占用磁盘空间;降低更新表的速度(可忽略,磁盘相对便宜;增删改比例较小) 索引结构 MYSQL的索引是在存储引擎层实现的,不同的存储引…

HTML应用指南:利用POST请求获取全国德邦快递服务网点位置信息

德邦快递作为中国领先的综合性物流服务提供商,自1996年成立以来,始终致力于为客户提供高效、安全的大件快递及其他物流解决方案。德邦快递凭借其强大的直营模式、“最后一公里”的优质服务以及对科技的持续投入,在竞争激烈的物流市场中占据了重要位置。特别是在大件快递领域…

高级可视化图表分析实践——以《大侠立志传》武器系统为例

高级可视化图表分析实践——以《大侠立志传》武器系统为例 引言武器类型分布矩形树图结论 不同品质/类别武器的攻击力分布情况蜂群图分析结论 武器来源桑基图分析结论 武器附加属性词云图分析结论 不同品级武器装备熟练度要求/特质要求离散热力图结论品质与熟练度的正相关性品质…

RoPE长度外推:外插内插

RoPE:假定 α \alpha α是定值 其中一半位置是用cos表示的 cos ⁡ ( k α − 2 i d ) \cos(k\alpha^{-\frac{2i}{d}}) cos(kα−d2i​)(另一半是sin)(d是词嵌入维度) 当太长如何解决: 1 直接不管—外插 缺点:超过一定长度性能急剧下降。(较大时,对应的很多位置编码…

【C++进阶】第2课—多态

文章目录 1. 认识多态2. 多态的定义和实现2.1 构成多态的必要条件2.2 虚函数2.3 虚函数的重写或覆盖2.4 协变(了解)2.5 析构函数的重写2.6 override和final关键字2.7 重载、重写、隐藏对比 3. 纯虚函数和抽象类4. 多态原理4.1 虚函数表指针4.2 多态的实现4.3 静态绑定和动态绑定…

RSS 2025|斯坦福提出「统一视频行动模型UVA」:实现机器人高精度动作推理

导读 在机器人领域,让机器人像人类一样理解视觉信息并做出精准行动,一直是科研人员努力的方向。今天,我们要探讨的统一视频行动模型(Unified Video Action Model,UVA),就像给机器人装上了一个“…

第十六届蓝桥杯B组第二题

当时在考场的时候这一道题目 无论我是使用JAVA的大数(BIGTHGER)还是赛后 使用PY 都是没有运行出来 今天也是突发奇想在B站上面搜一搜 看了才知道这也是需要一定的数学思维 通过转换 设X来把运算式精简化 避免运行超时 下面则是代码 public class lanba…

Android Studio 中使用 SQLite 数据库开发完整指南(Kotlin版本)

文章目录 1. 项目准备1.1 创建新项目1.2 添加必要依赖 2. 数据库设计3. 实现数据库3.1 创建实体类 (Entity)3.2 创建数据访问对象 (DAO)3.3 创建数据库类 4. 创建 Repository5. 创建 ViewModel6. 实现 UI 层6.1 创建笔记列表 Activityactivity_notes_list.xmlNotesListActivity…

Spring 框架实战:如何实现高效的依赖注入,优化项目结构?

Spring 框架实战:如何实现高效的依赖注入,优化项目结构? 在当今的 Java 开发领域,Spring 框架占据着举足轻重的地位。而依赖注入作为 Spring 的核心概念之一,对于构建高效、灵活且易于维护的项目结构有着关键作用。本…

C++ learning day 01

目录 1. iostream : 2.第一个C++程序 3. 执行过程以及以上例子详解(以上例子为参考) 1. iostream : 全称: input/output stream library 作用: 用于处理输入输出操作 2.第一个C++程序 #include <iostream>int main() {std::cout << "Hello World! &qu…

李沐《动手学深度学习》 | 多层感知机

文章目录 感知机模型《深度学习入门》的解释训练感知机损失函数的选择感知机的收敛定理&#xff1a;什么时候能够停下来&#xff0c;是不是真的可以停下来感知机的不足 多层感知模型案例引入隐藏层从线性到非线性单隐藏层-单分类案例多隐藏层 激活函数softmax函数溢出的问题 多…

vue教程(vuepress版)

Vue 完全指南 项目介绍 这是一个系统化的 Vue.js 学习教程&#xff0c;采用循序渐进的方式&#xff0c;帮助开发者从零开始掌握 Vue 开发技能。 教程特点 循序渐进: 从 Vue 基础概念开始&#xff0c;逐步深入到高级特性&#xff0c;适合不同层次的开发者学习实战驱动: 结合…

【网络原理】深入理解HTTPS协议

本篇博客给大家带来的是网络原理的知识点,本篇解释了为什么有HTTP还要发展HTTPS协议. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅…

Linux上将conda环境VLLM服务注册为开机自启

这里写目录标题 一、Systemd服务方式1、编写启动脚本2、保存脚本并赋予权限3、创建 systemd 服务单元文件3、 启用并测试服务4、停止systemd服务 二、Crontab方式1、编辑crontab文件2、添加开机启动任务 参考链接 项目需要vllm进行模型支撑&#xff0c;所以需要做成开机自启保证…

k8s的pod挂载共享内存

k8s的pod挂载共享内存&#xff0c;限制不生效问题&#xff1a; 注&#xff1a;/dev/shm 是 Linux 系统中用于共享内存的特殊路径。通过将 emptyDir 的 medium 设置为 Memory&#xff0c;可以确保 /dev/shm 正确地挂载到一个基于内存的文件系统&#xff0c;从而实现高效的共享内…

ubuntu创建虚拟环境安装ultralytics

安装Python和pip&#xff08;如果尚未安装&#xff09;: sudo apt update sudo apt install python3 python3-pip 安装virtualenv: sudo pip3 install virtualenv 创建虚拟环境: sudo virtualenv -p python3 myenv 这里myenv是虚拟环境的名称&#xff0c;-p python3指定使用…

【掌握 DDL】:SQL 中的数据库与表管理

掌握 DDL&#xff1a;SQL 中的数据库与表管理 掌握 DDL&#xff1a;SQL 中的数据库与表管理数据库 DDL创建数据库查看数据库查看所有数据库查看数据库创建语句 进入数据库删除数据库备份数据库备份恢复 查看数据库连接深入理解数据库创建与删除数据库字符集与校验规则 表 DLL创…