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

🌈个人主页:易辰君-CSDN博客

🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html

目录

前言

[一、了解 Scrapy Shell](#一、了解 Scrapy Shell)

[二、配置文件 settings.py](#二、配置文件 settings.py)

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

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

(三)常用字段及其含义

三、管道的深入使用

(一)管道的常用方法

(二)管道的实现

(三)启用管道

四、管道的常见应用场景

五、管道使用注意事项

六、总结


前言

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


一、了解 Scrapy Shell

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

使用方法

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

bash 复制代码
scrapy shell https://movie.douban.com/top250

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

python 复制代码
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 存储管道

python 复制代码
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 存储管道

python 复制代码
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 文件中配置管道:

python 复制代码
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 管道的使用,是构建高效爬虫项目的重要技能之一。

相关推荐
莫叫石榴姐几秒前
SQL进阶技巧:如何根据工业制程参数计算良品率?
数据库·python·sql·机器学习·数据分析·线性回归
Faylynn几秒前
Python:程序中如何引用环境变量
开发语言·python
小堃学编程2 分钟前
Python学习(二)—— 基础语法(上)
开发语言·python
会思想的苇草i3 分钟前
JavaScript--原型与原型链
开发语言·前端·javascript·设计模式·原型·原型模式·原型链
向宇it5 分钟前
【从零开始入门unity游戏开发之——C#篇06】变量类型转化和异常捕获
开发语言·游戏·unity·c#·游戏引擎
wks198912155 分钟前
线程sleep的时候会释放锁吗
开发语言·c++·算法
伍贰什丿7 分钟前
C语言学习day22:ReadProcessMemory函数/游戏内存数据读取工具开发
c语言·开发语言·学习·游戏
风_流沙7 分钟前
java中的List、数组和set
java·python·list
MavenTalk19 分钟前
阿里云免费SSL证书调整为3个月后,自动升级SSL证书方案
python·阿里云·云计算·ansible·ssl
四口鲸鱼爱吃盐26 分钟前
Pytorch | 对比Pytorch中的十种优化器:基于CIFAR10上的ResNet分类器
人工智能·pytorch·python