当前位置: 首页 > article >正文

Python爬虫系列教程之第十一篇:Scrapy框架实战

大家好,欢迎继续关注本系列爬虫教程!本篇博客将为大家介绍如何使用 Scrapy 框架构建一个高效、可扩展的爬虫项目。Scrapy 是一个功能强大的爬虫框架,它内置了许多优秀的特性,如异步请求、内置中间件、Item 管道等,非常适合用于大规模数据采集和项目维护。

在本文中,我们将以抓取 Quotes to Scrape 网站为例,详细讲解如何从创建项目、定义数据结构、编写爬虫、数据清洗到数据存储的全过程,并附上详细的代码及中文注释,帮助你快速掌握 Scrapy 的使用方法。


1. Scrapy框架简介

Scrapy 是一个开源的、基于 Python 的爬虫框架,主要特点包括:

  • 高性能:基于异步 I/O 实现,能够高效抓取海量数据。
  • 模块化设计:项目结构清晰,便于扩展和维护。
  • 内置多种组件:支持中间件、管道、调度器等,满足复杂爬虫项目的需求。

2. 环境准备与项目创建

2.1 安装Scrapy

首先,通过 pip 安装 Scrapy:

pip install scrapy

2.2 创建Scrapy项目

在命令行中执行以下命令创建一个新的 Scrapy 项目(项目名称这里取为 myproject):

scrapy startproject myproject

项目目录结构如下:

myproject/
│   scrapy.cfg
└───myproject/
    │   __init__.py
    │   items.py       # 定义数据结构
    │   middlewares.py
    │   pipelines.py   # 数据处理与存储
    │   settings.py    # 项目配置
    └───spiders/
        │   __init__.py
        │   quotes_spider.py  # 爬虫代码

3. 编写Scrapy爬虫

3.1 定义数据结构(items.py)

myproject/items.py 中定义我们要抓取的数据结构,本例中抓取“名言”的文本、作者及标签:

import scrapy

class QuoteItem(scrapy.Item):
    # 定义抓取的字段
    text = scrapy.Field()    # 名言文本
    author = scrapy.Field()  # 作者
    tags = scrapy.Field()    # 标签列表

3.2 编写爬虫代码(spiders/quotes_spider.py)

myproject/spiders/quotes_spider.py 中编写爬虫代码,抓取 Quotes to Scrape 网站的内容:

import scrapy
from myproject.items import QuoteItem  # 导入定义好的数据结构

class QuotesSpider(scrapy.Spider):
    name = "quotes"  # 定义爬虫名称,在运行时使用
    allowed_domains = ["quotes.toscrape.com"]  # 允许抓取的域名
    start_urls = [
        "http://quotes.toscrape.com/"  # 初始请求的URL
    ]

    def parse(self, response):
        """
        解析网页内容,提取名言信息并处理翻页
        """
        # 遍历页面中所有包含名言信息的块
        for quote in response.css("div.quote"):
            item = QuoteItem()  # 创建一个数据项对象
            # 提取名言文本,使用 CSS 选择器
            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  # 生成数据项,交由管道处理

        # 处理翻页,提取下一页链接
        next_page = response.css("li.next a::attr(href)").get()
        if next_page:
            # 将相对URL转换为绝对URL
            next_page = response.urljoin(next_page)
            # 递归调用parse方法继续抓取下一页
            yield scrapy.Request(url=next_page, callback=self.parse)

4. 数据存储与Item Pipeline

为了将抓取的数据进行存储,我们可以使用 Scrapy 的 Item Pipeline。这里我们以将数据存储到 JSON 文件为例。

4.1 编写Pipeline(pipelines.py)

myproject/pipelines.py 中编写如下代码:

import json

class MyProjectPipeline:
    def open_spider(self, spider):
        """
        爬虫启动时调用,打开数据存储文件
        """
        self.file = open("quotes.json", "w", encoding="utf-8")

    def close_spider(self, spider):
        """
        爬虫关闭时调用,关闭文件
        """
        self.file.close()

    def process_item(self, item, spider):
        """
        处理每个数据项,将其写入JSON文件
        """
        # 将Item转换为字典,并转换为JSON字符串
        line = json.dumps(dict(item), ensure_ascii=False) + "\n"
        self.file.write(line)
        return item

4.2 启用Pipeline

myproject/settings.py 中启用我们定义的 Pipeline,添加或修改如下配置:

ITEM_PIPELINES = {
    'myproject.pipelines.MyProjectPipeline': 300,
}

数字 300 表示该 Pipeline 的执行顺序,数字越小越先执行。


5. 运行爬虫

在项目根目录下打开命令行,执行以下命令启动爬虫:

scrapy crawl quotes

运行成功后,爬虫会依次抓取 Quotes to Scrape 网站的所有页面,并将抓取的数据存储到项目根目录下的 quotes.json 文件中。你可以打开该文件查看抓取结果,每行代表一条 JSON 格式的名言数据。


6. 小结

在本篇博客中,我们介绍了如何使用 Scrapy 框架构建一个完整的爬虫项目,具体内容包括:

  • 项目创建:使用 scrapy startproject 命令快速生成项目结构。
  • 定义数据结构:在 items.py 中定义抓取的数据字段。
  • 编写爬虫:在 spiders/quotes_spider.py 中编写爬虫代码,使用 CSS 选择器提取数据,并处理翻页逻辑。
  • 数据存储:通过自定义 Pipeline 将数据存储到 JSON 文件中,并在 settings.py 中启用 Pipeline。
  • 运行爬虫:使用 scrapy crawl 命令启动爬虫,完成数据抓取与存储。

Scrapy 强大的框架特性使得爬虫项目的开发、维护和扩展变得更加高效。希望本篇博客能帮助你快速上手 Scrapy,构建自己的高效爬虫项目。如果你有任何问题或建议,欢迎在评论区留言讨论!别忘了点赞、收藏并分享给需要的朋友,我们下篇博客再见!


http://www.kler.cn/a/554920.html

相关文章:

  • 嵌入式 Linux:使用设备树驱动GPIO全流程
  • 数据库基础1
  • 在亚马逊云科技大模型平台Bedrock上部署DeepSeek-R1蒸馏模型
  • 设计模式 之 建造者模式(C++)
  • C# 索引器 使用详解
  • DeepSeek 新注意力架构NSA
  • 【杂记】机器学习
  • buf存储器缓存
  • el-message自定义HTML包含按钮点击事件
  • Android Studio安装配置及运行
  • Jetpack Architecture系列教程之(三)——ViewModel控制器
  • 【tips】el-select没有赋值但是初始化回显了
  • 从零开始构建一个小型字符级语言模型的完整详细教程(基于Transformer架构)
  • vue3-05reactive定义对象类型的响应式数据(不能进行基本类型数据的响应式)
  • 使用 Flask 和 pdfkit 生成带透明 PNG 盖章的 PDF 并上传到阿里云 OSS
  • 【Linux网络】认识协议、Mac/IP地址和端口号、网络字节序、socket套接字
  • Day15-后端Web实战-登录认证——会话技术JWT令牌过滤器拦截器
  • AUTOSAR从入门到精通-【自动驾驶】BEV感知(二)
  • 独立开发者灵感日报:关系代理,而不是另一个 CRM
  • Unity面板介绍_菜单栏(23.1.1)