【Python_Scrapy学习笔记(十三)】基于Scrapy框架的图片管道实现图片抓取

news/2024/11/24 2:46:06/

基于Scrapy框架的图片管道实现图片抓取

前言

本文中介绍 如何基于 Scrapy 框架的图片管道实现图片抓取,并以抓取 360 图片为例进行展示。

正文

1、Scrapy框架抓取图片原理

利用 Scrapy 框架提供的图片管道类 ImagesPipeline 抓取页面图片,在使用时需要导入,并且重新 get_media_requests() 方法,如果对保存的文件名有要求,则需要重写 file_path() 方法,在 settings.py 文件中的 IMAGES_STORE 属性可以设置文件保存路径。

from scrapy.pipelines.images import ImagesPipeline

2、Scrapy框架抓取图片实现步骤

  1. 爬虫文件:将图片链接提取出来直接 yield 交给管道文件处理;

  2. 管道文件:导入并继承 scrapy 的 ImagesPipeline 类,重写get_media_requests() 方法 和 file_path() 方法;

    from scrapy.pipelines.images import ImagesPipelineclass XxxPipeline(ImagesPipeline)def get_media_requests(self,xxx):passdef file_path(self,xxx):#处理文件名return filename
    
  3. settings.py:在全局配置文件中,通过 IMAGES_STORE =“路径” 指定文件保存的位置。

3、Scrapy框架抓取图片案例

  1. 案例需求:抓取 360 图片的 beauty 图片并保存到本地 ./image/xxx.jpg

  2. url地址:https://image.so.com/?src=tab_web

  3. 爬取页面posturl地址:https://image.so.com/zjl?sn={}&ch=beauty
    在这里插入图片描述

  4. F12抓包分析:
    在这里插入图片描述
    在这里插入图片描述

  5. 检查网络源代码,获取所需数据的json文件:
    在这里插入图片描述

  6. 创建Scrapy项目:编写items.py文件

    import scrapyclass SoItem(scrapy.Item):# 图片链接image_url = scrapy.Field()# 图片标题image_title = scrapy.Field()
    
  7. 编写爬虫文件:

    import scrapy
    import json
    from ..items import SoItemclass SoSpider(scrapy.Spider):name = "so"allowed_domains = ["image.so.com"]# start_urls = ["http://image.so.com/"]url = 'https://image.so.com/zjl?sn={}&ch=beauty'def start_requests(self):"""生成所有要抓取的url地址,一次性交给调度器入队列:return:"""for sn in range(30, 151, 30):page_url = self.url.format(sn)yield scrapy.Request(url=page_url, callback=self.parse)def parse(self, response):"""提取图片的链接:param response::return:"""html = json.loads(response.text)for one_image_list in html["list"]:item = SoItem()item["image_url"] = one_image_list["qhimg_url"]item["image_title"] = one_image_list["title"]# 图片链接提取完成后,直接交给管道文件处理即可yield item
  8. 在管道文件中导入导入并继承 scrapy 的 ImagesPipeline 类,重写get_media_requests() 方法 和 file_path() 方法:

    import scrapy
    from scrapy.pipelines.images import ImagesPipelineclass SoPipeline(ImagesPipeline):# 重写 get_media_requests()方法,将图片的链接交给调度器入队列即可def get_media_requests(self, item, info):yield scrapy.Request(url=item["image_url"], meta={"title": item['image_title']})# 重写file_path()方法 处理文件路径及文件名def file_path(self, request, response=None, info=None, *, item=None):image_title = request.meta['title']filename = image_title + '.jpg'  # 拼接图片名称return filename
  9. 在全局配置文件中,通过 IMAGES_STORE =“路径” 指定文件保存的位置

    # 指定图片保存路径
    # 会存放到images下的full文件夹
    IMAGES_STORE = './images/'
    
  10. 创建run.py文件运行爬虫:

    from scrapy import cmdlinecmdline.execute("scrapy crawl so".split())

http://www.ppmy.cn/news/47274.html

相关文章

今天面了个字阿里拿38K出来的,真是纹身师闭眼,秀了我一脸啊

公司前段缺人,也面了不少测试,前面一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在15-20k,面试的人很多,但平均水平很让人失望。看简历很多都是4年工作经验,但面试中,不提测…

【已解决】Field ‘id‘ doesn‘t have a default value 错误的解决办法

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

Qt 项目A调用项目B方法(项目架构管理)

前言 项目开发中,如果项目比较大,大多采用多项目的方式,主要是为了方便代码管理,也更开发变得更加方便。操作如下: 注:我用的版本是Qt 5.12.3 一、建立项目目录 要求: 1、项目A为主&#xff…

Java之~ Aop自定义注解日志

大纲步骤: 一,创建需要记录的日志表,创建基础方法。(省略) 二,在需要加记录日志的方法上加Aop注解1,创建一个注解类,Aop中定义一个注解import java.lang.annotation.*; /*** http 请…

Spring IoC注解开发

Component 组件 Controller 控制器 Service 业务 Repository 仓库 这四个标签是为了创建对象 其实他们四个本质都一样,只不过另外三个是Component的别名,在不同层使用容易区分 首先需要加入aop依赖,如果你事先加入spring-context依赖…

JS数组去重的12种方法

一、利用ES6 Set去重(ES6中最常用) Set对象是ES6中新定义的数据结构,类似数组,它允许存储任何类型的唯一值,不管是原始值还是对象引用。 Array.from()方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组 …

【计算机视觉·OpenCV】使用Haar+Cascade实现人脸检测

前言 人脸检测的目标是找出图像中所有的人脸对应的位置,算法的输出是人脸的外接矩形在图像中的坐标。使用 haar 特征和 cascade 检测器进行人脸检测是一种传统的方式,下面将给出利用 OpenCV 中的 haarcascade 进行人脸检测的代码。 程序流程 代码 impo…

JeecgBoot 3.5.1 版本发布,开源的企业级低代码平台

项目介绍 JeecgBoot是一款企业级的低代码平台!前后端分离架构 SpringBoot2.x,SpringCloud,Ant Design&Vue3,Mybatis-plus,Shiro,JWT 支持微服务。强大的代码生成器让前后端代码一键生成! JeecgBoot引领…