快速上手 Scrapy:5 分钟创建一个可扩展的爬虫项目

Scrapy 是 Python 生态中最强大的爬虫框架之一 ------ 它自带异步请求、数据解析、数据存储、反爬配置等 "全家桶" 功能,而且天生支持扩展。对新手来说,无需从零搭建爬虫架构,5 分钟就能实现一个能后续迭代的爬虫项目。本文将以 "爬取技术博客文章信息" 为例,带你一步到位掌握 Scrapy 的核心流程。

前置准备:1 分钟搞定环境

首先确保你的电脑已安装Python 3.8+(Scrapy 对 Python 版本有最低要求),然后通过 pip 快速安装 Scrapy:

  1. 打开终端(Windows 用 CMD/PowerShell,Mac/Linux 用 Terminal),执行安装命令: bash

    复制代码
    pip install scrapy
  2. 验证安装成功:输入scrapy version,若显示类似Scrapy 2.11.0的版本号,说明环境已就绪。

Step 1:30 秒创建 Scrapy 项目

Scrapy 提供了命令行工具,能自动生成标准项目结构(这是 "可扩展" 的基础,后续代码按规范存放,便于维护)。

  1. 终端进入你想存放项目的文件夹(比如cd ~/projects),执行创建命令:

    bash

    复制代码
    scrapy startproject blog_spider
    • blog_spider是项目名,可自定义(比如爬取电商就叫ecommerce_spider)。
  2. 进入项目目录:

    bash

    复制代码
    cd blog_spider

此时项目结构已自动生成,核心文件夹 / 文件的作用如下(重点记 3 个):

  • spiders/:存放爬虫核心代码(后续写的爬取逻辑放这)
  • items.py:定义数据结构(比如要爬 "标题、链接、发布时间",在这里规范字段)
  • pipelines.py:处理爬取到的数据(比如存 CSV、数据库,或数据清洗)

Step 2:30 秒定义数据结构(Item)

Item 相当于 "数据容器",提前定义字段能避免后续数据混乱,也方便后续扩展(比如新增 "作者" 字段只需加一行代码)。

  1. 用文本编辑器(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" 为例(实际使用时替换为合法目标网站)。

  1. 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" 为例,简单易验证。

  1. 打开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()
  2. 启用 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 分钟实现的基础爬虫,后续可通过以下方式扩展,满足更复杂需求:

  1. 新增字段 :在items.py中加author = scrapy.Field(),在 Spider 的parse方法中补充 XPath 提取;
  2. 多源数据存储 :在pipelines.py中新增BlogMongoPipeline,同时存 CSV 和 MongoDB;
  3. 反爬增强 :在settings.py中配置DOWNLOAD_DELAY = 1(每 1 秒爬一次),或添加代理 IP;
  4. 详情页解析 :在 Spider 中新增parse_detail方法,通过scrapy.Request跟进文章 URL,提取正文、标签等详细信息。

结语

Scrapy 的强大之处在于 "规范的架构" 和 "低代码扩展"------ 新手无需关注异步、并发等底层逻辑,只需按 "定义 Item→写 Spider→配 Pipeline" 的流程,5 分钟就能落地项目;后续迭代时,也能基于现有结构轻松扩展。赶紧找一个合法的目标网站(比如开源项目文档、公开博客),动手实践吧!

相关推荐
卖个几把萌1 分钟前
【16】Selenium+Python 接管已打开谷歌浏览器
python·selenium·测试工具
像风一样的男人@24 分钟前
python --两个文件夹文件名比对(yolo 图和label标注比对检查)
windows·python·yolo
lllsure1 小时前
【Python】Dict(字典)
开发语言·python
tianyuanwo1 小时前
Rust开发完全指南:从入门到与Python高效融合
开发语言·python·rust
苏打水com2 小时前
Python 爬虫 3 大核心库深度解析:从原理到实战,覆盖 90% 爬取场景
爬虫
如何原谅奋力过但无声2 小时前
TensorFlow 2.x常用函数总结(持续更新)
人工智能·python·tensorflow
程序员-小李2 小时前
基于 Python + OpenCV 的人脸识别系统开发实战
开发语言·python·opencv
万粉变现经纪人2 小时前
如何解决 pip install 安装报错 [WinError 32] 文件被占用(杀毒/占用进程)问题
python·pycharm·flask·beautifulsoup·bug·pandas·pip
java1234_小锋3 小时前
[免费]基于Python的Flask酒店客房管理系统【论文+源码+SQL脚本】
开发语言·人工智能·python·flask·酒店客房
2401_841495644 小时前
【自然语言处理】生成式语言模型GPT复现详细技术方案
人工智能·python·gpt·深度学习·语言模型·自然语言处理·transformer