【Python爬虫实战】深入解析 Scrapy 管道:数据清洗、验证与存储的实战指南

  🌈个人主页:易辰君-CSDN博客
🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html

目录

前言

一、了解 Scrapy Shell

二、配置文件 settings.py

(一)为什么需要配置文件

(二)配置文件的使用方法

(三)常用字段及其含义

三、管道的深入使用

(一)管道的常用方法

(二)管道的实现

(三)启用管道

四、管道的常见应用场景

五、管道使用注意事项

六、总结


前言

Scrapy 是一个功能强大的 Python 爬虫框架,在其中,管道(Pipeline) 是处理抓取到的数据的核心部分。管道的作用是对爬虫抓取到的 Item 进行后续处理,例如清洗、验证、存储等操作。本节将从多个方面详细介绍 Scrapy 管道的使用,包括管道的基本功能、配置方法、数据存储的实现、管道的多样化处理逻辑以及注意事项。


一、了解 Scrapy Shell

在正式进入管道的使用之前,我们需要先了解 Scrapy 提供的一个非常实用的交互式工具——Scrapy Shell。它允许开发者快速测试 XPath、CSS 选择器规则和查看响应对象的属性,为管道的数据清洗和存储提供了数据结构的确认依据。

使用方法

在终端中运行以下命令进入 Scrapy Shell:

scrapy shell https://movie.douban.com/top250

进入交互式终端后,你可以通过以下常用命令测试和调试:

response.xpath('//div[@class="title"]/text()').getall()
  • response.url:查看当前响应的 URL。

  • response.request.url:查看当前请求对应的 URL。

  • response.headers:查看响应头。

  • response.body:查看响应体(HTML 数据,默认是二进制格式)。

  • response.request.headers:查看请求头。

Scrapy Shell 是调试抓取规则和验证数据结构的关键工具,为管道中的数据清洗提供了基础。


二、配置文件 settings.py

在 Scrapy 项目中,settings.py 文件起到了全局配置的作用。管道的配置、爬虫行为控制(如并发数、延迟设置)都在这个文件中完成。

(一)为什么需要配置文件

  • 便于维护:配置文件存储了许多公共变量,例如数据库连接信息、日志级别等。当环境发生变化(如从本地测试到部署服务器),只需修改配置文件即可。

  • 集中管理:所有爬虫项目的全局设置都统一存放在一个地方,便于开发和调试。

(二)配置文件的使用方法

  • 配置变量一般使用全大写命名,如:USER_AGENTDOWNLOAD_DELAY

  • 在项目代码中通过导入 settings 模块即可访问这些配置。

(三)常用字段及其含义

  • USER_AGENT:设置用户代理字符串,模拟浏览器访问。

  • ROBOTSTXT_OBEY:是否遵守 robots.txt 协议,默认为 True

  • CONCURRENT_REQUESTS:设置并发请求数,默认是 16。

  • DOWNLOAD_DELAY:下载延迟,控制抓取频率。

  • COOKIES_ENABLED:是否启用 Cookie 支持,默认为开启。

  • DEFAULT_REQUEST_HEADERS:设置默认请求头。

  • ITEM_PIPELINES:用于启用和配置管道。

  • LOG_LEVELLOG_FILE:控制日志输出的级别和保存路径。

这些配置直接影响 Scrapy 的运行行为和性能。


三、管道的深入使用

管道是 Scrapy 数据处理流程中的重要部分,主要用于抓取数据的清洗、存储和验证。

(一)管道的常用方法

  1. open_spider(self, spider)
    在爬虫启动时运行一次,通常用于初始化资源,例如连接数据库、打开文件等。

  2. process_item(self, item, spider)
    管道的核心方法,每抓取到一个 Item,Scrapy 会将其传递到此方法中进行处理。处理完成后,需返回处理后的 Item

  3. close_spider(self, spider)
    在爬虫结束时运行一次,用于释放资源,例如关闭数据库连接或文件句柄。

(二)管道的实现

以下是一个示例管道,分别将数据存储到 MySQL 和 MongoDB 数据库。

1.MySQL 存储管道

import pymysql

class MyspiderMySQLPipeline:
    def open_spider(self, spider):
        if spider.name == 'douban':
            self.db = pymysql.connect(
                host="localhost", 
                user="root", 
                password="root", 
                db="spiders9"
            )
            self.cursor = self.db.cursor()
            sql = '''
                CREATE TABLE IF NOT EXISTS douban (
                    id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
                    quote VARCHAR(255) NOT NULL, 
                    rating VARCHAR(255) NOT NULL, 
                    title VARCHAR(255) NOT NULL
                )
            '''
            self.cursor.execute(sql)

    def process_item(self, item, spider):
        sql = '''
            INSERT INTO douban (id, quote, rating, title) 
            VALUES (%s, %s, %s, %s)
        '''
        try:
            self.cursor.execute(sql, (0, item['quote'], item['rating'], item['title']))
            self.db.commit()
        except Exception as e:
            self.db.rollback()
        return item

    def close_spider(self, spider):
        self.db.close()

2.MongoDB 存储管道

import pymongo

class MyspiderMongoDBPipeline:
    def open_spider(self, spider):
        if spider.name == 'douban':
            self.client = pymongo.MongoClient(host='127.0.0.1', port=27017)
            self.collection = self.client.spiders9.douban

    def process_item(self, item, spider):
        self.collection.insert_one(dict(item))
        return item

    def close_spider(self, spider):
        self.client.close()

(三)启用管道

settings.py 文件中配置管道:

ITEM_PIPELINES = {
   'myspider.pipelines.MyspiderMySQLPipeline': 300,
   'myspider.pipelines.MyspiderMongoDBPipeline': 400,
}

权重值越小的管道越早执行,例如上述配置中,MySQLPipeline 会先处理数据,然后 MongoDBPipeline 再处理。


四、管道的常见应用场景

  • 数据清洗
    使用 process_item 方法对抓取到的数据进行清洗,例如去除 HTML 标签、格式化日期等。

  • 数据验证
    检查抓取的数据是否符合预期格式或字段是否缺失。

  • 多存储目标
    配置多个管道,将数据同时保存到不同的存储介质(如文件和数据库)。

  • 去重操作
    在管道中通过数据库或其他方法实现数据去重,避免重复存储。


五、管道使用注意事项

  • 必须启用
    settings.py 中通过 ITEM_PIPELINES 启用管道,否则即使管道代码正确,Scrapy 也不会调用它们。

  • 返回 item
    每个管道的 process_item 方法必须返回 item,否则后续管道无法接收到数据。

  • 资源管理
    使用 open_spiderclose_spider 方法在爬虫启动和关闭时初始化和释放资源。

  • 处理顺序
    管道的执行顺序由权重值决定,需根据需求合理安排顺序。


六、总结

管道是 Scrapy 爬虫项目中处理数据的核心组件。通过管道,可以对抓取的数据进行清洗、验证、存储等操作。在实际开发中,合理配置和使用管道,不仅可以提高数据处理效率,还能保证数据质量。掌握 Scrapy 管道的使用,是构建高效爬虫项目的重要技能之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/937689.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHPstudy中的数据库启动不了

法一 netstat -ano |findstr "3306" 查看占用该端口的进程号 taskkill /f /pid 6720 杀死进程 法二 sc delete mysql

Hu矩原理 | cv2中基于Hu矩计算图像轮廓相似度差异的函数cv2.matchShapes【小白记笔记】

Hu 矩(Hu Moments) 是一种用于描述轮廓形状的 不变特征。它基于图像的矩提取,经过数学变换得到 7 个不变矩,这些不变矩在图像 平移、旋转和缩放等几何变换下保持不变,适合用来衡量轮廓或形状的相似度差异。 1、图像矩…

Ilya Sutskever发表了对AI未来发展的颠覆性看法

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

网络层IP协议(TCP)

IP协议: 在了解IP协议之前,我们市面上看到的"路由器"其实就是工作在网络层。如下图: 那么网络层中的IP协议究竟是如何发送数据包的呢? IP报头: IP协议的报头是比较复杂的,作为程序猿只需要我们重…

【MySQL】InnoDB引擎中的Compact行格式

目录 1、背景2、数据示例3、Compact解释【1】组成【2】头部信息【3】隐藏列【4】数据列 4、总结 1、背景 mysql中数据存储是存储引擎干的事,InnoDB存储引擎以页为单位存储数据,每个页的大小为16KB,平时我们操作数据库都是以行为单位进行增删…

Visual Studio 玩转 IntelliCode AI辅助开发

🎀🎀🎀【AI辅助编程系列】🎀🎀🎀 Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…

【LDAP】LDAP概念和原理介绍

目录 一、前言 二、什么是LDAP? 2.1 什么是目录服务? 2.2 LDAP的介绍 2.3 为什么要使用LDAP 三、LDAP的主要产品线 四、LDAP的基本模型 4.1 目录树概念 4.2 LDAP常用关键字列表 4.3 objectClass介绍 五、JXplorer工具使用 一、前言 对于许多的…

用ue5打开网址链接

需要用到 Launch URL 这个函数 字面意思就是打开填写的链接网页 这里填写的是百度,按下Tab键后就会打开百度的网页

在ESP32使用AT指令集与服务器进行TCP/IP通信时,<link ID> 解释

在ESP32使用AT指令集与服务器进行TCP/IP通信时&#xff0c;<link ID> 是一个非常重要的参数。它用于标识不同的连接实例&#xff0c;特别是在多连接场景下&#xff08;如同时建立多个TCP或UDP连接&#xff09;。每个连接都有唯一的<link ID>&#xff0c;通过这个ID…

前后端跨域问题(CROS)

前端 在src中创建util文件&#xff0c;写request.js文件&#xff1a; request.js代码如下&#xff1a; import axios from axios import { ElMessage } from element-plus;const request axios.create({// baseURL: /api, // 注意&#xff01;&#xff01; 这里是全局统一加…

学习笔记071——Java中的【线程】

文章目录 1、基础2、进程和线程3、什么是多线程4、Java 中线程的使用5、Java 中创建线程的方式5.1、继承 Thread 类5.2、实现 Runnable 接口5.3、继承 Thread 和实现 Runnable 接口的区别5.4、实现 Runnable 接口的优化 6、线程的状态7、线程调度7.1、线程休眠7.2、线程合并7.3…

devops-部署Harbor实现私有Docker镜像仓库

文章目录 概述下载配置安装安装后生成的文件使用和维护Harbor参考资料 概述 Harbor是一个开源注册中心&#xff0c;它使用策略和基于角色的访问控制来保护工件&#xff0c;确保镜像被扫描并且没有漏洞&#xff0c;并将镜像签名为可信的。Harbor是CNCF的一个毕业项目&#xff0…

快速上手Neo4j图关系数据库

参考视频&#xff1a; 【IT老齐589】快速上手Neo4j网状关系图库 1 Neo4j简介 Neo4j是一个图数据库&#xff0c;是知识图谱的基础 在Neo4j中&#xff0c;数据的基本构建块包括&#xff1a; 节点(Nodes)关系(Relationships)属性(Properties)标签(Labels) 1.1 节点(Nodes) 节点…

Polkadot 11 月生态月报:3900万交易量、69%增长率,技术与社区齐头并进

原文&#xff1a;https://x.com/Polkadot/status/1865118662069490074 编译&#xff1a;OneBlock 上个月对 Polkadot 生态来说可谓是跌宕起伏&#xff0c;从创下交易记录到开创性合作&#xff0c;Polkadot 热度不断。展现出强大的技术实力和蓬勃发展的社区活力。在回顾本月亮点…

基坑表面位移沉降倾斜自动化监测 非接触式一体化解决机器视觉

基于变焦视觉位移监测仪的基坑自动化监测新方案是一种集成了光学、机械、电子、边缘计算、AI识别以及云平台软件等技术的自动化系统。该方案利用变焦机器视觉原理&#xff0c;结合特殊波段成像识别技术和无源靶标&#xff0c;实现了非接触式大空间、多断面、多测点的高精度水平…

CSS学习-第三天

css链接 链接样式&#xff0c;可以使用任何css属性 特别的样式&#xff0c;可以有不同的样式 a:link - 正常&#xff0c;未访问过的链接 a:visited - 用户已访问过的链接 a:hover - 当用户鼠标放在链接上时 a:active - 链接被点击的那一刻 a:hover必须跟在a:link和a:visited后…

电脑显示器选购指南2024

选择显示器是五花八门的显示参数&#xff0c;如何选择&#xff0c;以下给出参数说明&#xff0c;及部分参考&#xff1a; 1. 尺寸和分辨率 尺寸&#xff08;英寸&#xff09; 根据使用距离和用途选择合适的屏幕尺寸&#xff1a; 21-24 英寸&#xff1a;适合小桌面空间、日常…

快速掌握C语言——数据结构【创建顺序表】多文件编译

1.数据结构脑图&#xff08;未完&#xff09; 2.顺序表其他操作 3.功能函数封装 4 完整代码 1>头文件test.h #ifndef __TEST_H__ #define __TEST_H__#include<stdlib.h> #include<stdio.h> #include<string.h>//宏定义 线性表的最大容量 #define MAX 3…

Linux 中的 mkdir 命令:深入解析

在 Linux 系统中&#xff0c;mkdir 命令用于创建目录。它是文件系统管理中最基础的命令之一&#xff0c;广泛应用于日常操作和系统管理中。本文将深入探讨 mkdir 命令的功能、使用场景、高级技巧&#xff0c;并结合 GNU Coreutils 的源码进行详细分析。 1. mkdir 命令的基本用法…

STM32F407+LAN8720A +LWIP +FreeRTOS UDP通讯

STM32F407+LAN8720A +LWIP +FreeRTOS ping通 上一篇实现了LWIP ping 通 本篇实现UDP通讯 实现如下功能: 串口1空闲中断+DMA接收,收到数据用UDP发送UDP接收,收到数据用串口1发送STM32CUBEIDE配置和代码 1. 配置UARAT1的空闲中断+DMA接收 UART1接收到数据,释放信号量,在任…