🕷 Scrapy:强大的爬虫框架
Scrapy 是 Python 中最强大的爬虫框架之一,适合构建结构化、可扩展的网页抓取项目。它内建异步机制,效率高,适合中大型项目。
✅ Scrapy 解决了什么问题?
使用 requests + BeautifulSoup
虽简单,但:
- 缺少项目结构管理
- 无队列调度系统
- 无法自动限速重试、并发控制
- 难以维护复杂抓取逻辑
Scrapy 则提供:
- 🗂 完善项目结构
- 🔄 高效异步调度与爬取队列
- 💾 自动保存、导出数据
- 🧱 扩展中间件、管道处理等模块
⚙ 安装 Scrapy
pip install scrapy
📁 创建 Scrapy 项目
scrapy startproject myspider
创建后结构:
myspider/
├── myspider/
│ ├── __init__.py
│ ├── items.py # 定义要抓取的数据结构
│ ├── middlewares.py # 请求/响应中间件
│ ├── pipelines.py # 数据处理管道
│ ├── settings.py # 项目配置
│ └── spiders/ # 爬虫文件目录
│ └── example.py # 示例爬虫
└── scrapy.cfg # 配置入口文件
🕸 编写一个简单爬虫
在 spiders/
下创建 quotes.py
:
从 scrapy 导入 Spider
类 名言爬虫(Spider):
名称 = "名言"
起始网址 = ["https://quotes.toscrape.com"]
定义 解析(self, 响应):
对于 quote 在 响应.css("div.quote"):
yield {
"文本": quote.css("span.text::text").get(),
"作者": quote.css("small.author::text").get(),
}
🚀 运行爬虫
scrapy crawl quotes
💾 保存数据到文件
scrapy crawl quotes -o quotes.json
支持格式:
.json
.csv
.xml
.jl
(JSON Lines)
🧰 核心概念概览
概念 | 说明 |
---|---|
Spider | 爬虫类,定义要爬哪些页面、如何解析 |
Item | 抽象出数据结构(可选) |
Pipeline | 定义抓取后如何处理数据(保存到文件、数据库等) |
Selector | 内建选择器(支持 XPath、CSS) |
Downloader Middleware | 请求/响应钩子处理 |
Scheduler | 管理请求队列和去重 |
🔄 自动翻页爬取
定义 解析(self, 响应):
对于 quote 在 响应.css("div.quote"):
yield {
"文本": quote.css("span.text::text").get(),
"作者": quote.css("small.author::text").get(),
}
下一页 = 响应.css("li.next a::attr(href)").get()
如果 下一页 是 不为空:
yield 响应.跟进(响应.网址加入(下一页), 回调=self.解析)
🔒 避免反爬:自定义 Headers
自定义头 = {
"用户代理": "Mozilla/5.0 ..."
}
yield scrapy.请求(网址, 头=自定义头)
🔧 配置文件设置(settings.py)
# 并发请求数
CONCURRENT_REQUESTS = 8
# 延迟(防止封 IP)
DOWNLOAD_DELAY = 1
# 禁用 robots.txt 遵守
ROBOTSTXT_OBEY = False
# 默认请求头设置
DEFAULT_REQUEST_HEADERS = {
"User-Agent": "MySpiderBot",
}
📦 管道示例:保存到 JSON 文件
class SaveJsonPipeline:
def process_item(self, item, spider):
with open("quotes.txt", "a", encoding="utf-8") as f:
f.write(str(item) + "\n")
return item
然后在 settings.py
中启用:
ITEM_PIPELINES = {
'myspider.pipelines.SaveJsonPipeline': 300,
}
🧩 适合 Scrapy 的场景
✅ 适合:
- 多页面 深度爬取
- 动态构造请求队列
- 大量并发爬取
- 数据管道清洗与保存
🚫 不适合:
- JavaScript 渲染页面(建议 Selenium / Playwright)
- 页面结构频繁变化的网站