仔细看了下scrapy的官方文档关于ImagesPipeline的介绍说明及使用例子:Downloading Item Images
感觉官方文档太过简单。
比如:通过在setting.py
文件中通过给IMAGES_STORE
赋值,就可以指定图片的保存路径。
并且默认情况下,文件名是通过对url使用SHA1 hash得来的。
现在我想以原来的图片名进行保存,不知道该如何做,希望有经验的朋友帮忙指点下~
另外求大家帮忙推荐下关于scrapy的相关书籍(中英文都行)
仔细看了下scrapy的官方文档关于ImagesPipeline的介绍说明及使用例子:Downloading Item Images
感觉官方文档太过简单。
比如:通过在setting.py
文件中通过给IMAGES_STORE
赋值,就可以指定图片的保存路径。
并且默认情况下,文件名是通过对url使用SHA1 hash得来的。
现在我想以原来的图片名进行保存,不知道该如何做,希望有经验的朋友帮忙指点下~
另外求大家帮忙推荐下关于scrapy的相关书籍(中英文都行)
修改file_path对原代码侵入太大,如果只是为了修改文件路径的话,可以在item_completed对文件进行重命名。
class NeteaseautoImagePipeline(ImagesPipeline):
def get_media_requests(self, item, info):
for image_url in item['image_urls']:
yield scrapy.Request(image_url.replace('120x90', '800x600'))
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")
if item['jk']:
newname = item['car'] + '-' + item['jk'] + '-' + item['model'] + '.jpg'
else:
newname = item['car'] + '-' + item['model'] + '.jpg'
os.rename("/neteaseauto/" + image_paths[0], "/neteaseauto/" + newname)
return item
设置图片存储目录
IMAGES_STORE = 'D:\ImageSpider'
在pipelines.py中,重写file_path即可,这样存储的文件路径就类似这样: D:\ImageSpider\*.jpg
class ImagespiderPipeline(ImagesPipeline):
def file_path(self, request, response=None, info=None):
# 重命名,若不重写这函数,图片名为哈希,就是一串乱七八糟的名字
image_guid = request.url.split('/')[-1] # 提取url前面名称作为图片名。
return image_guid
还一种改法: 在里面重写 item_completed函数. 把默认的存储文件名字改成自己想要的,然后重新保存一个新的路径:
# #重命名文件,并把默认路径D:\ImageSpiderfull\*图片
# #修改为D:\ImageSpider\*.jpg,提取item['imgurl']中url前面名称作为图片名
# #功能上类似file_path
def item_completed(self, results, item, info):
image_path = [x["path"] for ok, x in results if ok]
for i in range(len(image_path)):
os.rename(images_store+'/'+image_path[i],images_store+'/'+item['imgurl'][i].split('/')[-1])
现在我想以原来的图片名进行保存
貌似这个没有直接的参数可以传,需要自己实现Images Pipeline
scrapy.contrib.pipeline.images.ImagesPipeline
类的get_media_requests(item, info)
会下载图片,并把结果喂给item_completed()
方法,结果是一个tuple,(success, image_info_or_failure)
,其中success
是下载是否成功的bool,image_info_or_failure
包括url
、path
和checksum
三项。其中,path
就是相对于IMAGES_STORE
的路径(含文件名)。
[(True,
{'checksum': '2b00042f7481c7b056c4b410d28f33cf',
'path': 'full/7d97e98f8af710c7e7fe703abc8f639e0ee507c4.jpg',
'url': 'http://www.example.com/images/product1.jpg'}),
(True,
{'checksum': 'b9628c4ab9b595f72f280b90c4fd093d',
'path': 'full/1ca5879492b8fd606df1964ea3c1e2f4520f076f.jpg',
'url': 'http://www.example.com/images/product2.jpg'}),
(False,
Failure(...))]
上面是官网上的例子。
所以你需要做的是改写item_completed(results, items, info)
方法,用原本的文件名替换掉item['image_paths']
。
1 回答9.4k 阅读✓ 已解决
2 回答5.1k 阅读✓ 已解决
2 回答3.4k 阅读✓ 已解决
3 回答4.4k 阅读
2 回答2.4k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
查看下ImagePipeline的源码,发现可以重写file_path函数以修改图片名称,例如:
ImagePipeline的源码如下: