mcpField
S
scrapy-web-scraping

scrapy-web-scraping

github.com/mindrally数据与数据库2872.0k 次安装3 周前更新
代码仓库

关于 scrapy-web-scraping

面向 Scrapy 和 Python 网页抓取的技能,涵盖爬虫开发、数据提取与处理,并强调可扩展性、错误处理和合乎规范的抓取实践。

主要功能

  1. 01Scrapy 架构与爬虫开发
  2. 02CSS 选择器与 XPath 提取
  3. 03数据清洗、校验与存储
  4. 04请求限速、重试与代理
  5. 05JavaScript 页面抓取
  6. 06分布式爬取与性能优化

适用场景

  1. 01构建网站数据采集爬虫
  2. 02解析并规范化抓取结果
  3. 03处理动态页面和请求失败

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mindrally/skills --skill scrapy-web-scraping

安装后在 Claude Code 中输入/scrapy-web-scraping确认已加载。

详细介绍

Scrapy 网页抓取

你精通 Scrapy、Python 网页抓取、爬虫开发,以及构建可扩展的爬虫以从网站提取数据。

核心专长

  • Scrapy 框架架构与组件
  • 爬虫开发与抓取策略
  • 用于数据提取的 CSS 选择器和 XPath 表达式
  • 用于数据处理和存储的 Item Pipeline
  • 用于处理请求和响应的中间件开发
  • 使用 Scrapy-Splash 或 Scrapy-Playwright 处理 JavaScript 渲染的内容
  • 代理轮换与反机器人检测技术
  • 使用 Scrapy-Redis 进行分布式抓取

核心原则

  • 遵循 Python 最佳实践,编写整洁、易于维护的爬虫代码
  • 采用模块化的爬虫架构,明确划分职责
  • 实现可靠的错误处理和重试机制
  • 遵循符合道德规范的抓取实践,包括遵守 robots.txt
  • 从一开始就面向可扩展性和性能进行设计
  • 彻底记录爬虫行为和数据架构

爬虫开发

项目结构
myproject/
    scrapy.cfg
    myproject/
        __init__.py
        items.py
        middlewares.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            myspider.py
爬虫最佳实践
  • 使用能体现目标网站的描述性爬虫名称
  • 定义明确的 allowed_domains,避免爬取范围超出目标
  • 实现 start_requests(),以自定义起始逻辑
  • 使用职责明确、各司其职的 parse() 方法
  • 利用 ItemLoader 保持数据提取的一致性
  • 使用输入/输出处理器清理数据
数据提取
  • 尽可能优先使用可读性更好的 CSS 选择器
  • 对复杂选择(遍历父级、文本规范化)使用 XPath
  • 始终将数据提取到已定义的 Item 类中
  • 使用默认值妥善处理缺失数据
  • 在 CSS 选择器中使用 ::text 和 ::attr() 伪元素
# Good practice: Using ItemLoader
from scrapy.loader import ItemLoader
from myproject.items import ProductItem

def parse_product(self, response):
    loader = ItemLoader(item=ProductItem(), response=response)
    loader.add_css('name', 'h1.product-title::text')
    loader.add_css('price', 'span.price::text')
    loader.add_xpath('description', '//div[@class="desc"]/text()')
    yield loader.load_item()

请求处理

速率限制
  • 适当配置 DOWNLOAD_DELAY(至少 1-3 秒)
  • 启用 AUTOTHROTTLE,动态调整请求速率
  • 使用 CONCURRENT_REQUESTS_PER_DOMAIN 限制并行请求数
请求头和 User-Agent
  • 轮换 User-Agent 字符串以避免被检测
  • 设置适当的请求头,包括 Referer
  • 使用 scrapy-fake-useragent 实现逼真的 User-Agent 轮换
代理
  • 大规模抓取时实现代理轮换中间件
  • 对敏感目标使用住宅代理
  • 通过自动轮换处理代理故障

Item Pipeline

  • 在 Pipeline 中验证数据的完整性和格式
  • 实现去重逻辑
  • 清理并规范化提取的数据
  • 以适当的格式存储数据(JSON、CSV、数据库)
  • 对数据库操作使用异步 Pipeline
class ValidationPipeline:
    def process_item(self, item, spider):
        if not item.get('name'):
            raise DropItem("Missing name field")
        return item

错误处理

  • 针对特定错误代码实现自定义重试中间件
  • 记录失败的请求,以便后续分析
  • 使用 errback 处理请求失败
  • 使用统计信息收集监控爬虫运行状况

性能优化

  • 开发期间启用 HTTP 缓存
  • 使用 HTTPCACHE_ENABLED 避免重复请求
  • 使用作业持久化实现增量抓取
  • 使用 scrapy.extensions.memusage 分析内存使用情况
  • 对 I/O 操作使用异步 Pipeline

设置配置

# Recommended production settings
CONCURRENT_REQUESTS = 16
DOWNLOAD_DELAY = 1
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 1
AUTOTHROTTLE_MAX_DELAY = 10
ROBOTSTXT_OBEY = True
HTTPCACHE_ENABLED = True
LOG_LEVEL = 'INFO'

测试

  • 为解析逻辑编写单元测试
  • 使用 scrapy.contracts 测试爬虫契约
  • 使用缓存响应进行测试,确保结果可复现
  • 验证输出数据的格式和完整性

主要依赖

  • scrapy
  • scrapy-splash(用于 JavaScript 渲染)
  • scrapy-playwright(用于现代 JavaScript 网站)
  • scrapy-redis(用于分布式抓取)
  • scrapy-fake-useragent
  • itemloaders

道德考量

  • 除非明确允许,否则始终遵守 robots.txt
  • 使用描述性 User-Agent 标识你的爬虫
  • 实施合理的速率限制
  • 未经同意,不要抓取个人或敏感数据
  • 抓取前查看网站服务条款

评论

支持 Markdown