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_spiderblog_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 scrapy class 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 # 导入定义的Item class 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 csv class 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 分钟就能落地项目;后续迭代时,也能基于现有结构轻松扩展。赶紧找一个合法的目标网站(比如开源项目文档、公开博客),动手实践吧!