Python使用Scrapy进行网页抓取的详细教程

 更新时间:2026年07月08日 09:38:02   作者:Data_Journal  
Scrapy是一个快速且高效的网页抓取框架,用于抓取网站并从中提取结构化数据,在本教程中,我们将带你了解如何开始使用 Scrapy 进行 网页抓取,并构建你的第一个抓取项目,需要的朋友可以参考下

在本教程中,我们将带你了解如何开始使用 Scrapy 进行 网页抓取,并构建你的第一个抓取项目。

为什么使用 Scrapy?

Scrapy 速度快、效率高且高度可定制。它尤其适用于大规模抓取项目,在这些项目中你需要爬取数百或数千个页面。该框架以性能为核心构建,能够并发处理 HTTP 请求并解析响应。

Scrapy 的替代方案

如果你在寻找 Scrapy 的替代方案,我可以推荐业内 3 家顶级网页抓取服务提供商(我与他们都没有任何关联,别担心):

  1. Bright Data:领先工具,拥有庞大的代理网络与解决方案。
  2. Oxylabs:通过可靠的代理与 API 进行高级数据采集。
  3. Zyte:用户友好的抓取体验,具备智能提取与支持服务。

Scrapy 的关键特性:

  • 内置请求处理支持:让处理多个页面与链接变得简单。
  • 并发与异步 I/O:高效地同时处理多个请求。
  • 支持 XPath 与 CSS 选择器:强大的方式用于在 HTML 中导航并提取数据。
  • 健壮的 API:允许你定义数据如何被处理与存储。

前置条件

  • 基础 Python 知识:理解 Python 基础是关键。
  • 安装 Scrapy:使用 pip install scrapy 开始。确保你已安装 Python 3.6+。

开始使用 Scrapy

配置 Scrapy

要开始使用 Scrapy,你需要先安装它。最简单的方法是使用 Python 的包管理器 pip。

pip install scrapy

安装完成后,通过输入以下命令验证安装:

scrapy version

如果 Scrapy 安装正确,该命令将返回 Scrapy 的版本号。

创建 Scrapy 项目

Scrapy 围绕“项目”的概念运行。要创建你的第一个项目,进入你希望项目所在的目录并运行:

scrapy startproject myproject

这将创建一个名为 myproject 的文件夹,其中包含开始所需的所有关键文件。

理解项目结构

创建项目后,你会看到类似如下的文件夹结构:

myproject/
scrapy.cfg # Configuration file
myproject/
init.py
items.py # Define the data structure
middlewares.py # Handle middleware logic
pipelines.py # Store the scraped data
settings.py # Project settings
spiders/ # Folder to store your spiders
  • items.py:定义你要抓取的数据结构。
  • middlewares.py:允许你修改请求与响应。
  • pipelines.py:处理并保存抓取到的数据。
  • settings.py:配置你的 Scrapy 项目行为。
  • **spiders/**:包含爬虫代码,所有抓取逻辑都在这里实现。

编写你的第一个 Spider

Spider 是 Scrapy 中的一个类,用于定义应如何抓取某个特定网站或一组网站。

创建 Spider

要创建一个 spider,进入 spiders 目录并创建一个新的 Python 文件。我们将其命名为 quotes_spider.py,用于从著名的 quotes.toscrape.com 网站抓取数据,该网站非常适合初学者。

下面是你的 spider 的基本结构:

import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = ['http://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('span small::text').get(),
'tags': quote.css('div.tags a.tag::text').getall(),
}
next_page = response.css('li.next a::attr(href)').get()
if next_page is not None:
yield response.follow(next_page, self.parse)

我们来拆解一下:

  • name:这是 spider 的名称。Scrapy 使用该名称来识别要运行哪个 spider。
  • start_urls:这是一个 URL 列表,spider 将从这些 URL 开始抓取。
  • **parse()**:该方法包含提取逻辑,用于定义如何处理页面内容。在这里,我们使用 CSS 选择器(response.css)来提取引文的文本、作者与标签。
  • 分页:处理完当前页面后,spider 会查找下一页的 URL 并继续跟进,以抓取下一组引文。

运行 Spider

要运行你的 spider,只需使用以下命令:

scrapy crawl quotes

Scrapy 将访问起始 URL,提取数据,跟随链接进入下一页,并抓取更多引文。

导出抓取的数据

Scrapy 让导出抓取数据变得很容易。你可以将数据导出为 JSON、CSV 或 XML 格式。要将数据导出到 JSON 文件,使用以下命令:

scrapy crawl quotes -o quotes.json

该命令会将抓取的数据保存到 quotes.json。同样地,你也可以通过更改扩展名将其导出为 CSV。

处理 Scrapy 设置

Scrapy 的行为可以通过 settings.py 文件进行配置。以下是一些你可能想要调整的重要设置:

  • USER_AGENT:一些网站会阻止没有 user agent 的请求。你可以在 settings 中设置 spider 的 user agent。
USER_AGENT = ‘myproject (+http://www.yourdomain.com)'
  • CONCURRENT_REQUESTS:该设置定义 Scrapy 应并发发起多少个请求。
CONCURRENT_REQUESTS = 16
  • DOWNLOAD_DELAY:你可以在请求之间设置延迟,以避免给服务器造成过大压力。
DOWNLOAD_DELAY = 1 # 请求之间延迟 1 秒

处理动态内容

许多现代网站使用 JavaScript 动态加载内容,而 Scrapy 本身无法执行 JavaScript。在这种情况下,你可以使用 Scrapy-Splash,或将 Scrapy 与 Selenium 等无头浏览器集成。

使用 Scrapy-Splash

Splash 是一个为网页抓取设计的无头浏览器。要使用它,你需要先安装,然后将其与 Scrapy 集成。

以下是安装 Scrapy-Splash 的方法

pip install scrapy-splash

你还需要更新 settings.py 文件,加入:

DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

通过集成 Splash,Scrapy 能更好地处理动态内容,并从基于 JavaScript 的网站获取数据。

Scrapy Pipelines:存储数据

当你抓取到数据后,你需要一种方式来存储或处理它。这就是 pipelines 发挥作用的地方。

假设你想将抓取的数据存储到 MongoDB 数据库中。首先,安装 pymongo 库:

pip install pymongo

然后,在 pipelines.py 中创建一个 pipeline:

import pymongo
class MongoPipeline:
def open_spider(self, spider):
self.client = pymongo.MongoClient("mongodb://localhost:27017/")
self.db = self.client["scrapy_db"]
def close_spider(self, spider):
self.client.close()
def process_item(self, item, spider):
self.db["quotes"].insert_one(dict(item))
return item
Don't forget to activate the pipeline in settings.py:
ITEM_PIPELINES = {
'myproject.pipelines.MongoPipeline': 300,
}

现在,你抓取到的所有数据都会存储在一个 MongoDB 集合中。

结论

使用 Scrapy 进行网页抓取是一种高效从网站提取数据的强大方式。从配置 Scrapy、创建爬虫、处理动态内容,到将数据存储到数据库中,Scrapy 为初学者和有经验的开发者都提供了灵活性。

掌握 Scrapy 可以自动化你的数据采集流程,为你提供收集有价值洞察的工具,并推动行业决策制定。

既然你已经了解 Scrapy 的工作方式,那就开始构建你的下一个网页抓取项目吧!

以上就是Python使用Scrapy进行网页抓取的详细教程的详细内容,更多关于Python Scrapy网页抓取的资料请关注脚本之家其它相关文章!

相关文章

  • pytorch loss反向传播出错的解决方案

    pytorch loss反向传播出错的解决方案

    这篇文章主要介绍了pytorch loss反向传播出错的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Python Numpy 高效的运算工具详解

    Python Numpy 高效的运算工具详解

    这篇文章主要介绍了Python numpy矩阵处理运算工具用法汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-10-10
  • python读取excel数据的详细教学

    python读取excel数据的详细教学

    在Python中读取Excel数据是一个常见的数据处理任务,本文主要为大家详细介绍了如何使用Python读取Excel数据,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2026-01-01
  • Python利用request库实现翻译接口

    Python利用request库实现翻译接口

    这篇文章主要为大家详细介绍了Python如何利用request库打造自己的翻译接口,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-04-04
  • python基于双向链表实现LFU算法

    python基于双向链表实现LFU算法

    这篇文章主要为大家详细介绍了python基于双向链表实现LFU算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 利用Python的folium包绘制城市道路图的实现示例

    利用Python的folium包绘制城市道路图的实现示例

    这篇文章主要介绍了利用Python的folium包绘制城市道路图的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Python实现比较扑克牌大小程序代码示例

    Python实现比较扑克牌大小程序代码示例

    这篇文章主要介绍了Python实现比较扑克牌大小程序代码示例,具有一定借鉴价值,需要的朋友可以了解下。
    2017-12-12
  • pycharm如何调整最大堆发挥最大

    pycharm如何调整最大堆发挥最大

    本文详细介绍了如何在PyCharmar中设置最大堆内存以提高Python程序运行效率,建议将8GB内存设置为约6GB,利用约75%的内存运行效果最佳
    2026-05-05
  • Python3中英文关键词提取的几个方法

    Python3中英文关键词提取的几个方法

    本文介绍Python3中文关键词提取的几种算法,包括TF-IDF(支持自定义语料库)、TextRank(jieba实现)、LAC及KeyBert,覆盖词性筛选、共现分析等方法,后续将更新更前沿技术
    2025-07-07
  • Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)

    Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)

    今天小编就为大家分享一篇Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01

最新评论