关于 scrapy-web-scraping
面向 Scrapy 和 Python 网页抓取的技能,涵盖爬虫开发、数据提取与处理,并强调可扩展性、错误处理和合乎规范的抓取实践。
主要功能
- 01Scrapy 架构与爬虫开发
- 02CSS 选择器与 XPath 提取
- 03数据清洗、校验与存储
- 04请求限速、重试与代理
- 05JavaScript 页面抓取
- 06分布式爬取与性能优化
适用场景
- 01构建网站数据采集爬虫
- 02解析并规范化抓取结果
- 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