最近练习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也是正确的直接在浏览器里可以搜出图片,但是抛出异常下载失败,又没有错误提示。
一开始我以为是传的url的问题,经过我反复尝试返现是储存路径出了问题。我的目的是以title作为二级目录的文件夹名,然后以1,2,3序号命名图片。可以看到我的index定义的是int类型的,直接用int类型的不能当做下载文件名,所以用str(index)转成字符串就可以了,结果如图。所以在下载失败的时候分析一下看看自己的路径有没有问题。不能单独用int命名这个点我反复debug了3个多小时才发现。FXXK,又没有错误提示,太坑了。