一. ImagesPipeline的工作流程
1. 首先在爬虫项目中获取图片的image_urls;
2. item[‘image_urls’]进入管道中,当项目进入 ImagesPipeline,image_urls 组内的URLs将被Scrapy的调度器和下载器(这意味着调度器和下载器的中间件可以复用)安排下载;
3. 下载完回返回一个results,这是一个二组,包括success(布尔值,提示图片是否下载成功)和image_info_or_error(图片下载的url,图片存储的路径,图片内容的 MD5 hash)。
二. ImagesPipeline的使用步骤
1. 在pipeline.py文件中,创建自定义存储管道,继承自ImagesPipeline;
2. 定义get_media_requests方法, 遍历image_url,构造Request-yield返回;
3. 定义item_completed方法,从results中获取保存后的路径,并返回item;
4. 在setting文件中配置 - 存储图片的文件夹位置:IMAGES_STORE = 'images'
斗鱼案例代码如下:
import scrapy
from pymongo import *
from scrapy.pipelines.images import ImagesPipeline
from . import settings
class DouyuMongoPipeline(ImagesPipeline):
"""
mongo-存储管道
"""
def open_spider(self, spider):
"""开启爬虫程序时回调"""
super(DouyuMongoPipeline, self).open_spider(spider)
mongo = MongoClient(host='127.0.0.1', port=27017)
self.douyu = mongo.mytest.douyu
return item
def get_media_requests(self, item, info):
"""实现下载图片"""
return [
scrapy.Request(url=item['image_url'])
]
def item_completed(self, results, item, info):
"""用户保存数据-当图片完成下载时回调"""
# results --> [(True, {'checksum': 'c03f8c1e4972da393601d51097d5ff12', 'url': 'https://rpic.douyucdn.cn/live-cover/appCovers/2018/08/06/4403598_20180806160752_small.jpg', 'path': 'full/01ae1f9a84076d131be989eb69a7b3a1eaeb2468.jpg'})]
path = [data['path'] for result, data in results if result][0]
item['path'] = settings.IMAGES_STORE + '/' +path
# print('DouyuMongoPipeline:', item)
self.douyu.insert(dict(item))
return item
------------------------------- END ---------------------------------------