• 爬虫框架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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2. MySQL数据库写入

    2.1 步骤概述

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

    2.2 示例代码

    from scrapy.exporters import CsvItemExporter
    import pymysql
    
    class MysqlPipeline:
    
        def __init__(self, mysql_config):
            self.mysql_config = mysql_config
    
        @classmethod
        def 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    3. MongoDB数据库写入

    3.1 步骤概述

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

    3.2 示例代码

    import pymongo
    
    class MongoPipeline:
    
        def __init__(self, mongo_uri, mongo_db):
            self.mongo_uri = mongo_uri
            self.mongo_db = mongo_db
    
        @classmethod
        def 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

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

    4.1 步骤概述

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

    4.2 示例代码

    from scrapy.pipelines.images import ImagesPipeline
    
    class 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    5. 自定义管道

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

    5.1 步骤概述

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

    5.2 示例代码

    from scrapy.exporters import BaseItemExporter
    
    class MyCustomPipeline:
    
        def process_item(self, item, spider):
            # 自定义数据处理逻辑
            # 可以根据需求对item进行修改
            item['processed_data'] = item['raw_data'] * 2
            return item
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    总结

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

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

  • 相关阅读:
    dolphinscheduler 3.0.1数据质量
    树莓派高级开发------总线地址、物理地址和虚拟地址的认识
    [c++基础]-vector类
    前端工作总结95-vuex取值
    ZYNQ实验--裸机程序固化
    计算机英文论文写作需要注意哪些细节? - 易智编译EaseEditing
    开源电商项目 Mall:构建高效电商系统的终极选择
    设置枚举的大小
    水电气能耗管理云平台
    【毕业设计】基于SSM与大数据分析的停车场管理系统
  • 原文地址:https://blog.csdn.net/qq_42531954/article/details/133274897