【愚公系列】《Python网络爬虫从入门到精通》052-Scrapy 编写 Item Pipeline

news2025/4/19 10:36:33

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟

📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主!

👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"挖山不止"的毅力为开发者们搬开知识道路上的重重阻碍!

💎【行业认证·权威头衔】
✔ 华为云天团核心成员:特约编辑/云享专家/开发者专家/产品云测专家
✔ 开发者社区全满贯:CSDN博客&商业化双料专家/阿里云签约作者/腾讯云内容共创官/掘金&亚马逊&51CTO顶级博主
✔ 技术生态共建先锋:横跨鸿蒙、云计算、AI等前沿领域的技术布道者

🏆【荣誉殿堂】
🎖 连续三年蝉联"华为云十佳博主"(2022-2024)
🎖 双冠加冕CSDN"年度博客之星TOP2"(2022&2023)
🎖 十余个技术社区年度杰出贡献奖得主

📚【知识宝库】
覆盖全栈技术矩阵:
◾ 编程语言:.NET/Java/Python/Go/Node…
◾ 移动生态:HarmonyOS/iOS/Android/小程序
◾ 前沿领域:物联网/网络安全/大数据/AI/元宇宙
◾ 游戏开发:Unity3D引擎深度解析
每日更新硬核教程+实战案例,助你打通技术任督二脉!

💌【特别邀请】
正在构建技术人脉圈的你:
👍 如果这篇推文让你收获满满,点击"在看"传递技术火炬
💬 在评论区留下你最想学习的技术方向
⭐ 点击"收藏"建立你的私人知识库
🔔 关注公众号获取独家技术内参
✨与其仰望大神,不如成为大神!关注"愚公搬代码",让坚持的力量带你穿越技术迷雾,见证从量变到质变的奇迹!✨ |

文章目录

  • 🚀前言
  • 🚀一、编写 Item Pipeline
    • 🔎1.项目管道的核心方法
    • 🔎2.将信息存储至数据库


🚀前言

在前几篇文章中,我们已经学习了如何搭建 Scrapy 爬虫框架,并掌握了 Scrapy 的基本应用。本篇文章中,我们将深入探讨 Scrapy 中的一个重要组件——Item Pipeline

Item Pipeline 是 Scrapy 框架中用于处理抓取到的数据的关键部分。通过 Item Pipeline,我们可以对抓取到的数据进行清洗、验证、存储等一系列处理操作,实现数据从网页到最终存储的全流程管理。理解并正确使用 Item Pipeline,将极大提升我们爬虫项目的数据处理效率和质量。

在本篇文章中,我们将会学习到:

  1. Item Pipeline 的基本概念和作用:了解 Item Pipeline 在 Scrapy 项目中的地位和功能。
  2. 如何编写和配置 Item Pipeline:从定义和编写 Pipeline 到在项目中进行配置与使用。
  3. 数据清洗与验证:如何在 Pipeline 中进行数据清洗和验证,以确保数据的准确性和一致性。
  4. 数据存储:将抓取到的数据存储到各种存储后端,如文件、数据库等。
  5. 多个 Pipeline 的使用:如何在项目中配置和使用多个 Pipeline,灵活处理不同的数据处理需求。

通过本篇文章的学习,你将全面掌握 Scrapy Item Pipeline 的使用技巧,能够实现对抓取数据的高效处理和存储,使你的爬虫项目更加完整和可靠。

🚀一、编写 Item Pipeline

当爬取的数据被存储在 Item 对象后,Spider(爬虫)解析完 Response(响应结果)后,Item 会传递到 Item Pipeline(项目管道)中。通过自定义的管道类可实现数据清洗、验证、去重及存储到数据库等操作。

🔎1.项目管道的核心方法

Item Pipeline 的主要用途:

  • 清理 HTML 数据
  • 验证数据(检查字段完整性)
  • 去重处理
  • 存储数据至数据库

自定义 Pipeline 需实现的方法:

方法说明
process_item()必须实现。处理 Item 对象,参数为 item(Item对象)和 spider(爬虫对象)。
open_spider()爬虫启动时调用,用于初始化操作(如连接数据库)。
close_spider()爬虫关闭时调用,用于收尾工作(如关闭数据库连接)。
from_crawler()类方法(需 @classmethod 装饰),返回实例对象并获取全局配置信息。

示例代码框架:

import pymysql

class CustomPipeline:
    def __init__(self, host, database, user, password, port):
        # 初始化数据库参数
        self.host = host
        self.database = database
        self.user = user
        self.password = password
        self.port = port

    @classmethod
    def from_crawler(cls, crawler):
        # 从配置中读取数据库参数
        return cls(
            host=crawler.settings.get('SQL_HOST'),
            database=crawler.settings.get('SQL_DATABASE'),
            user=crawler.settings.get('SQL_USER'),
            password=crawler.settings.get('SQL_PASSWORD'),
            port=crawler.settings.get('SQL_PORT')
        )

    def open_spider(self, spider):
        # 连接数据库
        self.db = pymysql.connect(
            host=self.host,
            user=self.user,
            password=self.password,
            database=self.database,
            port=self.port,
            charset='utf8'
        )
        self.cursor = self.db.cursor()

    def close_spider(self, spider):
        # 关闭数据库连接
        self.db.close()

    def process_item(self, item, spider):
        # 处理数据并插入数据库
        data = dict(item)
        sql = 'INSERT INTO table_name (col1, col2) VALUES (%s, %s)'
        self.cursor.execute(sql, (data['field1'], data['field2']))
        self.db.commit()
        return item

🔎2.将信息存储至数据库

实现步骤:

  1. 数据库准备

    • 安装 MySQL,创建数据库 jd_data 和数据表 ranking(包含 book_name, author, press 字段)。
      在这里插入图片描述
  2. 创建 Scrapy 项目

    scrapy startproject jd
    cd jd
    scrapy genspider jdSpider book.jd.com
    
  3. 定义 Item(items.py)

    import scrapy
    
    class JdItem(scrapy.Item):
        book_name = scrapy.Field()  # 图书名称
        author = scrapy.Field()     # 作者
        press = scrapy.Field()      # 出版社
    
  4. 编写爬虫(jdSpider.py)

    # -*- coding: utf-8 -*-
    import scrapy
    from jd.items import JdItem     # 导入JdItem类
    
    class JdspiderSpider(scrapy.Spider):
        name = 'jdSpider'                  # 默认生成的爬虫名称
        allowed_domains = ['book.jd.com']
        start_urls = ['http://book.jd.com/']
    
        def start_requests(self):
            # 需要访问的地址
            url = 'https://book.jd.com/booktop/0-0-0.html?category=3287-0-0-0-10001-1'
            yield scrapy.Request(url=url, callback=self.parse)      # 发送网络请求
    
        def parse(self, response):
            all=response.xpath(".//*[@class='p-detail']")                       # 获取所有信息
            book_name = all.xpath("./a[@class='p-name']/text()").extract()      # 获取所有图书名称
            author = all.xpath("./dl[1]/dd/a[1]/text()").extract()              # 获取所有作者名称
            press = all.xpath("./dl[2]/dd/a/text()").extract()                  # 获取所有出版社名称
            item = JdItem()     # 创建Item对象
            # 将数据添加至Item对象
            item['book_name'] = book_name
            item['author'] = author
            item['press'] = press
            yield item    # 打印item信息
            pass
    
    # 导入CrawlerProcess类
    from scrapy.crawler import CrawlerProcess
    # 导入获取项目设置信息
    from scrapy.utils.project import get_project_settings
    
    # 程序入口
    if __name__=='__main__':
        # 创建CrawlerProcess类对象并传入项目设置信息参数
        process = CrawlerProcess(get_project_settings())
        # 设置需要启动的爬虫名称
        process.crawl('jdSpider')
        # 启动爬虫
        process.start()
    
  5. 配置管道(pipelines.py)

    # -*- coding: utf-8 -*-
    
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    
    import pymysql            # 导入数据库连接pymysql模块
    
    class JdPipeline(object):
        # 初始化数据库参数
        def __init__(self,host,database,user,password,port):
            self.host = host
            self.database = database
            self.user = user
            self.password = password
            self.port = port
    
        @classmethod
        def from_crawler(cls,crawler):
            # 返回cls()实例对象,其中包含通过crawler获取配置文件中的数据库参数
            return cls(
                host=crawler.settings.get('SQL_HOST'),
                user=crawler.settings.get('SQL_USER'),
                password=crawler.settings.get('SQL_PASSWORD'),
                database = crawler.settings.get('SQL_DATABASE'),
                port = crawler.settings.get('SQL_PORT')
            )
    
        # 打开爬虫时调用
        def open_spider(self, spider):
            # 数据库连接
            self.db = pymysql.connect(self.host,self.user,self.password,self.database,self.port,charset='utf8')
            self.cursor = self.db.cursor()    #床架游标
    
        # 关闭爬虫时调用
        def close_spider(self, spider):
            self.db.close()
    
        def process_item(self, item, spider):
            data = dict(item)     # 将item转换成字典类型
            # sql语句
            sql = 'insert into ranking (book_name,press,author) values(%s,%s,%s)'
            # 执行插入多条数据
            self.cursor.executemany(sql, list(zip(data['book_name'], data['press'], data['author'])))
            self.db.commit()     # 提交
            return item         # 返回item
    
    
  6. 激活管道(settings.py)

    ITEM_PIPELINES = {
        'jd.pipelines.JdPipeline': 300,
    }
    
    SQL_HOST = 'localhost'
    SQL_USER = 'root'
    SQL_PASSWORD = 'root'
    SQL_DATABASE = 'jd_data'
    SQL_PORT = 3306
    
  7. 运行爬虫

    from scrapy.crawler import CrawlerProcess
    from scrapy.utils.project import get_project_settings
    
    if __name__ == '__main__':
        process = CrawlerProcess(get_project_settings())
        process.crawl('jdSpider')
        process.start()
    

在这里插入图片描述


注意事项

  • 确保已安装 pymysql
    pip install pymysql
    
  • 若出现编码问题,可在 MySQL 连接参数中添加 charset='utf8mb4'
  • 数据库表字段需与 Item 中定义的字段一致。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AI News | 20250416】每日AI进展

AI Repos 1、Tutorial-Codebase-Knowledge 自动分析 GitHub 仓库并生成适合初学者的通俗易懂教程,清晰解释代码如何运行,还能生成可视化内容来展示核心功能。爬取 GitHub 仓库并从代码中构建知识库;分析整个代码库以识别核心抽象概念及其交互…

GIS开发笔记(6)结合osg及osgEarth实现半球形区域绘制

一、实现效果 输入中心点坐标及半径,绘制半球形区域,地下部分不显示。 二、实现原理 根据中心点及半径绘制半球形区域,将其挂接到地球节点。 三、参考代码 void GlobeWidget::drawSphericalRegion(osg::Vec3d point,double radius) {// 使…

element-ui自定义主题

此处的element-ui为基于vue2.x的 由于https://element.eleme.cn/#/zh-CN/theme/preview(element的主题)报错503, 所以使用https://element.eleme.cn/#/zh-CN/component/custom-theme 自定义主题文档中,在项目中改变scss变量的方…

windows下使用nginx + waitress 部署django

架构介绍 linux一般采用nginx uwsgi部署django,在Windows下,可以取代uwsgi的选项包括Waitressa、Daphnea、Hypercoma和Gunicorna(通过WSLa 运行)。windows服务器一般采用nginx waitress 部署django,,他们的关系如下 django是WEB应用…

MySQL-多版本并发控制MVCC

文章目录 一、多版本并发控制MVCC二、undo log(回滚日志)二、已提交读三、可重复读总结 一、多版本并发控制MVCC MVCC是多版本并发控制(Multi-Version Concurrency Control),是MySQL中基于乐观锁理论实现隔离级别的方…

目标检测与分割:深度学习在视觉中的应用

🔍 PART 1:目标检测(Object Detection) 1️⃣ 什么是目标检测? 目标检测是计算机视觉中的一个任务,目标是让模型“在图像中找到物体”,并且判断: 它是什么类别(classif…

杰弗里·辛顿:深度学习教父

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 杰弗里辛顿:当坚持遇见突破,AI迎来新纪元 一、人物简介 杰弗…

STM32蓝牙连接Android实现云端数据通信(电机控制-开源)

引言 基于 STM32F103C8T6 最小系统板完成电机控制。这个小项目采用 HAL 库方法实现,通过 CubeMAX 配置相关引脚,步进电机使用 28BYJ-48 (四相五线式步进电机),程序通过蓝牙连接手机 APP 端进行数据收发, OL…

第一个Qt开发的OpenCV程序

OpenCV计算机视觉开发实践:基于Qt C - 商品搜索 - 京东 下载安装Qt:https://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-windows-x86-5.14.2.exe 下载安装OpenCV:https://opencv.org/releases/ 下载安装CMake:Downl…

TCP 如何在网络 “江湖” 立威建交?

一、特点: (一)面向连接 在进行数据传输之前,TCP 需要在发送方和接收方之间建立一条逻辑连接。这一过程类似于打电话,双方在通话前需要先拨号建立连接。建立连接的过程通过三次握手来完成,确保通信双方都…

【小白训练日记——2025/4/15】

变化检测常用的性能指标 变化检测(Change Detection)的性能评估依赖于多种指标,每种指标从不同角度衡量模型的准确性。以下是常用的性能指标及其含义: 1. 混淆矩阵(Confusion Matrix) 定义:统…

数据结构——二叉树(中)

接上一篇,上一篇主要讲解了关于二叉树的基本知识,也是为了接下来讲解关于堆结构和链式二叉树结构打基础,其实无论是堆结构还是链式二叉树结构,都是二叉树的存储结构,那么今天这一篇主要讲解关于堆结构的实现与应用 堆…

02-MySQL 面试题-mk

文章目录 1.mysql 有哪些存储引擎、区别是什么?1.如何定位慢查询?2.SQL语句执行很慢,如何分析?3.索引概念以及索引底层的数据结构4.什么是聚簇索引什么是非聚簇索引?5.知道什么叫覆盖索引嘛 ?6.索引创建原则有哪些?7.什么情况下索引会失效 ?8.谈一谈你对sql的优化的经验…

#include<bits/stdc++.h>

#include<bits/stdc.h> 是 C 中一个特殊的头文件&#xff0c;其作用如下&#xff1a; 核心作用 ​​包含所有标准库头文件​​ 该头文件会自动引入 C 标准库中的几乎全部头文件&#xff08;如 <iostream>、<vector>、<algorithm> 等&#xff09;&…

在企业级部署中如何优化NVIDIA GPU和容器环境配置:最佳实践与常见误区20250414

在企业级部署中如何优化NVIDIA GPU和容器环境配置&#xff1a;最佳实践与常见误区 引言 随着AI和深度学习技术的迅速发展&#xff0c;企业对GPU加速计算的需求愈加迫切。在此过程中&#xff0c;如何高效地配置宿主机与容器化环境&#xff0c;特别是利用NVIDIA GPU和相关工具&…

Spring Boot 项目三种打印日志的方法详解。Logger,log,logger 解读。

目录 一. 打印日志的常见三种方法&#xff1f; 1.1 手动创建 Logger 对象&#xff08;基于SLF4J API&#xff09; 1.2 使用 Lombok 插件的 Slf4j 注解 1.3 使用 Spring 的 Log 接口&#xff08;使用频率较低&#xff09; 二. 常见的 Logger&#xff0c;logger&#xff0c;…

[react]Next.js之自适应布局和高清屏幕适配解决方案

序言 阅读前首先了解即将要用到的两个包的作用 1.postcss-pxtorem 自动将 CSS 中的 px 单位转换为 rem 单位按照设计稿尺寸直接写 px 值&#xff0c;由插件自动计算 rem 值 2.amfe-flexible 动态设置根元素的 font-size&#xff08;即 1rem 的值&#xff09;根据设备屏幕宽度和…

STM32H503CB升级BootLoader

首先&#xff0c;使用SWD接口&#xff0c;ST-LINK连接电脑和板子。 安装SetupSTM32CubeProgrammer_win64 版本2.19。 以下是接线和软件操作截图。

在Apple Silicon上部署Spark-TTS:四大核心库的技术魔法解析!!!

在Apple Silicon上部署Spark-TTS&#xff1a;四大核心库的技术魔法解析 &#x1f680; &#xff08;M2芯片实测&#xff5c;Python 3.12.9PyTorch 2.6.0全流程解析&#xff09; 一、核心库功能全景图 &#x1f50d; 在Spark-TTS的部署过程中&#xff0c;pip install numpy li…

VMWare 16 PRO 安装 Rocky8 并部署 MySQL8

VMWare 16 PRO 安装 Rocky8 并部署 MySQL8 一.Rocky OS 下载1.官网二.配置 Rocky1.创建新的虚拟机2.稍后安装系统3.选择系统模板4.设置名字和位置5.设置大小6.自定义硬件设置核心、运存和系统镜像7.完成三.启动安装1.上下键直接选择安装2.回车安装3.设置分区(默认即可)和 roo…