教你如何利用scrapy 管道 (pipeline.py),模块

2018-03-17  本文已影响0人  xu一直在路上

首先说说我的思路:
1,存图片时我想存在本地
2,存图片时我想保存图片原有的名字,(以后好方便查询)

首先 看看官方 API
import scrapy
from scrapy.pipelines.images import ImagesPipeline
from scrapy.exceptions import DropItem

class MyImagesPipeline(ImagesPipeline):

    def get_media_requests(self, item, info):
        for image_url in item['image_urls']:
            yield scrapy.Request(image_url)

    def item_completed(self, results, item, info):
        image_paths = [x['path'] for ok, x in results if ok]
        if not image_paths:
            raise DropItem("Item contains no images")
        item['image_paths'] = image_paths
        return item

下面是我的改进,我则是想保存图片原有名字

import scrapy
class ImagedownloadPipeline(object):
    def process_item(self, item, spider):
        return item
class Imagedown(ImagesPipeline):
    def file_path(self, request, response=None, info=None):
        item = request.meta["item"]
        filename = item["img_name"].replace("/","-")+".jpg"#这里我想说明一下 我保存的图片名字 中有'/'个人感觉不协调,就用'-'代替。了注意加上后缀'.jpg' 不然保存不成功哦
        return filename
    def get_media_requests(self, item, info):
        '''
        #如果item[urls]里里面是列表,用下面
        urls= item['urls']
        for url in urls:
            yield scrapy.Request(url,meta={"item",item})
        '''
        # 如果item[urls]里里面是一个图片地址,用这下面的
        yield scrapy.Request(item['img_urls'], meta={"item": item})##切记这里的meta 传的时候 是一个字典

在setting.py 中加入

BOT_NAME = 'imagedownload'
IMAGES_STORE = "e:/pics"#(注意这里表示你图片保存的地址)
ITEM_PIPELINES = {'imagedownload.pipelines.Imagedown': 300}

到此scrapy 里面的主要设置已经介绍完毕,希望对你们有所帮助,

上一篇下一篇

猜你喜欢

热点阅读