Scrapy ImagePipeline保存图片和自定义

Scrapy_ImagePipeline保存图片

image-20220628184231883

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

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

1 使用图片管道

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

Scrapy_自定义ImagePipeline

image-20220628184753312

问题

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

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

解决方案

自定义ImagePipeline,扩展

1 自定义图片管道

  • 继承scrapy.pipelines.images import ImagesPipeline

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

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

    • 修改文件名与保存路径

2 代码

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'

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Scrapy是一个强大的Python网络爬虫框架,用于高效地抓取网页数据。如果你想要使用Scrapy保存图片,你可以遵循这些基本步骤: 1. **设置下载器中间件**:在Scrapy中,`DownloaderMiddleware`是处理下载和请求的地方。你需要设置一个下载管道(`DownloadPipeline`),用于下载图片。在`settings.py`文件中,添加一个新的下载管道,例如 `IMAGESPipeline`。 ```python DOWNLOADER_MIDDLEWARES = { 'myproject.pipelines.ImagesPipeline': 300, } ``` 2. **定义下载管道**:创建一个名为`ImagesPipeline`的类,继承自`BaseDownloadPipeline`。这个类将负责下载图片并存储它们。 ```python class ImagesPipeline(BaseDownloadPipeline): def get_media_requests(self, response): # 这里可以根据响应中的URL找到图片链接 for img_url in response.css('img::attr(src)').getall(): yield DownloadRequest(img_url) def item_completed(self, results, item, info): image_paths = [x['path'] for ok, x in results if ok] if not image_paths: return item # 将图片路径附加到item上 item['image_paths'] = image_paths return item ``` 3. **处理响应和存储图片**:在`download_response`方法中,使用`response.url`作为文件名下载图片,并使用`save_path`方法保存到本地。 ```python def download_response(self, request, response, spider): # 使用下载的URL作为文件名 filename = os.path.basename(response.url) # 保存图片到指定目录 path = os.path.join(self.save_path, filename) with open(path, 'wb') as f: f.write(response.body) ``` 4. **配置保存图片的路径**:在`settings.py`中,设置`IMAGES_STORE`变量为图片保存的目录。 ```python IMAGES_STORE = 'path/to/images/folder' ``` 5. **运行爬虫**:最后,在Scrapy项目中运行爬虫时,图片下载和存储就会按照上述配置进行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

留不住的人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值