目录
Scrapy 使用ImagePipeline 保存图片
使用图片管道
具体步骤
安装相关的依赖库
创建Scrapy项目
配置settings.py
定义Item
编写Spider
运行Spider
Scrapy 自定义ImagePipeline
自定义图片管道
Scrapy 使用ImagePipeline 保存图片
Scrapy提供了一个 ImagePipeline,用来下载图片这条管道,图片管道ImagesPipeline
提供了方便并具有额外特性的功能,比如:
- 将所有下载的图片转换成通用的格式(JPG)和模式(RGB)
- 避免重新下载最近已经下载过的图片
- 缩略图生成
- 检测图像的宽/高,确保它们满足最小限制
使用图片管道
scrapy.pipelines.images.ImagesPipeline
使用 ImagesPipeline ,典型的工作流程如下所示:
- 在一个爬虫中,把图片的URL放入
image_urls
组内(image_urls是个列表) - URL从爬虫内返回,进入图片管道
- 当图片对象进入 ImagesPipeline,image_urls 组内的URLs将被Scrapy的调度器和下载器安排下载
- settings.py文件中配置保存图片路径参数
IMAGES_STORE
- 开启管道
需要安装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
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"替换为实际的目录路径,以便保存图片。
ITEM_PIPELINES = {
'scrapy.pipelines.images.ImagesPipeline': 1
}
IMAGES_STORE = 'path/to/save/images'
定义Item
在Scrapy项目中,使用Item来定义要提取的数据。在项目的目录下找到items.py
文件,编辑该文件,以定义一个Item用于保存图片链接。
定义一个名为MyItem
的Item,它包含两个字段:image_urls
和images
。image_urls
字段用于存储图片的URL,images
字段用于存储已下载的图片的信息。
import scrapy
class MyItem(scrapy.Item):
image_urls = scrapy.Field()
images = scrapy.Field()
编写Spider
在Scrapy项目中,Spider用于定义如何爬取和提取数据。在项目的目录下找到spiders
文件夹,并在该文件夹中创建一个Python文件,命名为myspider.py
(可以根据实际需求命名)。
在myspider.py
文件中,编写Spider代码以提取图片链接并将其保存到MyItem
中。
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:
scrapy crawl myspider
这将启动Scrapy并开始爬取数据。当爬取完成时,图片将自动下载并保存到指定的目录中。
Scrapy 自定义ImagePipeline
问题
使用官方默认图片管道,有如下几个问题:
- 文件名不友好
- 存储图片URL的参数名称与类型太固定
解决方案
自定义ImagePipeline,扩展
自定义图片管道
-
继承
scrapy.pipelines.images import ImagesPipeline
-
实现
get_media_requests(self, item, info)
方法文章来源:https://www.toymoban.com/news/detail-506759.html- 发送请求,下载图片
- 转发文件名
-
实现
file_path(self,request,response=None,info=None,*,item=None)
文章来源地址https://www.toymoban.com/news/detail-506759.html- 修改文件名与保存路径
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'
到了这里,关于python爬虫之Scrapy框架--保存图片(详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!