当前位置: 代码网 > it编程>前端脚本>Python > Python使用Scrapy抓取和解析网页数据的方法

Python使用Scrapy抓取和解析网页数据的方法

2026年05月11日 Python 我要评论
引言很多 python 初学者学完基础语法后,都会遇到一个很实际的问题:怎么把网页里的数据稳定地提取下来,变成自己能处理的结构化数据?如果你只是偶尔抓一个页面,用 requests + beautif

引言

很多 python 初学者学完基础语法后,都会遇到一个很实际的问题:怎么把网页里的数据稳定地提取下来,变成自己能处理的结构化数据?

如果你只是偶尔抓一个页面,用 requests + beautifulsoup 当然可以;但当你想抓取多个页面、自动跟进链接、统一清洗字段、导出成 json 或 csv,甚至把数据存进数据库时,scrapy 会明显更省事。

scrapy 是 python 生态里非常经典的爬虫框架。它不只是“下载网页源码”,而是把发请求、收响应、解析数据、跟踪链接、导出结果、去重、限速、日志管理这一整套流程都组织好了。

这篇文章面向新手,目标很明确:

  • 让你理解 scrapy 是什么
  • 带你从零创建一个 scrapy 项目
  • 学会抓取网页、解析字段、翻页采集、导出数据
  • 告诉你 scrapy 除了抓文章标题之外,还能做什么

学完后,你至少能独立写出一个基础可用的网页数据采集脚本。

1. scrapy 是什么

scrapy 是一个用于抓取网站并提取结构化数据的 python 框架。

你可以把它理解成一个专门为“网页采集”准备好的工程化工具箱。相比只写一个简单脚本,scrapy 的优势在于它已经帮你解决了很多重复问题,比如:

  • 请求调度
  • 并发抓取
  • 自动跟踪链接
  • 页面解析
  • 数据导出
  • 日志输出
  • 重试与超时
  • 去重和限速

也就是说,scrapy 更适合做“持续抓取”和“多页面采集”,而不只是一次性的实验代码。

2. scrapy 适合哪些场景

对新手来说,最适合先用 scrapy 解决的,通常是下面这些任务:

  • 抓取资讯站点的标题、链接、发布时间
  • 采集商品列表页中的名称、价格、销量、详情页地址
  • 批量抓取博客、论坛、文档站中的内容摘要
  • 采集招聘网站中的岗位名称、城市、薪资范围
  • 采集分页数据并导出成 json、csv、excel 可再处理的数据

如果你的目标是“从很多网页里提取重复结构的数据”,scrapy 基本就是合适的工具。

3. scrapy 和requests + beautifulsoup有什么区别

很多新手会问:我已经会 requestsbeautifulsoup,为什么还要学 scrapy?

可以这样理解:

  • requests 负责发请求
  • beautifulsoup 负责解析 html
  • scrapy 则把请求、解析、调度、导出、翻页、日志这些能力打包成了一个框架

如果只是抓 1 个页面,requests + beautifulsoup 更轻量。

如果要抓几十页、几百页,或者想要把项目组织得更清晰、可复用、可扩展,scrapy 往往更合适。

4. 安装 scrapy

先确保你已经安装了 python。然后直接执行:

pip install scrapy

安装完成后,可以检查版本:

scrapy version

如果命令能正常输出版本信息,说明 scrapy 已经安装成功。

5. 创建第一个 scrapy 项目

scrapy 通常不是单文件脚本的写法,而是按项目组织。

先创建项目:

scrapy startproject myspider

进入项目目录:

cd myspider

你会看到类似这样的结构:

myspider/
├── scrapy.cfg
└── myspider/
    ├── __init__.py
    ├── items.py
    ├── middlewares.py
    ├── pipelines.py
    ├── settings.py
    └── spiders/

几个最常见的文件先记住:

  • spiders/:放爬虫代码
  • items.py:定义要采集的数据字段
  • pipelines.py:对采集结果做清洗、保存、去重等处理
  • settings.py:配置请求头、并发、延时、导出编码等

刚开始你不需要把每个文件都学透,先会写 spiders/ 里的爬虫就够了。

6. 先写一个最小可运行的爬虫

下面我们用一个经典练习站点 https://quotes.toscrape.com/ 来演示。这个站点专门给爬虫教程使用,页面结构简单,很适合新手练手。

spiders 目录下新建文件 quotes_spider.py

import scrapy


class quotesspider(scrapy.spider):
    name = "quotes"
    start_urls = ["https://quotes.toscrape.com/"]

    def parse(self, response):
        for quote in response.css("div.quote"):
            yield {
                "text": quote.css("span.text::text").get(),
                "author": quote.css("small.author::text").get(),
                "tags": quote.css("div.tags a.tag::text").getall(),
            }

这段代码先不要急着背,先理解它在做什么:

  • name 是爬虫名字,后面运行时要用
  • start_urls 是起始页面列表
  • parse() 是默认解析函数
  • response.css(...) 用 css 选择器定位网页元素
  • yield 把采集到的一条数据交给 scrapy

7. 运行爬虫并查看结果

在项目根目录执行:

scrapy crawl quotes

如果你想把结果直接导出成 json:

scrapy crawl quotes -o quotes.json

导出成 csv:

scrapy crawl quotes -o quotes.csv

这一步非常重要,因为很多新手第一次接触 scrapy 时,会突然意识到:原来我不用自己手写文件保存逻辑,scrapy 已经帮我做好了。

8.response到底是什么

parse(self, response) 里,response 就是服务器返回的页面响应对象。

你经常会用到这些能力:

response.url
response.status
response.text
response.css(...)
response.xpath(...)

比如:

def parse(self, response):
    print(response.url)
    print(response.status)

你可以把它理解成:请求完成后,scrapy 把网页内容和相关信息都封装进了 response,供你继续解析。

9. 用 css 选择器提取数据

scrapy 对 css 选择器支持很好,新手建议优先学这个。

还是看刚才那段代码:

quote.css("span.text::text").get()
quote.css("small.author::text").get()
quote.css("div.tags a.tag::text").getall()

这里有两个高频方法:

  • .get():取第一个匹配结果
  • .getall():取所有匹配结果并返回列表

常见写法:

response.css("title::text").get()
response.css("a::attr(href)").getall()
response.css("img::attr(src)").getall()

如果页面里你想抓的是文本,就常用 ::text;如果你想抓链接或图片地址,就常用 ::attr(...)

10. 也可以用 xpath

scrapy 同样支持 xpath:

quote.xpath('.//span[@class="text"]/text()').get()
quote.xpath('.//small[@class="author"]/text()').get()
quote.xpath('.//div[@class="tags"]/a[@class="tag"]/text()').getall()

那到底该学 css 还是 xpath?

我的建议是:

  • 入门先用 css,语法更短
  • 遇到复杂层级、兄弟节点、条件匹配时,再补 xpath

只会其中一种,也已经能做很多事。

11. 学会翻页抓取

单页采集只是开始,真正实用的场景通常都要翻页。

quotes.toscrape.com 首页底部有“下一页”链接,我们可以继续跟进:

import scrapy


class quotesspider(scrapy.spider):
    name = "quotes"
    start_urls = ["https://quotes.toscrape.com/"]

    def parse(self, response):
        for quote in response.css("div.quote"):
            yield {
                "text": quote.css("span.text::text").get(),
                "author": quote.css("small.author::text").get(),
                "tags": quote.css("div.tags a.tag::text").getall(),
            }

        next_page = response.css("li.next a::attr(href)").get()
        if next_page:
            yield response.follow(next_page, callback=self.parse)

这里最关键的一句是:

yield response.follow(next_page, callback=self.parse)

它的意思是:继续请求下一页,请求完成后仍然交给 parse() 处理。

这就是 scrapy 很舒服的地方之一。你不需要自己手工拼接完整链接,也不用自己写复杂的循环控制。

12. 定义 item,让数据结构更清晰

直接 yield {} 当然可以,但项目稍微大一点之后,定义 item 会更规范。

先修改 items.py

import scrapy


class quoteitem(scrapy.item):
    text = scrapy.field()
    author = scrapy.field()
    tags = scrapy.field()

然后在爬虫中使用:

import scrapy
from myspider.items import quoteitem


class quotesspider(scrapy.spider):
    name = "quotes"
    start_urls = ["https://quotes.toscrape.com/"]

    def parse(self, response):
        for quote in response.css("div.quote"):
            item = quoteitem()
            item["text"] = quote.css("span.text::text").get()
            item["author"] = quote.css("small.author::text").get()
            item["tags"] = quote.css("div.tags a.tag::text").getall()
            yield item

item 的好处是字段边界更清楚,后面写清洗逻辑、保存逻辑时也更统一。

13. 用 pipeline 清洗数据

很多网页抓下来之后,并不是马上就能直接用。常见问题包括:

  • 文本前后有空格
  • 某些字段为空
  • 日期格式不统一
  • 同一条数据重复出现

这时就可以把清洗逻辑放进 pipelines.py

例如:

class myspiderpipeline:
    def process_item(self, item, spider):
        if item.get("text"):
            item["text"] = item["text"].strip()

        if item.get("author"):
            item["author"] = item["author"].strip()

        item["tags"] = [tag.strip() for tag in item.get("tags", [])]
        return item

然后去 settings.py 启用它:

item_pipelines = {
    "myspider.pipelines.myspiderpipeline": 300,
}

新手可以先记住一句话:spider 负责抓,pipeline 负责洗。

14. 常见配置项:新手最该先知道哪些

scrapy 很强,但默认并不是“想怎么抓就怎么抓”。你至少应该知道下面几个配置项。

14.1 设置请求标识

有些网站会根据请求头判断请求来源。你可以在 settings.py 里设置:

user_agent = "mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/123.0 safari/537.36"

14.2 控制抓取速度

不要对目标网站发太快的请求。新手阶段建议至少加一点延时:

download_delay = 1

14.3 关闭robots.txt限制前先理解规则

很多教程会写:

robotstxt_obey = false

但你需要先知道这意味着什么。robots.txt 是网站声明抓取规则的地方。是否遵守,要根据你的使用场景、目标站点规则和合规要求来判断。新手不要一上来就默认无视规则。

14.4 导出中文时避免乱码

如果你要导出中文 json,经常会加:

feed_export_encoding = "utf-8"

这能减少导出文件中文乱码的问题。

15. 一个更像真实项目的完整示例

下面给你一个稍完整一点的爬虫,把抓取、翻页和字段提取放在一起:

import scrapy


class quotesspider(scrapy.spider):
    name = "quotes"
    allowed_domains = ["quotes.toscrape.com"]
    start_urls = ["https://quotes.toscrape.com/"]

    def parse(self, response):
        for quote in response.css("div.quote"):
            yield {
                "text": quote.css("span.text::text").get(default="").strip(),
                "author": quote.css("small.author::text").get(default="").strip(),
                "tags": quote.css("div.tags a.tag::text").getall(),
                "detail_url": response.urljoin(
                    quote.css("span a::attr(href)").get(default="")
                ),
            }

        next_page = response.css("li.next a::attr(href)").get()
        if next_page:
            yield response.follow(next_page, callback=self.parse)

这个版本已经覆盖了初学者最常用的几个动作:

  • 进入起始页
  • 遍历列表块
  • 提取文本、作者、标签、详情链接
  • 继续翻页

16. 新手最容易踩的坑

刚学 scrapy 时,下面这些问题非常常见:

16.1 选择器写对了,但取不到数据

原因可能包括:

  • 页面结构和你想的不一样
  • 内容在 javascript 运行后才出现
  • 你选中的节点层级不对
  • 属性名或类名写错

先做两件事:

  • 在浏览器开发者工具里重新检查元素
  • scrapy shell 网址 进入交互环境测试选择器

例如:

scrapy shell https://quotes.toscrape.com/

进入后可以直接测试:

response.css("title::text").get()

这是定位问题最快的方法之一。

16.2 页面明明能打开,但 scrapy 抓不到完整内容

这通常是因为目标页面的数据是前端 javascript 动态渲染出来的,而 scrapy 默认抓到的是原始 html 响应。

这时你有几种思路:

  • 先在浏览器网络面板里找真实接口,直接抓接口数据
  • 配合 scrapy-playwright 处理需要渲染的页面
  • 对确实只依赖静态 html 的站点,优先直接用 scrapy

对新手来说,先学会抓静态页面,再处理动态页面,学习曲线会平很多。

16.3 导出的数据重复

原因往往是:

  • 翻页逻辑写错
  • 同一个链接被多次跟进
  • 详情页和列表页重复产出同一条记录

解决思路通常是:

  • 检查 next_page 逻辑
  • 用唯一字段去重
  • 在 pipeline 中做重复判断

17. scrapy 除了抓网页标题,还能做什么

很多新手误以为 scrapy 只能“抓文章标题”。其实它能做的事情远不止这些。

17.1 采集结构化业务数据

比如:

  • 商品名称、价格、库存、评分
  • 招聘岗位、地点、经验要求、薪资区间
  • 博客标题、作者、发布时间、标签
  • 课程名称、章节、讲师、简介

17.2 批量跟进详情页

很多网站首页只给列表摘要,真正的详细信息在详情页里。scrapy 很适合这种“列表页拿链接,再进入详情页补字段”的流程。

17.3 构建数据清洗流水线

抓取不是终点。你可以在 scrapy 里顺手做:

  • 文本清洗
  • 字段标准化
  • 去重
  • 时间格式转换
  • 金额单位统一

17.4 导出到多种格式

scrapy 原生就支持把数据导出为:

  • json
  • csv
  • json lines
  • xml

如果你自己再扩展 pipeline,还可以保存到:

  • mysql
  • postgresql
  • mongodb
  • redis
  • elasticsearch

17.5 做定时采集任务

scrapy 项目很适合接入定时任务,比如每天抓一次新闻、每小时抓一次价格、每周抓一次岗位变化。它不只是“写完跑一次”的脚本,也可以发展成长期运行的数据采集工程。

18. 学 scrapy 时要有的正确认知

scrapy 很强,但它不是万能的。

你要早点建立这几个认知:

  • 它擅长静态页面和结构化采集
  • 它不负责替你绕过网站风控
  • 它不保证所有 javascript 页面都能直接抓
  • 它是工程框架,不只是几行演示代码

也就是说,学习 scrapy 的重点不是死记 api,而是建立一个完整思路:

  1. 找页面结构
  2. 写选择器
  3. 提取字段
  4. 跟进分页或详情页
  5. 清洗和保存结果

只要这个流程打通,后面你抓不同网站时变化的主要只是选择器和字段,而不是整个方法 论。

19. 给新手的学习路线

如果你刚开始学 scrapy,我建议按下面顺序练习:

  1. 先抓单页标题、链接、文本
  2. 再练列表页循环提取
  3. 再加翻页
  4. 再进入详情页补充字段
  5. 再学习 item、pipeline、settings
  6. 最后再接触动态渲染页面和数据库存储

不要一上来就挑战特别复杂的网站。先把简单站点做通,成就感会高很多,理解也更扎实。

20. 总结

如果你想系统学习 python 爬虫,scrapy 是非常值得投入时间的框架。

它的价值不只是“能抓网页”,而是把网页采集这件事从零散脚本提升成了一个更规范、更稳定、可扩展的工程流程。对新手来说,一旦你学会了:

  • 创建项目
  • 编写 spider
  • 用 css 或 xpath 解析字段
  • 实现翻页抓取
  • 用 pipeline 清洗数据
  • 导出结果

你就已经具备了独立完成基础网页数据采集任务的能力。

最后提醒一句:在实际抓取网站数据时,一定要关注目标网站的使用规则、访问频率和合规要求。技术能力越强,越要有边界意识。

如果你刚准备开始动手,最推荐的练习方式就是自己创建一个 scrapy 项目,抓取 quotes.toscrape.com 这样的练习站点,把本文里的例子完整跑一遍。只要你亲手跑通一次,scrapy 就不会再显得抽象。

以上就是python使用scrapy抓取和解析网页数据的方法的详细内容,更多关于python scrapy抓取和解析网页数据的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com