2025爬虫入门实战:从0到1精通Scrapy框架,30分钟快速抓取网络数据
你是否曾因不懂编程而无法获取所需数据?是否尝试过手动复制粘贴却效率低下?本文将通过实战案例,带你从零开始掌握Scrapy框架,轻松实现自动化数据抓取。读完本文,你将能够:
- 理解网络爬虫(Web Crawler)的基本原理和工作流程
- 熟练配置和使用Scrapy框架的核心组件
- 掌握CSS选择器和XPath表达式两种数据提取方法
- 编写可扩展的爬虫程序并存储结构化数据
- 解决实际爬取过程中的常见问题
1. 为什么选择Scrapy框架?
Scrapy是一个用Python编写的开源网络爬虫框架(Framework),专为高效提取网站数据而设计。相比其他爬虫工具,它具有以下优势:
| 特性 | Scrapy | 传统Requests+BeautifulSoup | Selenium |
|---|---|---|---|
| 并发处理 | 内置异步处理,高效爬取 | 需要手动实现并发 | 模拟浏览器,性能较低 |
| 数据提取 | 支持CSS和XPath选择器 | 需手动解析 | 支持定位元素,但较繁琐 |
| 扩展性 | 丰富的中间件和插件 | 需自行开发 | 有限的扩展能力 |
| 数据存储 | 内置多种输出格式 | 需手动实现 | 需手动实现 |
| 反爬机制 | 可配置User-Agent、代理等 | 需手动设置 | 模拟真实用户行为 |
2. 环境准备与项目搭建
2.1 安装Scrapy
在开始之前,确保你的系统已安装Python环境。通过以下命令安装Scrapy:
pip install scrapy
2.2 获取项目代码
使用以下命令克隆项目仓库:
git clone https://gitcode.com/gh_mirrors/qu/quotesbot
cd quotesbot
2.3 项目结构解析
项目的目录结构如下:
quotesbot/
├── LICENSE
├── README.md
├── quotesbot/
│ ├── __init__.py
│ ├── items.py # 定义数据结构
│ ├── pipelines.py # 数据处理管道
│ ├── settings.py # 项目配置
│ └── spiders/ # 爬虫程序目录
│ ├── __init__.py
│ ├── toscrape-css.py # 使用CSS选择器的爬虫
│ └── toscrape-xpath.py # 使用XPath的爬虫
└── scrapy.cfg # Scrapy配置文件
3. 核心组件详解
3.1 Items(数据结构)
items.py文件定义了要抓取的数据结构,类似于数据库表结构:
import scrapy
class QuotesbotItem(scrapy.Item):
# 定义要抓取的字段
text = scrapy.Field() # 名言文本
author = scrapy.Field() # 作者
tags = scrapy.Field() # 标签
3.2 Spiders(爬虫程序)
Spiders是Scrapy的核心,负责定义爬取规则和数据提取方式。项目中提供了两个爬虫示例,分别使用CSS选择器和XPath表达式。
3.3 Settings(配置文件)
settings.py包含了项目的各种配置选项,如爬虫名称、并发请求数、下载延迟等:
BOT_NAME = 'quotesbot'
SPIDER_MODULES = ['quotesbot.spiders']
NEWSPIDER_MODULE = 'quotesbot.spiders'
# 遵守robots.txt规则
ROBOTSTXT_OBEY = True
# 并发请求数
#CONCURRENT_REQUESTS = 32
# 下载延迟(秒)
#DOWNLOAD_DELAY = 3
3.4 Pipelines(数据管道)
Pipelines用于处理抓取到的数据,如验证、清洗、存储等。默认配置下未启用,如需使用可在settings.py中取消注释:
#ITEM_PIPELINES = {
# 'quotesbot.pipelines.SomePipeline': 300,
#}
4. CSS选择器爬虫实战
4.1 爬虫代码解析
toscrape-css.py使用CSS选择器提取数据:
import scrapy
class ToScrapeCSSSpider(scrapy.Spider):
name = "toscrape-css" # 爬虫名称,必须唯一
start_urls = [
'http://quotes.toscrape.com/', # 起始URL
]
def parse(self, response):
# 提取所有名言区块
for quote in response.css("div.quote"):
# 生成数据字典
yield {
'text': quote.css("span.text::text").extract_first(),
'author': quote.css("small.author::text").extract_first(),
'tags': quote.css("div.tags > a.tag::text").extract()
}
# 提取下一页链接
next_page_url = response.css("li.next > a::attr(href)").extract_first()
if next_page_url is not None:
# 递归爬取下一页
yield scrapy.Request(response.urljoin(next_page_url))
4.2 CSS选择器语法
CSS选择器是一种用于选择HTML元素的模式,常用语法如下:
| 选择器 | 描述 | 示例 |
|---|---|---|
element |
选择指定元素 | div 选择所有div元素 |
.class |
选择指定类 | .quote 选择类为quote的元素 |
#id |
选择指定ID | #author 选择ID为author的元素 |
element > element |
选择直接子元素 | div > a 选择div的直接子元素a |
element element |
选择后代元素 | div a 选择div内的所有a元素 |
[attribute] |
选择带指定属性的元素 | [href] 选择所有带href属性的元素 |
4.3 运行爬虫
使用以下命令运行CSS选择器爬虫:
scrapy crawl toscrape-css
如需将结果保存到文件,可使用-o参数:
scrapy crawl toscrape-css -o quotes.json
5. XPath爬虫实战
5.1 爬虫代码解析
toscrape-xpath.py使用XPath表达式提取数据:
import scrapy
class ToScrapeSpiderXPath(scrapy.Spider):
name = 'toscrape-xpath'
start_urls = [
'http://quotes.toscrape.com/',
]
def parse(self, response):
# 使用XPath选择所有名言区块
for quote in response.xpath('//div[@class="quote"]'):
yield {
'text': quote.xpath('./span[@class="text"]/text()').extract_first(),
'author': quote.xpath('.//small[@class="author"]/text()').extract_first(),
'tags': quote.xpath('.//div[@class="tags"]/a[@class="tag"]/text()').extract()
}
# 提取下一页链接
next_page_url = response.xpath('//li[@class="next"]/a/@href').extract_first()
if next_page_url is not None:
yield scrapy.Request(response.urljoin(next_page_url))
5.2 XPath语法基础
XPath(XML Path Language)是一种在XML文档中查找信息的语言,也适用于HTML。常用语法:
| 表达式 | 描述 | 示例 |
|---|---|---|
// |
从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 | //div 选择所有div元素 |
/ |
从根节点选取 | /html/body 选择body元素 |
. |
选取当前节点 | ./span 选择当前节点的span子元素 |
.. |
选取当前节点的父节点 | ../div 选择当前节点的父节点下的div |
@ |
选取属性 | @class 选择class属性 |
[@attribute='value'] |
选取具有指定属性值的元素 | //div[@class='quote'] 选择class为quote的div |
5.3 CSS vs XPath:如何选择?
两种选择器各有优势,选择建议:
- 简单提取:优先使用CSS,语法更简洁
- 复杂条件:XPath更强大,支持更多条件表达式
- 位置选择:XPath支持按位置选择元素(如第n个元素)
- 属性操作:XPath支持更复杂的属性匹配
6. 数据存储与格式转换
Scrapy支持多种数据输出格式,常用的有:
6.1 JSON格式
scrapy crawl toscrape-css -o quotes.json
生成的JSON文件内容示例:
[
{"author": "Albert Einstein", "text": "“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”", "tags": ["change", "deep-thoughts", "thinking", "world"]},
{"author": "J.K. Rowling", "text": "“It is our choices, Harry, that show what we truly are, far more than our abilities.”", "tags": ["abilities", "choices"]}
]
6.2 CSV格式(适合Excel)
scrapy crawl toscrape-css -o quotes.csv
6.3 XML格式
scrapy crawl toscrape-css -o quotes.xml
7. 高级配置与优化
7.1 设置下载延迟
为避免对目标网站造成过大压力,可在settings.py中设置下载延迟:
DOWNLOAD_DELAY = 3 # 单位:秒
7.2 自定义User-Agent
有些网站会阻止默认的Scrapy User-Agent,可在settings.py中修改:
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
7.3 启用自动限速
Scrapy的AutoThrottle扩展可根据网站响应速度自动调整爬取速度:
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 5
AUTOTHROTTLE_MAX_DELAY = 60
8. 常见问题与解决方案
8.1 爬虫无法启动
问题:执行scrapy crawl命令后无反应或报错。
解决方案:
- 检查Python环境是否正常
- 确认Scrapy已正确安装:
scrapy --version - 检查当前目录是否在项目根目录下
8.2 提取数据为空
问题:爬虫运行正常,但未提取到任何数据。
解决方案:
- 使用Scrapy Shell测试选择器:
scrapy shell "http://quotes.toscrape.com" - 检查网页结构是否有变化
- 确认选择器语法是否正确
# 在Scrapy Shell中测试选择器
scrapy shell "http://quotes.toscrape.com"
response.css("div.quote span.text::text").extract_first()
8.3 爬取速度过慢
解决方案:
- 调整并发请求数:
CONCURRENT_REQUESTS = 32 - 减少下载延迟:
DOWNLOAD_DELAY = 1 - 启用HTTP缓存:
HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 3600 # 缓存有效期1小时
9. 扩展学习与实践建议
9.1 学习路径图
timeline
title Scrapy学习路径
2025-09-10, 基础阶段 : Python基础 -> Scrapy安装 -> 运行示例爬虫
2025-09-17, 进阶阶段 : CSS/XPath选择器 -> 自定义Item -> 数据存储
2025-09-24, 高级阶段 : 中间件开发 -> 分布式爬取 -> 反爬策略
2025-10-01, 实战阶段 : 电商数据爬取 -> 新闻聚合 -> 数据分析应用
9.2 练习项目
- 修改现有爬虫,增加抓取作者的出生日期和简介
- 实现一个爬取豆瓣电影Top250的爬虫
- 开发一个监控特定网站更新的爬虫,并发送邮件通知
10. 总结与展望
通过本文的学习,你已经掌握了Scrapy框架的基本使用方法,包括环境搭建、爬虫编写、数据提取和存储等核心技能。Scrapy作为一个强大的爬虫框架,还有更多高级特性值得探索,如:
- 分布式爬取(Scrapy-Redis)
- 动态网页爬取(结合Splash)
- 爬虫监控与调度
- 大规模数据处理
希望这篇教程能帮助你开启网络爬虫的学习之旅。记住,爬虫的使用应遵守网站的robots协议和相关法律法规,尊重网站的知识产权和使用政策。
kernelopenEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。C0131
let_datasetLET数据集 基于全尺寸人形机器人 Kuavo 4 Pro 采集,涵盖多场景、多类型操作的真实世界多任务数据。面向机器人操作、移动与交互任务,支持真实环境下的可扩展机器人学习00
mindquantumMindQuantum is a general software library supporting the development of applications for quantum computation.Python059
PaddleOCR-VLPaddleOCR-VL 是一款顶尖且资源高效的文档解析专用模型。其核心组件为 PaddleOCR-VL-0.9B,这是一款精简却功能强大的视觉语言模型(VLM)。该模型融合了 NaViT 风格的动态分辨率视觉编码器与 ERNIE-4.5-0.3B 语言模型,可实现精准的元素识别。Python00
GLM-4.7-FlashGLM-4.7-Flash 是一款 30B-A3B MoE 模型。作为 30B 级别中的佼佼者,GLM-4.7-Flash 为追求性能与效率平衡的轻量化部署提供了全新选择。Jinja00
AgentCPM-ReportAgentCPM-Report是由THUNLP、中国人民大学RUCBM和ModelBest联合开发的开源大语言模型智能体。它基于MiniCPM4.1 80亿参数基座模型构建,接收用户指令作为输入,可自主生成长篇报告。Python00