Scrapy框架内置管道之图片视频和文件(一篇文章齐全)

news2024/10/1 5:38:51

1、Scrapy框架初识(点击前往查阅)

2、Scrapy框架持久化存储(点击前往查阅)

3、Scrapy框架内置管道

4、Scrapy框架中间件(点击前往查阅)

Scrapy 是一个开源的、基于Python的爬虫框架,它提供了强大而灵活的工具,用于快速、高效地提取信息。Scrapy包含了自动处理请求、处理Cookies、自动跟踪链接、下载中间件等功能

Scrapy框架的架构图(先学会再来看,就能看懂了!) 

 一、内置管道(图片视频)

1:sttings设置

# 用于在指定目录下创建一个保存图片的文件夹。
IMAGES_STORE = "./imgs"

其他的设置不理解的可以参考: Scrapy框架初识

2:数据分析

详细见图片中注视哦~

代码:

import scrapy
from ..items import CsdnItem


class ImgSpider(scrapy.Spider):
    # 爬虫文件唯一标识
    name = "img"
    # allowed_domains = ["www.xxx.com"]

    # 发起请求的url列表
    start_urls = ["https://image.so.com/zjl?sn=0&ch=wallpaper"]

    def parse(self, response):
        # 获取返回数据:根据分析得到数据是json格式的
        img_data = response.json()

        # 根据数据分析,我们需要数据在list中
        for url in img_data["list"]:
            # 循环获取到图片的标题和url
            img_title = url["title"]
            img_url = url["imgurl"]

            # 实例化item对象
            item = CsdnItem()

            # 往item中封装数据
            item["img_title"] = img_title
            item["img_url"] = img_url

            # 将item提交给管道
            yield item

3:创建item对象

 详细见图片中注视哦~

代码:

import scrapy


class CsdnItem(scrapy.Item):
    # define the fields for your item here like:

    # 变量随便命名,scrapy.Field() 是固定写法
    img_title = scrapy.Field()
    img_url = scrapy.Field()

4:提交管道,持久化存储

4.1:模块安装 

pip install pillow

4.2:代码分析

配合下方图片:

  • 1、首先导入 ImagesPipeline 模块,然后class类继承。
  • 2、重新构建三个固定函数用于图片的批量下载和保存的操作。
    • get_media_requests函数:负责对图片进行请求发送获取图片二进制的数据。
      • itme获取爬虫数据传过来的数据这个,不懂理解看这个:item相关知识
      • yield发起请求这个是固定写法,参数意思可以看图中注释。
    • file_path函数:负责指定保存图片的名字。
      • 利用requests来获取上面传过来的数据。
      • return返回的值就是图片的名字和后缀
    • item_completed函数:用于将item对象传递给下一个管道。

代码:

import scrapy
from scrapy.pipelines.images import ImagesPipeline  # 导入模块


class CsdnPipeline(ImagesPipeline):  # (ImagesPipeline)括号内加入这个 是面向对象继承,属于面向对象知识。
    # 重新构建三个固定函数用于图片的批量下载和保存的操作。
    def get_media_requests(self, item, info):  # 该函数是负责对图片进行请求发送获取图片二进制的数据
        # 可以通过item参数接收爬虫文件提交过来的item对象
        img_title = item["img_title"]
        img_url = item["img_url"]

        # 对图片地址发起请求,(参数1,参数2) 参数1:url  参数2:请求传参,可以将数据传给 file_path 下面这个函数
        yield scrapy.Request(img_url, meta={"img_title": img_title})

    def file_path(self, request, response=None, info=None, *, item=None):  # 负责指定保存图片的名字
        # 接收 get_media_requests 函数中通过meta发送过来的数据。
        img_title = request.meta["img_title"]

        # 给图片名字带上后缀
        img_title = img_title + ".jpg"

        # 然后返回图片名字
        return img_title

    def item_completed(self, results, item, info):  # 用于将item对象传递给下一个管道
        return item

5:结果展示与总结

为什么会在这个文件夹中呢?因为刚开始的 settings 中,我们创建并指定了这个文件夹!!!

 补充:在设置 settings 中,还可以设置图片的缩略图尺寸。

 

代码流程:

  • 1.在爬虫文件中进行图片/视频的链接提取

  • 2.将提取到的链接封装到items对象中,提交给管道

  • 3.在管道文件中自定义一个父类为ImagesPipeline的管道类,且重写三个方法即可:

    • def get_media_requests(self, item, info):接收爬虫文件提交过来的item对象,然后对图片地址发起网路请求,返回图片的二进制数据
      
      def file_path(self, request, response=None, info=None, *, item=None):指定保存图片的名称
      def item_completed(self, results, item, info):返回item对象给下一个管道类

 二、内置管道(文件)

1:sttings设置

# 用于在指定目录下创建一个保存文件的文件夹。
FILES_STORE = "./file"

其他的设置不理解的可以参考: Scrapy框架初识

2:数据分析

详细见图片中注视哦,比较简单,不做过多分析了~

代码:

import scrapy
from ..items import CsdnItem  # 将item模块导入


class FileSpider(scrapy.Spider):
    # 爬虫文件唯一标识
    name = "file"
    # allowed_domains = ["www.xxx.com"]
    # 发起请求的url列表
    start_urls = ["https://docs.twisted.org/en/stable/core/examples/"]

    def parse(self, response):
        # 解析到url列表
        url_list = response.xpath('//section[@id="examples"]/section[1]//ul//a/@href').extract()
        for url in url_list:  # 分析得到URL不全。

            # 利用字符串分割拼接成一个完整的。
            url = url.split('../../')[-1]
            download_url = "https://docs.twisted.org/en/stable/" + url

            # 文件名称,就取链接的最后的
            title = url.split('/')[-1]

            # 创建item对象
            item = CsdnItem()

            # 封装值
            item['file_urls'] = download_url
            item['file_title'] = title

            # 将item提交给管道
            yield item

 

3:创建item对象

详细见图片中注视哦,与前面不同的是有2个字段是必须存在的。

 

4:提交管道,持久化存储

4.1:模块安装 

pip install pillow

4.2:代码分析

配合下方图片:

  • 1、首先导入FilesPipeline 模块,然后class类继承。
  • 2、重新构建三个固定函数用于文件的批量下载和保存的操作。
    • get_media_requests函数:负责对文件进行请求,获取图片二进制的数据。
      • itme获取爬虫数据传过来的数据这个,不懂理解看这个:item相关知识
      • yield发起请求这个是固定写法,参数意思可以看图中注释。
    • file_path函数:负责指定保存文件的名字。
      • 利用requests来获取上面传过来的数据。
      • return返回的值就是文件的名字
    • item_completed函数:用于将item对象传递给下一个管道。

代码: 

import scrapy
from scrapy.pipelines.files import FilesPipeline  # 导入模块


class CsdnPipeline(FilesPipeline):  # (ImagesPipeline)括号内加入这个 是面向对象继承,属于面向对象知识。
    # 重新构建三个固定函数用于文件的批量下载和保存的操作。
    def get_media_requests(self, item, info):  # 该函数是负责对文件url进行请求获取文件二进制的数据
        # 可以通过item参数接收爬虫文件提交过来的item对象
        file_title = item["file_title"]
        file_urls = item["file_urls"]

        # 对文件地址发起请求,(参数1,参数2) 参数1:url  参数2:请求传参,可以将数据传给 file_path 下面这个函数
        yield scrapy.Request(file_urls, meta={"file_title": file_title})

    def file_path(self, request, response=None, info=None, *, item=None):  # 负责指定保存文件的名字
        # 接收 get_media_requests 函数中通过meta发送过来的数据。
        file_title = request.meta["file_title"]

        # 然后返回文件名字
        return file_title

    def item_completed(self, results, item, info):  # 用于将item对象传递给下一个管道
        return item

5:结果展示与总结

 

  • 代码流程:

    • spider中爬取要下载的文件链接,将其放置于item中的file_urls字段中存储

    • spider提交item给FilesPipeline管道

    • FilesPipeline处理时,它会检测是否有file_urls字段,如果有的话,则会对其进行文件下载

    • 下载完成之后,会将结果写入item的另一字段files

Item要包含file_urlsfiles两个字段

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

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

相关文章

2015年五一杯数学建模B题空气污染问题研究解题全过程文档及程序

2015年五一杯数学建模 B题 空气污染问题研究 原题再现 近十年来,我国 GDP 持续快速增长,但经济增长模式相对传统落后,对生态平衡和自然环境造成一定的破坏,空气污染的弊病日益突出,特别是日益加重的雾霾天气已经干扰…

从0开始学习JavaScript--JavaScript对象继承深度解析

JavaScript中的对象继承是构建灵活、可维护代码的关键部分。本文将深入讨论JavaScript中不同的继承方式,包括原型链继承、构造函数继承、组合继承等,并通过丰富的示例代码展示它们的应用和差异。通过详细解释,大家可以更全面地了解如何在Java…

Shopee如何入驻?如何防封?

Shopee作为东南亚领航电商平台,面向东南亚蓝海市场,近年来随着东南亚市场蒸蒸日上,虾皮也吸引了大批量的跨境商家入驻。那么接下来就给想要入驻的虾皮小白一个详细的安全入驻教程。 一、商家如何入驻 虾皮与LAZADA最大的区别就是商家即卖家&…

RT-DETR改进 | 2023 | InnerEIoU、InnerSIoU、InnerWIoU、InnerDIoU等二十余种损失函数

论文地址:官方Inner-IoU论文地址点击即可跳转 官方代码地址:官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址: 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其AlphaIoU变种结合起来可以达到二十…

15、矩阵键盘密码锁

矩阵键盘密码锁 main.c #include <REGX52.H> #include "Delay.h" #include "LCD1602.h" #include "MatrixKey.h"//初始化变量 unsigned char KeyNum; unsigned int Password,Count;void main() {//LCD屏幕初始化显示Password:LCD_Init();…

kafka的详细安装部署

简介&#xff1a; Kafka是一个分布式流处理平台&#xff0c;主要用于处理高吞吐量的实时数据流。Kafka最初由LinkedIn公司开发&#xff0c;现在由Apache Software Foundation维护和开发。 Kafka的核心是一个分布式发布-订阅消息系统&#xff0c;它可以处理大量的消息流&#…

matplotlib,DLL load failed: 找不到指定的模块

问题&#xff1a;import matplotlib mportError: DLL load failed: 找不到指定的模块 &#xff08;2023年11月28日&#xff09; 解决方法&#xff1a;具体是matplotlib版本不匹配&#xff0c;而且在线pip install numpy时因为在线下载numpy库中缺少DLL。 应该下载带有mkl的num…

利用ogr2ogr从PostGIS中导出/导入Tab/Dxf/Geojson等格式数据

ogr2ogr Demo Command 先查看下当前gdal支持的全部格式&#xff0c;部分gdal版本可能不支持PostGIS。 如出现PostgreSQL表名支持。 #全部支持的格式 ogrinfo --formats | sort #AVCBin -vector- (rov): Arc/Info Binary Coverage #AVCE00 -vector- (rov): Arc/Info E00 (ASC…

居家适老化设计第三十三条---卫生间之暖风

居家适老化是指为了满足老年人居住需求而进行的住房改造&#xff0c;以提供更加安全、舒适、便利的居住环境。在居家适老化中&#xff0c;暖风系统是一个重要的考虑因素。暖风系统可以提供温暖舒适的室内温度&#xff0c;对老年人来说尤为重要。老年人常常身体机能下降&#xf…

PHPExcel 导出Excel报错:PHPExcel_IOFactory::load()

背景 近期在做 excel文件数据导出时&#xff0c;遇到如下报错&#xff1a; iconv(): Detected an illegal character in input string场景&#xff1a;计划任务后台&#xff0c;分步导出 大数据 excel文件发现在加载文件时&#xff0c;会有报错 报错信息 如下&#xff1a; {&q…

Elasticsearch初识--CentOS7安装ES及Kibana

文章目录 一&#xff0e;前言二&#xff0e;介绍1.Elasticsearch2.Kibana 三&#xff0e;ES安装1.下载安装包2.解压、配置2.1 解压2.2 配置 3.启动3.1增加用户3.2启动 4.解决资源分配太少问题5.启动成功 四&#xff0e;Kibana安装1.下载安装包2.解压、配置2.1 解压2.2 配置2.2 …

使用char.js 柱形方式显示 一年12个月的最高气温与最低气温

<!DOCTYPE html> <html> <head><title>气温图表</title><script src"https://cdn.jsdelivr.net/npm/chart.js"></script><style>#myChart{width:800px;height: 400px;}</style> </head> <body>&l…

SQL注入-数据库基础/SQL语法

目录 一&#xff0c;数据库概述 1.1 数据库 1.2 了解 ACID 理论 1.3 识别数据库 二&#xff0c;SQL 语法基础 三&#xff0c;SQL语句实例 3.1 SQL基础语句 3.2 SQL高级语句 四&#xff0c;基于SQL注入理解语法/函数 4.1 语法 4.2 函数 五&#xff0c;目录数据库info…

百度人工智能培训第一天笔记

参加了百度人工智能初步培训&#xff0c;主要是了解一下现在人工智能的基本情况&#xff0c;以便后续看可以参与一些啥&#xff1f; 下面就有关培训做一些记录&#xff0c;以便后续可以继续学习。 一、理论基础部分 二、实际操作部分 主要学习的百度人工智能平台如下&#xf…

C++学习之路(八)C++ 用Qt5实现一个工具箱(增加一个粘贴板记录管理功能)- 示例代码拆分讲解

昨天&#xff0c;我们用 Qt5 实现了一个小工具箱的雏形《C 实现简单的Qt界面&#xff08;消息弹框、按钮点击事件监听&#xff09;》&#xff0c;但是没什么实用价值。为了增加点作用&#xff0c;我们今天就为这个小工具箱增加第一个小功能 「 粘贴板记录管理功能 」&#xff0…

如何正确选择爬虫采集接口和API?区别在哪里?

在信息时代&#xff0c;数据已经成为了一个国家、一个企业、一个个人最宝贵的资源。而爬虫采集接口则是获取这些数据的重要手段之一。本文将从以下八个方面进行详细讨论&#xff1a; 1.什么是爬虫采集接口&#xff1f; 2.爬虫采集接口的作用和意义是什么&#xff1f; 3.爬虫…

数据可视化:在Jupyter中使用Matplotlib绘制常用图表

Matplotlib是一个强大的数据可视化库&#xff0c;用于创建各种图表。 在Jupyter中使用Matplotlib可以轻松实现折线图、柱状图、散点图和饼图等常用图表。 本篇文章将为你详细讲解用matlpotlib绘制常用图表的方法。 1、折线图 折线图是展示数据趋势和变化的常见图表类型。 …

【Proteus仿真】【51单片机】智能晾衣架设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD1604液晶、按键、蜂鸣器、L298N电机、PCF8591 ADC模块、DHT11温湿度传感器、雨滴传感器、风速、光线传感器等。 主要功能&#xff1a; 系统运行…

负公差智能测径仪 升级体验智能仪器

负公差轧制离不开智能测径仪 受自动化控制程度限制&#xff0c;一些工艺流程的操作还是依靠工人经验来完成&#xff0c;由于个人工作技能水平限制&#xff0c;尺寸控制极不稳定&#xff0c;因此控制台就需要及时准确的了解成品钢的尺寸及重量。现在信息的沟通主要依靠电话。取样…

excel合并单元格教程

在表格里&#xff0c;总是会遇到一级表格、二级表格的区别&#xff0c;这时候一级表格会需要合并成一个大格子&#xff0c;那么excel如何合并单元格呢&#xff0c;其实使用快捷键或者功能键就可以了。 excel如何合并单元格&#xff1a; 1、首先我们用鼠标选中所有要合并的单元…