爬虫框架Scrapy学习笔记-3

Scrapy管道详解:数据存储和图片下载

引言

在网络爬虫开发中,数据的存储和处理是至关重要的环节。Scrapy作为Python中一款强大的网络爬虫框架,提供了丰富的数据存储和处理功能,其中最重要的概念之一就是管道(Pipeline)。本文将深入探讨Scrapy管道的使用,包括如何将爬取的数据保存到不同的数据存储中,以及如何下载和处理图片数据。

摘要

本文将围绕以下主题展开讨论:

  1. CSV文件写入:介绍如何将爬取的数据保存到CSV文件中,包括创建、打开、写入数据以及关闭文件的操作。

  2. MySQL数据库写入:配置MySQL数据库连接信息,并演示如何将爬取的数据写入MySQL数据库表中,包括数据库连接的建立和关闭。

  3. MongoDB数据库写入:配置MongoDB数据库连接信息,并示范如何将数据存储到MongoDB数据库集合中,同样包括连接的管理。

  4. 文件保存(图片下载):探讨如何使用Scrapy下载图片,包括发送下载请求、指定图片存储路径和数据处理。

  5. 自定义管道:介绍如何创建自定义管道来处理爬取的数据,以满足特定需求。

1. CSV文件写入

1.1 步骤概述

  • 配置设置:在Scrapy项目的settings.py文件中添加管道的配置。
  • 创建管道:创建一个自定义的管道,实现在爬虫中将数据保存到CSV文件的功能。
  • 数据写入:在管道的process_item()方法中,将爬取的数据写入CSV文件。

1.2 示例代码

class CsvFilePipeline:def open_spider(self, spider):self.file = open("data.csv", mode="a", encoding="utf-8")def close_spider(self, spider):self.file.close()def process_item(self, item, spider):data = f"{item['title']},{item['link']}\n"self.file.write(data)return item

2. MySQL数据库写入

2.1 步骤概述

  • 配置数据库连接:在settings.py中配置MySQL数据库的连接信息,包括主机、端口、用户名、密码和数据库名。
  • 创建数据库管道:创建一个自定义的管道,用于在爬虫中将数据写入MySQL数据库。
  • 建立连接:在管道的open_spider()方法中建立与MySQL数据库的连接。
  • 数据写入:在管道的process_item()方法中将爬取的数据写入MySQL数据库表中。
  • 关闭连接:在管道的close_spider()方法中关闭数据库连接。

2.2 示例代码

from scrapy.exporters import CsvItemExporter
import pymysqlclass MysqlPipeline:def __init__(self, mysql_config):self.mysql_config = mysql_config@classmethoddef from_crawler(cls, crawler):mysql_config = crawler.settings.get('MYSQL_CONFIG')return cls(mysql_config)def open_spider(self, spider):self.conn = pymysql.connect(**self.mysql_config)self.cursor = self.conn.cursor()def close_spider(self, spider):self.conn.close()def process_item(self, item, spider):sql = "INSERT INTO mytable (title, link) VALUES (%s, %s)"self.cursor.execute(sql, (item['title'], item['link']))self.conn.commit()return item

3. MongoDB数据库写入

3.1 步骤概述

  • 配置数据库连接:在settings.py中配置MongoDB数据库的连接信息,包括主机、端口和数据库名。
  • 创建数据库管道:创建一个自定义的管道,用于在爬虫中将数据写入MongoDB数据库。
  • 建立连接:在管道的open_spider()方法中建立与MongoDB数据库的连接。
  • 数据写入:在管道的process_item()方法中将爬取的数据写入MongoDB数据库集合中。
  • 关闭连接:在管道的close_spider()方法中关闭数据库连接。

3.2 示例代码

import pymongoclass MongoPipeline:def __init__(self, mongo_uri, mongo_db):self.mongo_uri = mongo_uriself.mongo_db = mongo_db@classmethoddef from_crawler(cls, crawler):mongo_uri = crawler.settings.get('MONGO_URI')mongo_db = crawler.settings.get('MONGO_DATABASE')return cls(mongo_uri, mongo_db)def open_spider(self, spider):self.client = pymongo.MongoClient(self.mongo_uri)self.db = self.client[self.mongo_db]def close_spider(self, spider):self.client.close()def process_item(self, item, spider):self.db['mycollection'].insert_one(dict(item))return item

4. 文件保存(图片下载)

4.1 步骤概述

  • 配置设置:在settings.py中配置图片下载的相关设置,包括存储路径和管道顺序。
  • 创建图片下载管道:创建一个自定义的管道,继承自ImagesPipeline,用于处理图片下载。
  • 发送下载请求:使用get_media_requests()方法发送图片下载请求。
  • 指定存储路径:使用file_path()方法指定图片的存储路径。
  • 数据处理:在item_completed()方法中对爬取的数据进行处理。

4.2 示例代码

from scrapy.pipelines.images import ImagesPipelineclass MyImagesPipeline(ImagesPipeline):def get_media_requests(self, item, info):for image_url in item['image_urls']:yield scrapy.Request(image_url, meta={'item': item})def file_path(self, request, response=None, info=None, *, item=None):item = request.meta['item']return f'images/{item["title"]}/{request.url.split("/")[-1]}'def item_completed(self, results, item, info):image_paths = [x['path'] for ok, x in results if ok]if not image_paths:raise DropItem("Image download failed")return item

5. 自定义管道

除了以上提到的数据存储和图片下载管道外,Scrapy还支持创建自定义管道来处理爬取的数据。您可以根据特定需求编写自己的管道,以实现更灵活的数据处理和存储。

5.1 步骤概述

  • 创建自定义管道:编写一个自定义的管道类,可以继承自Scrapy提供的BaseItemExporter类,然后在管道中实现数据处理逻辑。
  • 配置设置:在settings.py中配置自定义管道的顺序和其他相关设置。

5.2 示例代码

from scrapy.exporters import BaseItemExporterclass MyCustomPipeline:def process_item(self, item, spider):# 自定义数据处理逻辑# 可以根据需求对item进行修改item['processed_data'] = item['raw_data'] * 2return item

总结

Scrapy的管道是一个非常强大的工具,用于处理爬取的数据和图片。通过配置合适的管道,您可以将数据保存到不同的数据存储中,如CSV文件、MySQL数据库和MongoDB数据库,同时也能够轻松实现图片的下载和处理。此外,您还可以根据自己的需求创建自定义管道,以扩展Scrapy的功能。

在实际爬虫项目中,根据具体需求选择合适的管道非常重要。希望本文能够帮助您更好地理解Scrapy管道的使用方法,并在爬虫开发中发挥其作用。如果您对Scrapy还有其他问题或需要更多帮助,请参考Scrapy官方文档或在CSDN等社区寻求解答。

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

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

相关文章

【JavaEESpring】Spring Web MVC⼊⻔

Spring Web MVC 1. 什么是 Spring Web MVC1.1 什么是 MVC ?1.2 是什么 Spring MVC? 2. 学习 Spring MVC2.1 建立连接2.2 请求2.3 响应 3. 相关代码链接 1. 什么是 Spring Web MVC 官⽅对于 Spring MVC 的描述是这样的: 1.1 什么是 MVC ? MVC 是 Model View C…

MySQL的一个Bug修复提高了4倍性能

MySQL修复了一个在读取过程中导致额外IO的错误。修复后的读取速度提高了4倍(当存在并发插入时)。 MySQL 8.0.35包括对错误 109595的修复 ,通过该修复,与 MySQL 8.0.34 相比,读写基准步骤上的 QPS 几乎增加了 4 倍。 …

Java算法(六):模拟评委打分案例 方法封装抽离实现 程序的节流处理

Java算法(六) 评委打分 需求: 在编程竞赛中,有 6 个评委为参赛选手打分,分数为 0 - 100 的整数分。 选手的最后得分为:去掉一个最高分和一个最低分后 的 4个评委的平均值。 注意程序的节流 package c…

当前读和快照读

增删改查的实现原理 快照读: 简单的select操作,属于快照读,不加锁。 select * from table where ?; 普通读是通过 undo log MVCC 来实现的。 当前读: 特殊的读操作,读取记录的最新版本 插入/更新/删除操作&#xff…

qt-C++笔记之Qt中的时间与定时器

qt-C笔记之Qt中的时间与定时器 code review! 文章目录 qt-C笔记之Qt中的时间与定时器一.Qt中的日期时间数据1.1.QTime:获取当前时间1.2.QDate:获取当前日期1.3.QDateTime:获取当前日期和时间1.4.QTime类详解1.5.QDate类详解1.6..QDateTime类…

17 Linux 中断

一、Linux 中断简介 1. Linux 中断 API 函数 ① 中断号 每个中断都有一个中断号,通过中断号可以区分出不同的中断。在 Linux 内核中使用一个 int 变量表示中断号。 ② request_irq 函数 在 Linux 中想要使用某个中断是需要申请的,request_irq 函数就是…

Docker 学习路线 13:部署容器

部署容器是使用Docker和容器化管理应用程序更高效、易于扩展和确保跨环境一致性性能的关键步骤。本主题将为您概述如何部署Docker容器以创建和运行应用程序。 概述 Docker容器是轻量级、可移植且自我包含的环境,可以运行应用程序及其依赖项。部署容器涉及启动、管…

sql6(Leetcode1387使用唯一标识码替换员工ID)

1112-2 代码: INNER JOIN 如果表中有至少一个匹配,则返回行 LEFT JOIN 即使右表中没有匹配,也从左表返回所有的行(LEFT为基准 RIGHT JOIN 即使左表中没有匹配,也从右表返回所有的行 # Write your MySQL query st…

【Python】数据分析案例:世界杯数据可视化

文章目录 前期数据准备导入数据 分析:世界杯中各队赢得的比赛数分析:先打或后打的比赛获胜次数分析:世界杯中的抛硬币决策分析:2022年T20世界杯的最高得分者分析:世界杯比赛最佳球员奖分析:最适合先击球或追…

苹果Ios系统app应用程序开发者如何获取IPA文件签名证书时需要注意什么?

今天呢想和大家介绍介绍苹果App开发者如何获取IPA文件签名证书的步骤和注意事项。对于苹果应用程序开发者而言,获取IPA文件签名证书是发布应用程序至App Store的重要步骤之一。签名证书能够确保应用程序的安全性和可信度,并使其能够在设备上正确运行。 …

lightdb UPDATE INDEXES自动分区转换支持全大写索引名

文章目录 背景示例 背景 普通表转分区表,Oracle中的写法习惯索引名会使用大写并用双引号包起来。这导致LightDB 在匹配索引名时提示索引名不存在。 LightDB 23.3.02增量版本对此进行了支持。 示例 准备环境 create database test_oracle with lightdb_syntax_c…

VR全景技术,为养老院宣传推广带来全新变革

现如今,人口老龄化的现象加剧,养老服务行业也如雨后春笋般不断冒头,但是市面上各式的养老院被包装的五花八门,用户实际参访后却差强人意,如何更好的给父母挑选更为舒心的养老环境呢?可以利用720度VR全景技术…

[P7885][Android13] 解决5G信号良好状态栏信号只有两格的问题

文章目录 开发平台基本信息问题描述解决方法 开发平台基本信息 芯片: 展锐P7885 版本: Android 13 kernel: kernel-5.15 问题描述 最近有一款预研设备使用的是展锐 P7885 的5G 智能模组;经过天线厂调试天线后,各项指标都达到了标准,正常待…

iOS代码混淆----自动

先大致解释一下“编译"、"反编译": 编译:就是把千千万万行字符串(也叫代码,或者源文件),变成010101010101(机器码,也叫目标代码) 编译过程:预处理-编译-汇编-链接 我的脚本运行在预处理阶段。 反编…

什么是数据库?数据库有哪些基本分类和主要特点?

数据库是以某种有组织的方式存储的数据集合。本文从数据库的基本概念出发,详细解读了数据库的主要类别和基本特点,并就大模型时代备受瞩目的数据库类型——向量数据库进行了深度剖析,供大家在了解数据库领域的基本概念时起到一点参考作用。 …

讲解机器学习中的 K-均值聚类算法及其优缺点。

K-均值聚类算法是一种无监督学习算法,常用于对数据进行聚类分析。其主要步骤如下: 首先随机选择K个中心点(质心)作为初始聚类中心。 对于每一个样本,计算其与每一个中心点的距离,将其归到距离最近的中心点…

kafka分区数和log.segment.bytes引发的kafka主题数据总字节数的疑问

突然想到一个问题, ①kafka broker的log.segment.bytes配置指定触发日志片段关闭的最大字节总数,当日志片段大小该值时,当前日志片段会被关闭,新的日志片段会被打开。 ②kafka的主题分区数是固定的,一个分区对应一个日…

计算机视觉驾驶行为识别应用简述

一、什么是计算机视觉识别? 计算机视觉识别是一种基于图像处理和机器学习的人工智能应用技术,可以用于多个场景。常见应用场景包括人脸识别、场景识别、OCR识别以及商品识别等。今天以咱们国产系统豌豆云为例,为大家梳理一下在车辆驾驶行为中…

Kafka -- 架构、分区、副本

1、Kafka的架构: 1、producer:消息的生产者 2、consumer:消息的消费者 3、broker:kafka集群的服务者,一个broker就是一个节点,主要是负责处理消息的读、写的请求和存储消息。在kafka cluster中包含很多的br…

什么是Java虚拟机(JVM),它的作用是什么?

什么是Java虚拟机(JVM) Java虚拟机(Java Virtual Machine,JVM)是Java平台的关键组成部分,它是一种在不同操作系统上运行Java程序的虚拟计算机。 JVM的作用是执行Java字节码(Java bytecode&#…