1. Scrapy 简介
Scrapy 是一个用 Python 编写的开源 网络爬虫框架,用于高效地从网站提取结构化数据。它提供了完整的爬虫开发工具,包括请求管理、数据解析、存储和异常处理等功能,适用于数据挖掘、监测和自动化测试等场景。
Scrapy 的核心特点
✅ 高性能:基于异步IO(Twisted),支持高并发爬取
✅ 模块化设计:组件可自定义扩展(如下载中间件、管道)
✅ 内置选择器:支持 XPath 和 CSS 选择器解析
✅ 自动化流程:自动处理请求队列、去重、重试
✅ 数据导出:支持 JSON、CSV、数据库存储
2. Scrapy 架构
Scrapy 采用 模块化设计,核心组件包括:
组件 | 作用 |
---|---|
Engine | 控制数据流,协调各组件 |
Scheduler | 管理请求队列,处理去重 |
Downloader | 下载网页内容 |
Spiders | 定义爬取逻辑和数据解析 |
Item Pipeline | 处理提取的数据(清洗、存储) |
Middlewares | 拦截请求/响应(如代理、UA 轮换) |
┌─────────────┐ ┌─────────┐ ┌────────────┐
│ Engine │ → │Scheduler│ → │ Downloader │
└─────────────┘ └─────────┘ └────────────┘
↑ │ ↓
│ └───────┐ │
↓ ↓ ↓
┌─────────────┐ ┌─────────────┐
│ Spiders │ ←─────→ │ Items │
└─────────────┘ └─────────────┘
↓
┌─────────────┐
│ Item Pipeline│
└─────────────┘
3. 快速入门:创建一个 Scrapy 爬虫
步骤 1:安装 Scrapy
pip install scrapy
步骤 2:创建项目
scrapy startproject myproject
cd myproject
scrapy genspider example example.com
步骤 3:编写 Spider
# myproject/spiders/example.py
import scrapy
class ExampleSpider(scrapy.Spider):
name = "example"
start_urls = ["https://example.com"]
def parse(self, response):
# 提取数据
title = response.css("h1::text").get()
yield {"title": title}
# 跟进链接
for link in response.css("a::attr(href)").getall():
yield response.follow(link, callback=self.parse)
步骤 4:运行爬虫
scrapy crawl example -o output.json
4. Scrapy 核心功能详解
(1) 数据建模(Items)
定义结构化数据字段:
# items.py
import scrapy
class ProductItem(scrapy.Item):
name = scrapy.Field()
price = scrapy.Field()
(2) 中间件(Middlewares)
下载中间件:处理请求(如代理、UA 轮换)
# middlewares.py
class CustomProxyMiddleware:
def process_request(self, request, spider):
request.meta["proxy"] = "http://proxy.example.com:8080"
(3) 管道(Pipelines)
数据清洗与存储:
# pipelines.py
class MongoDBPipeline:
def process_item(self, item, spider):
db.collection.insert_one(dict(item))
return item
(4) 选择器(Selectors)
# XPath 示例
response.xpath("//div[@class='price']/text()").get()
# CSS 示例
response.css("div.price::text").get()
5. Scrapy 高级技巧
(1) 动态请求(FormRequest)
yield scrapy.FormRequest(
url="https://example.com/login",
formdata={"user": "admin", "pass": "123"},
callback=self.parse_after_login
)
(2) 并发控制
# settings.py
CONCURRENT_REQUESTS = 16 # 并发请求数
DOWNLOAD_DELAY = 0.5 # 请求延迟
(3) 避免被封禁
随机 User-Agent
USER_AGENTS = ["Mozilla/5.0...", "Chrome/91.0..."]
使用代理 IP:
request.meta["proxy"] = "http://ip:port"
6. Scrapy 实战案例
案例:爬取电商网站商品
class AmazonSpider(scrapy.Spider):
name = "amazon"
start_urls = ["https://www.amazon.com/s?k=laptop"]
def parse(self, response):
for product in response.css("div.s-result-item"):
yield {
"name": product.css("h2 a::text").get(),
"price": product.css(".a-price span::text").get(),
}
next_page = response.css("a.s-pagination-next::attr(href)").get()
if next_page:
yield response.follow(next_page, callback=self.parse)
7. Scrapy 与其他工具对比
工具 | 特点 | 适用场景 |
---|---|---|
Scrapy | 完整框架,高性能,适合大规模爬取 | 结构化数据采集 |
Requests+BS4 | 灵活轻量,学习成本低 | 小规模快速爬取 |
Selenium | 模拟浏览器,适合动态页面 | JS 渲染页面 |
8. 总结
Scrapy 是 Python 生态中最强大的爬虫框架之一,适合:
大规模数据采集
需要自动化管理的爬虫项目
企业级数据挖掘
通过灵活的中间件和管道机制,Scrapy 可以轻松扩展功能(如代理池、分布式爬取)。如果你需要高效、稳定地爬取数据,Scrapy 是最佳选择!
🚀 动手试试吧!
pip install scrapy
scrapy startproject your_project