scrapy框架下载图片失败原因(记自己踩的坑)

最近练习scrapy框架,爬取360图片,已经爬取到了想要的信息,然而在下载时下载错误。想看结果的直接看最后结论!

如下是下载函数

'''
下载图片
'''
class ImagePipeline(ImagesPipeline):

    def get_media_requests(self,item,info):
        yield Request(url=item['url'],meta={'item':item})
    
    def file_path(self, request, response=None, info=None):
        #url = request.url
        #file_name = url.split('/')[-1]
        # return file_name
      
        file_name = request.meta['item']['title']
        image_name = request.meta['item']['index'] + '.jpg'
        return "{0}/{1}".format(file_name,image_name)
    
    def item_completed(self,results,item,info):
            image_paths = [x['path'] for ok,x in results if ok]
            if not image_paths:
                raise DropItem('Image Downloaded Failed')
            return item
    

item里的值为

 def detail_parse(self,response):
        results = json.loads(response.text)
        index = 0
        for result in results.get('result'):
            index += 1
            item = ImageItem()
            item['url'] = result.get('qhimg_url')
            item['thumb'] = result.get('qhimg_thumb')
            item['title'] = response.meta.get('title')
            item['index'] = index
            yield item

运行后如图,item内信息已经爬到,url也是正确的直接在浏览器里可以搜出图片,但是抛出异常下载失败,又没有错误提示。scrapy框架下载图片失败原因(记自己踩的坑)_第1张图片
一开始我以为是传的url的问题,经过我反复尝试返现是储存路径出了问题。我的目的是以title作为二级目录的文件夹名,然后以1,2,3序号命名图片。可以看到我的index定义的是int类型的,直接用int类型的不能当做下载文件名,所以用str(index)转成字符串就可以了,结果如图。所以在下载失败的时候分析一下看看自己的路径有没有问题。不能单独用int命名这个点我反复debug了3个多小时才发现。FXXK,又没有错误提示,太坑了。
scrapy框架下载图片失败原因(记自己踩的坑)_第2张图片
scrapy框架下载图片失败原因(记自己踩的坑)_第3张图片
scrapy框架下载图片失败原因(记自己踩的坑)_第4张图片

结论:单独用int类型命名图片是不行如的如 1.jpg,必须转换成字符串格式。下载失败的原因可能是:1、url不正确。2、储存路径不正确

你可能感兴趣的:(scrapy框架下载图片失败原因(记自己踩的坑))