Python爬虫之Scrapy框架系列(19)——实战下载某度猫咪图片【媒体管道类】

news2024/12/25 12:36:06

目录:

  • 1.引入:
    • 1.1 不使用管道,直接存储本地:
      • ①创建scrapy项目及爬虫文件
      • ②编写爬虫文件:
      • ③效果:
    • 1.2 使用管道,进行本地存储:
      • ①编写爬虫文件:
      • ②在items.py文件中创建相应的字段:
      • ③编写管道文件pipelines.py:
      • ④效果:
  • 分析:两种储方法下所编写的爬虫文件:
  • 2.这就引入了媒体管道类。使用如下:
    • 2.1 爬虫文件改为:
    • 2.2 编写items.py文件:
    • 2.3 使用媒体管道类的话,pipelines.py文件就不用管,直接在settings.py操作即可:
    • 2.4 效果:

1.引入:

先来看个小案例:使用scrapy爬取某度图片。

  • 目标百度图片URL:https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&fm=index&pos=history&word=%E7%8C%AB%E5%92%AA

1.1 不使用管道,直接存储本地:

①创建scrapy项目及爬虫文件

'''
创建项目及爬虫文件:
1.scrapy startproject baiduimgs
2.cd baiduimgs
3.scrapy genspider bdimg www
'''

②编写爬虫文件:

# -*- coding: utf-8 -*-
import scrapy

import re
import os
class BdimgSpider(scrapy.Spider):
    name = 'bdimgs'
    allowed_domains = ['image.baidu.com']
    start_urls = ['https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&fm=index&pos=history&word=%E7%8C%AB%E5%92%AA']
    num=0

    def parse(self, response):
        text=response.text
        img_urls=re.findall('"thumbURL":"(.*?)"',text)
        for img_url in img_urls:
            yield scrapy.Request(img_url,dont_filter=True,callback=self.get_img)

    def get_img(self,response):
        img_data=response.body
        if not os.path.exists("dir"):
            os.mkdir("dir")
        filename="dir/%s.jpg"%self.num
        self.num+=1
        with open(filename,"wb") as f:
            f.write(img_data)

注意:

  • 在settings.py文件中关闭robots协议;
  • 加UA!!!

③效果:

在这里插入图片描述

1.2 使用管道,进行本地存储:

①编写爬虫文件:

# -*- coding: utf-8 -*-
import scrapy

import re
import os
from ..items import BaiduimgsItem	#引入创建字段的类
class BdimgSpider(scrapy.Spider):
    name = 'bdimgs'
    allowed_domains = ['image.baidu.com']
    start_urls = ['https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&fm=index&pos=history&word=%E7%8C%AB%E5%92%AA']
    num=0

    def parse(self, response):
        text=response.text
        img_urls=re.findall('"thumbURL":"(.*?)"',text)
        for img_url in img_urls:
            yield scrapy.Request(img_url,dont_filter=True,callback=self.get_img)

    def get_img(self,response):
        img_data=response.body

        item=BaiduimgsItem()
        item["img_data"]=img_data
        yield item

②在items.py文件中创建相应的字段:

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class BaiduimgsItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    img_data=scrapy.Field()

③编写管道文件pipelines.py:

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html

import os
class BaiduimgsPipeline(object):
    num=0
    def process_item(self, item, spider):
        if not os.path.exists("dir_pipe"):
            os.mkdir("dir_pipe")
        filename="dir_pipe/%s.jpg"%self.num
        self.num+=1
        img_data=item["img_data"]
        with open(filename,"wb") as f:
            f.write(img_data)
        return item

注意:要在settings.py文件中开启管道!!!

④效果:

在这里插入图片描述

分析:两种储方法下所编写的爬虫文件:

  • 其中:都有个get_img()回调函数,前面文章可知回调函数必须有,但是仔细观察这两个爬虫文件,会发现这个回调函数作用不大,我们的目标就直接是图片数据,而不需要再进行额外的一系列的提取,所以:这个回调函数明显累赘了,那么:有么有方法可以简化嘞!!!

2.这就引入了媒体管道类。使用如下:

2.1 爬虫文件改为:

# -*- coding: utf-8 -*-
import scrapy

import re
import os
from ..items import BaiduimgsPipeItem
class BdimgSpider(scrapy.Spider):
    name = 'bdimgs'
    allowed_domains = ['image.baidu.com']
    start_urls = ['https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&fm=index&pos=history&word=%E7%8C%AB%E5%92%AA']

    def parse(self, response):
        text=response.text
        image_urls=re.findall('"thumbURL":"(.*?)"',text)
        # 注意:此处给字段的值是图片的URL!!!
        item=BaiduimgsPipeItem()
        item["image_urls"]=image_urls
        yield item

2.2 编写items.py文件:

  • (注意:使用媒体管道类的话,这个字段名必须是image_urls,因为源码中默认的字段名就是这个!!!)
# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy

class BaiduimgsPipeItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    image_urls=scrapy.Field()

2.3 使用媒体管道类的话,pipelines.py文件就不用管,直接在settings.py操作即可:

  • (重点:表面上没有使用管道,因为咱pipelines.py文件没有进行任何操作,但是实际上由于咱使用了特定的字段名,在暗地里使用了媒体管道类!!!)
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   # 'baiduimgs.pipelines.BaiduimgsPipeline': 300,
   'scrapy.pipelines.images.ImagesPipeline': 300,          # 注意:一定要开启此pipeline管道!
}
# 注意:一定要指定媒体管道存储的路径!
IMAGES_STORE = r'E:\Py_Spider_High\spiderpro\scrapy_1\baiduimgs\dir0'

2.4 效果:

在这里插入图片描述

  • 需要注意的是:
    本文使用的是scrapy2.7版本,直接上述操作是不行的,我们会发现有个WARNING,需要我们下载pillow包。
    在这里插入图片描述

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

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

相关文章

前缀和算法【一维、二维】

算法推导 首先这种算法适合于求从 x 到 y 的和。 一维情况 一维代码十分简单&#xff0c;我们只需要每个都记录前面所有的和即可&#xff0c;注意细节 下标从1开始 for(int i 1 ; i < n ; i ){cin >> temp;a[i] a[i - 1] temp; }这里我们就看两种情况&#xff…

接口优化的常见方案实战总结

一、背景 针对老项目&#xff0c;去年做了许多降本增效的事情&#xff0c;其中发现最多的就是接口耗时过长的问题&#xff0c;就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案。 &#xfeff; &#xfeff; &#xfeff;&#xfeff; 二、接口优化…

Maven下载与配置

Maven官网链接&#xff1a; https://maven.apache.org/ 进入后首页展示最新的下载地址 如果要下载历史版本&#xff0c;可以搜索 legacy archives 来快速找到这个地方&#xff0c;点击进入 下载完毕后&#xff0c;解压放到D盘&#xff08;或根据个人喜好存放&#xff09; 首先…

4月22日丨【云数据库技术沙龙】技术进化,让数据更智能

4月22日&#xff0c;云数据库技术沙龙“MySQL x ClickHouse”专场 “MySQL x ClickHouse” 技术沙龙&#xff0c;本次沙龙以“技术进化&#xff0c;让数据更智能”为主题&#xff0c;汇聚字节跳动、阿里云、玖章算术、华为云、腾讯云、百度等众多数据库厂商的技术大咖&#xf…

2023/4/10-2023/4/18周报

1 高德地图 运行抱错 INVALID_USER_SCODE 这里是错误信息对应原因 错误信息列表-参考手册-地图 JS API | 高德地图API 这里是高德地图api设置说明 准备-入门-教程-地图 JS API | 高德地图API 如果你自己能排查出错误 那不用看我的&#xff0c;如果都写的对还是抱错…

list容器

1、list容器简介 链表是以中物理存储单元上的非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序都是通过链表中的指针连接次序实现的。链表由一系列的结点&#xff08;链表中每一个元素被称为结点&#xff09;组成&#xff0c;结点可以在运行时动态生成。每一个结点包括…

系统集成项目管理工程师 笔记(第三章:信息系统集成专业技术知识)

文章目录 3.1 信息系统建设 1333.1.1 信息系统的生命周期 1333.1.2 信息系统开发方法 133 3.3 软件工程 1353.3.1 软件需求分析与定义 1353.3.2 软件设计、测试与维护 1353.3.3 软件质量保证及质量评价 1363.3.4 软件配置管理 136&#xff08;六大活动&#xff09;3.3.5 软件过…

瑞芯微RK3568四核核心板芯片简介

引言 RK3568是瑞芯微出品的一款定位中高端的通用型SoC&#xff0c;采用22nm先进制程工艺&#xff0c;集成4核 arm 架构 A55 处理器和 Mali G52 2EE 图形处理器&#xff0c;支持4K解码和1080P编码。RK3568支持 SATA/PCIE/USB3.0 等各类型外围接口&#xff0c;内置独立的NPU&…

亚马逊云科技数字化技术撬动千亿市场,民航客机改装是好生意

很多人对庞大的民航客机的印象还停留在其天文数字般的价格&#xff0c;随着运营时间的推移&#xff0c;将客机转货机的航空维修产业应时而生。民航业客机改货机的市场不断增长&#xff0c;面对飞机客改货过程中的海量图纸与复杂工艺流程&#xff0c;汉端科技在西云数据运营的亚…

darknet_ros+yolo+realsenseD455+Ubuntu18.04+ROS

很想实现ros和yolo的联合使用&#xff0c;所以找到了darknet_ros这个包&#xff0c;我感觉难点不在于工程&#xff0c;而在于yolo的环境配置。本文将从环境入手逐步实现功能。 1.设备 相机&#xff1a;realsenseD455 笔记本&#xff1a;T440P 显卡&#xff1a;GT-730M 算力&am…

03-漏洞发现API接口服务等

漏洞发现-API接口服务之漏洞探针类型利用修复 一、思维导图 二、测试思路 1、信息收集之信息利用 第一步&#xff1a;首先识别网站是否有cdn&#xff0c;waf等产品&#xff0c;有则需要绕过。 第二步&#xff1a;扫描收集到的网站的端口信息&#xff0c;真实ip地址。ip绑定…

再学一下Feign的原理

简介 Feign是Spring Cloud Netflix组件中的一个轻量级Restful的HTTP服务客户端&#xff0c;它简化了服务间调用的方式。 Feign是一个声明式的web service客户端.它的出现使开发web service客户端变得更简单.使用Feign只需要创建一个接口加上对应的注解, 比如FeignClient注解。…

Vue实现自动化平台(二)--实现登录页面首页

上一章&#xff0c;vue项目的创建&#xff1a; Vue脚手架Vue CLI 使用_做测试的喵酱的博客-CSDN博客 github地址&#xff1a;https://github.com/18713341733/vuemiaotest 这个目前只是用来练手的&#xff0c;项目还没成型。等以后我写完了&#xff0c;再更新一下项目链接。…

python基于机器学习的姓名预测性别网页app开发

前言 做这个项目的起因是之前csdn给我推荐了一个问答&#xff1a;基于机器学习的姓名预测性别的手机app开发。我点进去发现已经有人回答了&#xff0c;链接点进去一看&#xff0c;好家伙&#xff0c;这不是查表算概率吗&#xff0c;和机器学习有半毛钱关系。而且我觉得用姓名预…

《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12单master集群》

一、架构图 如下图所示&#xff1a; 二、环境信息 主机名K8S版本系统版本内核版本IP地址备注k8s-master-621.24.12Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.62master节点k8s-worker-631.24.12Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63worker节点k8s-worker-641…

Fast DDS 介绍

前面已经简要介绍过DDS协议规范了&#xff0c;接下来我们来看一个它的C实现----Fast DDS。 eProsima Fast-DDS是eprosima对于DDS的C实现&#xff0c;这是一个免费开源软件&#xff0c;遵循Apache License 2.0。eProsima Fast DDS在性能&#xff0c;功能和对最新版本RTPS标准&a…

Day17-对象

文章目录一 函数作业讲解二 函数版图书管理系统三 对象一 引入思考二 对象的创建和使用案例1案例2案例3案例4案例5-描述手机案例6-描述一组手机案例7-把对象作为函数的参数一 函数作业讲解 <script>//1编写函数&#xff0c;计算圆的面积和周长&#xff0c;在函数外由用户…

俄罗斯电商平台ozon的崛起,卖家可以使用测评补单方式打造爆款吗?

OZON俗称俄罗斯亚马逊&#xff0c;1998年成立&#xff0c;是俄罗斯唯一的多品类综合B2C电商平台&#xff0c;也是目前欧洲第四大电商市场。 作为俄罗斯互联网公司五强的OZON平台&#xff0c;拥有庞大的消费者群体&#xff0c;从2018年仅为480万人&#xff0c;到2021年就增长到…

【C++进阶】Makefile基础(一)

文章目录1. 环境2. 规则3. 原理4. 伪目标Makefile 其实只是一个指示 make 程序&#xff08;后面简称 make 或有时称之为 make 命令&#xff09;如何为我们工作的命令文件&#xff0c;我们说 Makefile 其实是在说 make&#xff0c;这一点要有很清晰的认识。而对于我们的项目来说…

21-CSS

目录 1.CSS是什么&#xff1f; 2.CSS基本语法 3.CSS类型 3.1.行内样式&#xff08;适用范围最小&#xff09; 3.2.内部样式&#xff08;适用范围适中&#xff09; 3.3.外部样式&#xff08;适用范围最大&#xff09; PS&#xff1a;关于缓存 3.4.多种样式优先级 4.代码…