使用官方提供的 Pipline
Scrapy框架为下载的item中包含的图片提供了一个可以重用的图片下载 pipeline
。这些 pipeline
有共同的方法和结构。一般会使用到有Files Pipeline
、Images Pipline
。
使用官方 Pipline 的好处
- 避免重新下载最近已经下载的数据
- 方便指定下载的路径
- 方便的转换图片的格式
- 方便生成略缩图
- 方便检测图片的宽高,确保满足最小值
- 异步下载,效率非常高
Images Pipline 的使用准备
使用 Images Pipline,需要提前下载好 Pillow 图片处理库
当使用Images Pipline
下载图片的时候,按照以下步骤完成
1. 定义 Item 属性
必须要定义两个个默认的 item
属性:
image_urls
:存储下载图片的链,需要传递一个列表。images
:文件下载完成后,会把图片的相关信息存储到这个属性里,比如 下载的路径、下载的URL、文件的校验码 …class MaybachItem(scrapy.Item): image_urls = scrapy.Field() images = scrapy.Field()
2. 启用 Images Pipline 管道
在 settings.py 里开启
# Configure item pipelines # See https://docs.scrapy.org/en/latest/topics/item-pipeline.html ITEM_PIPELINES = { # 'Maybach.pipelines.MaybachPipeline': 300, # 开启图片下载器 'scrapy.pipelines.images.ImagesPipeline':1, }
3. 配置 Images Pipline 下载路径
在 settings.py 里添加上
# Images Pipline 下载路径,可以使用 OS 模块来指定路径 # 没有这个路径,会自动创建 IMAGES_STORE = '路径'
0x00 创建爬虫工程
scrapy startproject ImagesApp (创建Scrapy工程)
cd ImagesApp (进入工程目录)
scrapy genspider WallPaperSpider pic.netbian.com (创建爬虫)
0x01 配置爬虫
关闭机器人协议
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
设置请求头
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
开启 Images Pipline 管道
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
# 'ImagesApp.pipelines.ImagesappPipeline': 300, (注释掉)
'scrapy.pipelines.images.ImagesPipeline':1,
}
配置图片的下载路径
import os
IMAGES_STORE = os.path.join(os.path.dirname(os.path.dirname(__file__)),'img')
设置 Item 属性
在 items.py 里
class ImagesappItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
image_urls = scrapy.Field()
images = scrapy.Field()
0x02 编写爬虫程序
通过对网页的分析,我们需要的链接在这些 li 标签下
获取图片链接
但这些 url ,没有协议头
def parse(self, response): url = response.xpath('//ul[@class="clearfix"]/li/a/img/@src').getall() print(url)
添加协议头
response.urljoin( url ) 方法会自动把 相应的协议头加上
urls_pic = list(map(lambda url: response.urljoin(url),urls))
把图片链接通过 Item 传给 ImagesPipeline 下载
导入 ImagesappItem ,传入 url 列表,启动爬虫
from ImagesApp.items import ImagesappItem def parse(self, response): urls = response.xpath('//ul[@class="clearfix"]/li/a/img/@src').getall() urls_pic = list(map(lambda url: response.urljoin(url),urls)) yield ImagesappItem(image_urls= urls_pic) # 启动爬虫 scrapy crawl WallPaperSpider
0x03 小结
这个小案例是直接使用的官方的 ImagePipeline
下载,所以没有对图片进行重命名
,或者分类
等操作,需要实现这些操作,就需要继承 ImagesPipeline
类,然后重新里面的相关方法,可以查看改进版。
版权声明:《 Scrapy框架下载图片案例 》为明妃原创文章,转载请注明出处!
最后编辑:2019-12-7 07:12:06