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

【愚公系列】《Python网络爬虫从入门到精通》052-Scrapy 编写 Item Pipeline技术大咖愚公搬代码 全栈专家的成长之路 你关注的宝藏博主在这里 开发者圈持续输出高质量干货的 愚公精神 践行者 全网百万开发者都在追更的顶级技术博主 江湖人称 愚公搬代码 用七年如一日的精神深耕技术领域 以 挖山不止 的毅力为开发者们搬开知识道路上的重重阻碍 知识宝库 覆盖全栈技术矩阵

大家好,我是讯享网,很高兴认识大家。这里提供最前沿的Ai技术和互联网信息。



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

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

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

文章目录
  • 🚀前言
  • 🚀一、编写 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 对象后,Spider(爬虫)解析完 Response(响应结果)后,Item 会传递到 Item Pipeline(项目管道)中。通过自定义的管道类可实现数据清洗、验证、去重及存储到数据库等操作。

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

实现步骤:

  1. 数据库准备
  • 安装 MySQL,创建数据库 jd_data 和数据表 ranking(包含 book_name, author, press 字段)。
  1. 创建 Scrapy 项目
scrapy startproject jd 

cd jd scrapy genspider jdSpider book.jd.com

  1. 定义 Item(items.py)
import scrapy 

class JdItem(scrapy.Item):

book_name = scrapy.Field() # 图书名称 author = scrapy.Field() # 作者 press = scrapy.Field() # 出版社
  1. 编写爬虫(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()
  1. 配置管道(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
  1. 激活管道(settings.py)
ITEM_PIPELINES = { 'jd.pipelines.JdPipeline': 300, 

}

SQL_HOST = ‘localhost’ SQL_USER = ‘root’ SQL_PASSWORD = ‘root’ SQL_DATABASE = ‘jd_data’ SQL_PORT = 3306

  1. 运行爬虫
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()

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


注意事项

  • 确保已安装 pymysql
pip install pymysql
  • 若出现编码问题,可在 MySQL 连接参数中添加 charset='utf8mb4'
  • 数据库表字段需与 Item 中定义的字段一致。
小讯
上一篇 2026-04-12 21:28
下一篇 2026-04-12 21:26

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/252288.html