快速上手 Scrapy:5 分钟创建一个可扩展的爬虫项目
Scrapy 是 Python 生态中最强大的爬虫框架之一 —— 它自带异步请求、数据解析、数据存储、反爬配置等 “全家桶” 功能,而且天生支持扩展。对新手来说,无需从零搭建爬虫架构,5 分钟就能实现一个能后续迭代的爬虫项目。本文将以 “爬取技术博客文章信息” 为例,带你一步到位掌握 Scrapy 的核心流程。
前置准备:1 分钟搞定环境
首先确保你的电脑已安装Python 3.8+(Scrapy 对 Python 版本有最低要求),然后通过 pip 快速安装 Scrapy:
- 打开终端(Windows 用 CMD/PowerShell,Mac/Linux 用 Terminal),执行安装命令:
bash
pip install scrapy
- 验证安装成功:输入
scrapy version
,若显示类似Scrapy 2.11.0
的版本号,说明环境已就绪。
Step 1:30 秒创建 Scrapy 项目
Scrapy 提供了命令行工具,能自动生成标准项目结构(这是 “可扩展” 的基础,后续代码按规范存放,便于维护)。
-
终端进入你想存放项目的文件夹(比如
cd ~/projects
),执行创建命令:bash
scrapy startproject blog_spider
blog_spider
是项目名,可自定义(比如爬取电商就叫ecommerce_spider
)。
-
进入项目目录:
bash
cd blog_spider
此时项目结构已自动生成,核心文件夹 / 文件的作用如下(重点记 3 个):
spiders/
:存放爬虫核心代码(后续写的爬取逻辑放这)items.py
:定义数据结构(比如要爬 “标题、链接、发布时间”,在这里规范字段)pipelines.py
:处理爬取到的数据(比如存 CSV、数据库,或数据清洗)
Step 2:30 秒定义数据结构(Item)
Item 相当于 “数据容器”,提前定义字段能避免后续数据混乱,也方便后续扩展(比如新增 “作者” 字段只需加一行代码)。
- 用文本编辑器(VS Code、PyCharm 均可)打开
items.py
,替换默认代码为:python
import scrapyclass BlogItem(scrapy.Item):# 文章标题(必须爬取的核心字段)title = scrapy.Field()# 文章详情页链接url = scrapy.Field()# 发布时间(后续可扩展,当前先定义)publish_time = scrapy.Field()
scrapy.Field()
表示这是一个数据字段,无需指定类型(Scrapy 会自动适配字符串、日期等)。
Step 3:1 分钟编写核心爬虫(Spider)
Spider 是爬虫的 “大脑”,负责定义爬取目标(哪些 URL)、如何解析页面数据。我们以 “爬取示例博客https://example-blog.com
” 为例(实际使用时替换为合法目标网站)。
- 在
spiders/
文件夹下新建文件blog_spider.py
(文件名与爬虫名对应,便于识别),写入代码:python
import scrapy from blog_spider.items import BlogItem # 导入定义的Itemclass BlogSpider(scrapy.Spider):# 爬虫唯一名称(运行时需指定,不能重复)name = "blog_crawler"# 初始爬取URL(可填多个,比如分页URL)start_urls = ["https://example-blog.com/page/1"]def parse(self, response):"""解析列表页:提取文章标题、链接,并存入Item"""# 1. 用XPath选择器定位文章节点(需根据目标网站HTML结构调整)article_nodes = response.xpath('//div[@class="article-item"]')for node in article_nodes:item = BlogItem() # 实例化Item# 2. 提取字段(XPath语法:text()取文本,@href取链接)item["title"] = node.xpath('.//h2[@class="article-title"]/text()').get().strip()item["url"] = node.xpath('.//a[@class="article-link"]/@href').get()# 3. 发布时间暂不提取,后续可在详情页补充(体现可扩展)item["publish_time"] = "待补充"# 4. yield Item:将数据传给Pipeline处理yield item# 【可扩展】自动爬取下一页(实现分页爬取)next_page = response.xpath('//a[@class="next-page"]/@href').get()if next_page:# 递归调用parse方法,爬取下一页yield scrapy.Request(url=next_page, callback=self.parse)
- 关键说明:
response
是 Scrapy 返回的页面响应,包含 HTML 内容;XPath选择器
需根据目标网站的 HTML 结构调整(可在浏览器 F12 开发者工具中 “复制 XPath” 快速获取);yield item
会自动将数据传递到后续的 Pipeline,无需手动处理异步;- 分页逻辑(
next_page
)是 “可扩展” 的核心 —— 新增分页只需改 XPath,无需重构爬虫。
Step 4:30 秒配置数据存储(Pipeline)
Pipeline 负责处理 Item 数据,比如存 CSV(新手友好)、MySQL、MongoDB。这里以 “存 CSV” 为例,简单易验证。
-
打开
pipelines.py
,添加 CSV 存储逻辑:python
import csvclass BlogCsvPipeline:def open_spider(self, spider):"""爬虫启动时执行:创建CSV文件并写入表头"""self.file = open("blog_data.csv", "w", encoding="utf-8", newline="")self.writer = csv.DictWriter(self.file, fieldnames=["title", "url", "publish_time"])self.writer.writeheader() # 写入表头def process_item(self, item, spider):"""每爬取一个Item执行:写入CSV行"""self.writer.writerow(dict(item)) # Item转字典后写入return item # 若有多个Pipeline,需返回Item传递给下一个def close_spider(self, spider):"""爬虫结束时执行:关闭文件"""self.file.close()
-
启用 Pipeline:打开
settings.py
,找到ITEM_PIPELINES
配置项,取消注释并修改为:python
ITEM_PIPELINES = {"blog_spider.pipelines.BlogCsvPipeline": 300, # 300是优先级(越小越先执行) }
- 额外优化(避免被封):在
settings.py
中添加 User-Agent(模拟浏览器请求):python
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" ROBOTSTXT_OBEY = False # 关闭 robots.txt 协议(部分网站禁止爬虫,需注意合法性)
Step 5:30 秒运行爬虫,查看结果
所有配置完成后,回到终端(确保当前在blog_spider
项目目录下),执行运行命令:
bash
scrapy crawl blog_crawler
blog_crawler
是之前在BlogSpider
类中定义的name
。
爬虫运行后,会在项目根目录生成blog_data.csv
文件,用 Excel 或文本编辑器打开,就能看到爬取的 “标题、链接、发布时间” 数据 —— 一个可运行、可扩展的爬虫就此完成!
可扩展设计:从 “能用” 到 “好用”
5 分钟实现的基础爬虫,后续可通过以下方式扩展,满足更复杂需求:
- 新增字段:在
items.py
中加author = scrapy.Field()
,在 Spider 的parse
方法中补充 XPath 提取; - 多源数据存储:在
pipelines.py
中新增BlogMongoPipeline
,同时存 CSV 和 MongoDB; - 反爬增强:在
settings.py
中配置DOWNLOAD_DELAY = 1
(每 1 秒爬一次),或添加代理 IP; - 详情页解析:在 Spider 中新增
parse_detail
方法,通过scrapy.Request
跟进文章 URL,提取正文、标签等详细信息。
结语
Scrapy 的强大之处在于 “规范的架构” 和 “低代码扩展”—— 新手无需关注异步、并发等底层逻辑,只需按 “定义 Item→写 Spider→配 Pipeline” 的流程,5 分钟就能落地项目;后续迭代时,也能基于现有结构轻松扩展。赶紧找一个合法的目标网站(比如开源项目文档、公开博客),动手实践吧!