python爬虫之Scrapy框架--保存图片(详解)

news/2024/7/19 10:29:52 标签: python, 爬虫, scrapy

目录

Scrapy 使用ImagePipeline 保存图片

使用图片管道 

具体步骤

安装相关的依赖库

创建Scrapy项目

配置settings.py 

 定义Item

 编写Spider

运行Spider

scrapy-自定义imagepipeline-toc" style="margin-left:0px;">Scrapy 自定义ImagePipeline

自定义图片管道


Scrapy 使用ImagePipeline 保存图片

scrapy-使用imagepipeline-保存图片-toc" style="margin-left:0px;">

Scrapy提供了一个 ImagePipeline,用来下载图片这条管道,图片管道ImagesPipeline 提供了方便并具有额外特性的功能,比如:

  • 将所有下载的图片转换成通用的格式(JPG)和模式(RGB)
  • 避免重新下载最近已经下载过的图片
  • 缩略图生成
  • 检测图像的宽/高,确保它们满足最小限制

使用图片管道 

scrapy.pipelines.images.ImagesPipeline

使用 ImagesPipeline ,典型的工作流程如下所示:

  1. 在一个爬虫中,把图片的URL放入 image_urls 组内(image_urls是个列表)
  2. URL从爬虫内返回,进入图片管道
  3. 当图片对象进入 ImagesPipeline,image_urls 组内的URLs将被Scrapy的调度器和下载器安排下载
  4. settings.py文件中配置保存图片路径参数IMAGES_STORE
  5. 开启管道

需要安装pillow4.0.0以上版本

pip install pillow==9.2.0

问题

报错:twisted.python.failure.Failure OpenSSL.SSL.Error

解决方案

pip uninstall cryptography pip install cryptography==36.0.2


具体步骤

安装相关的依赖库

Pillow 

python">pip install scrapy Pillow

创建Scrapy项目

首先,创建一个Scrapy项目,可以使用以下命令在命令行中创建一个新项目:

scrapy startproject myproject

配置settings.py 

打开生成的Scrapy项目文件夹,找到其中的settings.py文件,编辑该文件,以配置ImagePipeline。

将以下代码添加到settings.py文件中:

ITEM_PIPELINES定义项目中使用的管道,其中scrapy.pipelines.images.ImagesPipeline是用于处理图片的管道。1是优先级,数字越小优先级越高。

IMAGES_STORE是指定要保存图片的目录路径。将"path/to/save/images"替换为实际的目录路径,以便保存图片。

python">ITEM_PIPELINES = {
    'scrapy.pipelines.images.ImagesPipeline': 1
}

IMAGES_STORE = 'path/to/save/images'

 定义Item

 在Scrapy项目中,使用Item来定义要提取的数据。在项目的目录下找到items.py文件,编辑该文件,以定义一个Item用于保存图片链接。

定义一个名为MyItem的Item,它包含两个字段:image_urlsimagesimage_urls字段用于存储图片的URL,images字段用于存储已下载的图片的信息。

python">import scrapy

class MyItem(scrapy.Item):
    image_urls = scrapy.Field()
    images = scrapy.Field()

 编写Spider

在Scrapy项目中,Spider用于定义如何爬取和提取数据。在项目的目录下找到spiders文件夹,并在该文件夹中创建一个Python文件,命名为myspider.py可以根据实际需求命名)。

myspider.py文件中,编写Spider代码以提取图片链接并将其保存到MyItem中。

python">import scrapy
from myproject.items import MyItem

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://example.com']

    def parse(self, response):
        item = MyItem()
        item['image_urls'] = response.css('img::attr(src)').getall()
        yield item

定义了一个名为MySpider的Spider,设置了起始URL为​​​​​​“http://example.com”。在`parse`方法中,我们创建了一个`MyItem`对象,使用CSS选择器提取页面中的所有图片链接,并将其赋值给`item['image_urls']`字段。最后,使用`yield`语句将`item`返回。 

运行Spider

在命令行中,切换到项目根目录,并执行以下命令运行Spider:

python">scrapy crawl myspider

这将启动Scrapy并开始爬取数据。当爬取完成时,图片将自动下载并保存到指定的目录中。

scrapy-自定义imagepipeline">Scrapy 自定义ImagePipeline

问题

使用官方默认图片管道,有如下几个问题:

  • 文件名不友好
  • 存储图片URL的参数名称与类型太固定

解决方案

自定义ImagePipeline,扩展

自定义图片管道

  • 继承scrapy.pipelines.images import ImagesPipeline

  • 实现get_media_requests(self, item, info)方法

    • 发送请求,下载图片
    • 转发文件名
  • 实现file_path(self,request,response=None,info=None,*,item=None)

    • 修改文件名与保存路径
python">import re


class Scrapy05Pipeline:
  def process_item(self, item, spider):
    return item


from scrapy.pipelines.images import ImagesPipeline
from scrapy.http.request import Request


class MyImagePipeline(ImagesPipeline):
  def get_media_requests(self, item, info):
    return Request(item['image_url'])
  
  def file_path(self, request, response=None, info=None, *, item=None):
    # 处理文件名中的特殊字符
    # name = item.get('name').strip().replace('\r\n\t\t','').replace('(','').replace(')','').replace('/','_')
    name = re.sub('/','_',re.sub('[\s()]','',item.get('name')))
    return f'{name}.jpg'


http://www.niftyadmin.cn/n/472631.html

相关文章

物理量@基本单位@量纲

基本单位 Base unit (measurement) A base unit (also referred to as a fundamental unit) is a unit adopted for measurement of a base quantity. A base quantity is one of a conventionally chosen subset of physical quantities, where no quantity in the subset c…

深入浅出设计模式 - 工厂模式

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌ Java知识图谱点击链接:体系化学习Java(Java面试专题) ​ 💕💕 感兴趣的同学可…

JS逆向系列之猿人学爬虫第16题-window蜜罐

文章目录 目标网站参数定位与加密逻辑分析补全后的jspython调用测试往期逆向文章推荐目标网站 https://match.yuanrenxue.cn/match/16参数定位与加密逻辑分析 t就是时间戳,m是我们主要逆向的参数,跟栈进入window

ecology9-导出流程上图片附件的方案

ecology9 导出流程上图片附件 方案一方案二√方案三 ecology9 把图片名称位置等信息存储在imagefile中,实际文件以zip压缩包的形式存储在服务器上。需求是提供导出历史流程上的图片附件,方便新系统导入 方案一 编写图片附件下载接口,查询到图…

如何扩展及优化CI/CD流水线?

如今应用程序的开发通常由多个开发人员组成的团队完成。每个人或团队在项目中发挥自己的作用,然后我们发现在项目的末尾总是有几段代码需要编译,根据每个人的工作方法,管理这种集成可能会浪费很多时间。持续集成和持续交付/部署(C…

Windows端ZLMediaKit编译与webrtc推拉流测试

编译环境 OS版本:Windows 10 openssl版本:Win32OpenSSL-1_1_1q cmake版本:3.20.0 vs版本:vs2017 编译准备工作 安装openssl Windows下的openssl安装方法不赘述,只要找到需要的版本的安装程序,下载下来直…

echarts中柱状图添加点击事件并且选中点击的高亮

最近项目中遇到了好多使用echarts图表展示的,其中一个需求就是需要点击选中柱状图并且高亮来区分,以便观察数据展示。话不多说,直接上代码吧。 首先高亮展示,echarts官网中分为老版本和新版本,大家注意看使用的echart…

spring @Conditional 注解实例操作 解决开发环境取Cookie登录用户取不到

spring Conditional 注解实例操作 解决开发环境取Cookie登录用户取不到 Data Accessors(chain true) public class SwitchUserAndEnterpriseVo {private String companyId;private String uid;private String userName;private String phone;private String token; }//公共父…