Scrapy爬虫 -- ImagePipeline 实现图片自动下载

Scrapy爬虫 -- ImagePipeline 实现图片自动下载

一. 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 ---------------------------------------

你可能感兴趣的:(Python,Scrapy)