對於我的scrapy項目,我目前使用ImagesPipeline。下載的圖像是其網址的stored with a SHA1 hash作爲文件名。Scrapy圖像下載如何使用自定義文件名
如何使用自己的自定義文件名來存儲文件?
如果我的自定義文件名需要包含來自同一項目的另一個刮取字段,該怎麼辦?例如使用item['desc']
和item['image_url']
的圖像的文件名。如果我理解正確,那將涉及以某種方式訪問圖像管道中的其他項目字段。
任何幫助將不勝感激。
對於我的scrapy項目,我目前使用ImagesPipeline。下載的圖像是其網址的stored with a SHA1 hash作爲文件名。Scrapy圖像下載如何使用自定義文件名
如何使用自己的自定義文件名來存儲文件?
如果我的自定義文件名需要包含來自同一項目的另一個刮取字段,該怎麼辦?例如使用item['desc']
和item['image_url']
的圖像的文件名。如果我理解正確,那將涉及以某種方式訪問圖像管道中的其他項目字段。
任何幫助將不勝感激。
這就是我在Scrapy 0.10中解決問題的方法。 檢查FSImagesStoreChangeableDirectory的persist_image方法。下載的圖片的文件名是關鍵
class FSImagesStoreChangeableDirectory(FSImagesStore):
def persist_image(self, key, image, buf, info,append_path):
absolute_path = self._get_filesystem_path(append_path+'/'+key)
self._mkdir(os.path.dirname(absolute_path), info)
image.save(absolute_path)
class ProjectPipeline(ImagesPipeline):
def __init__(self):
super(ImagesPipeline, self).__init__()
store_uri = settings.IMAGES_STORE
if not store_uri:
raise NotConfigured
self.store = FSImagesStoreChangeableDirectory(store_uri)
在scrapy 0.12我解決了這樣的事情
class MyImagesPipeline(ImagesPipeline):
#Name download version
def image_key(self, url):
image_guid = url.split('/')[-1]
return 'full/%s.jpg' % (image_guid)
#Name thumbnail version
def thumb_key(self, url, thumb_id):
image_guid = thumb_id + url.split('/')[-1]
return 'thumbs/%s/%s.jpg' % (thumb_id, image_guid)
def get_media_requests(self, item, info):
yield Request(item['images'])
小記: 'ImagesPipeline.image_key(url)'和'file_key(url)'方法已棄用,請使用'file_path(request,response = None,info =無)「。 'scrapy/contrib/pipeline/images.py' – sumid 2014-03-07 19:45:12
我做了一個討厭的快速破解。就我而言,我將圖像的標題存儲在我的提要中。而且,每件商品只有1 image_urls
,所以我寫了下面的腳本。它基本上將/images/full/
目錄中的圖像文件重命名爲我以json存儲的項目源中的相應標題。
import os
import json
img_dir = os.path.join(os.getcwd(), 'images\\full')
item_dir = os.path.join(os.getcwd(), 'data.json')
with open(item_dir, 'r') as item_json:
items = json.load(item_json)
for item in items:
if len(item['images']) > 0:
cur_file = item['images'][0]['path'].split('/')[-1]
cur_format = cur_file.split('.')[-1]
new_title = item['title']+'.%s'%cur_format
file_path = os.path.join(img_dir, cur_file)
os.rename(file_path, os.path.join(img_dir, new_title))
這是討厭的&不推薦。但是,這是一種天真替代的方法。
這就是答案scrapy 0.24(編者),其中image_key()
已經過時
class MyImagesPipeline(ImagesPipeline):
#Name download version
def file_path(self, request, response=None, info=None):
#item=request.meta['item'] # Like this you can use all from item, not just url.
image_guid = request.url.split('/')[-1]
return 'full/%s' % (image_guid)
#Name thumbnail version
def thumb_path(self, request, thumb_id, response=None, info=None):
image_guid = thumb_id + response.url.split('/')[-1]
return 'thumbs/%s/%s.jpg' % (thumb_id, image_guid)
def get_media_requests(self, item, info):
#yield Request(item['images']) # Adding meta. Dunno how to put it in one line :-)
for image in item['images']:
yield Request(image)
'返回(請求(圖片)圖片的項目['images'])'爲您的一行。 – tiao 2015-01-07 16:25:16
我重寫代碼,改變,在thumb_path閃避,只是實現 「響應」。按要求。」。如果不是,它將不起作用,因爲「響應設置爲無」。
class MyImagesPipeline(ImagesPipeline):
#Name download version
def file_path(self, request, response=None, info=None):
#item=request.meta['item'] # Like this you can use all from item, not just url.
image_guid = request.url.split('/')[-1]
return 'full/%s' % (image_guid)
#Name thumbnail version
def thumb_path(self, request, thumb_id, response=None, info=None):
image_guid = thumb_id + request.url.split('/')[-1]
return 'thumbs/%s/%s.jpg' % (thumb_id, image_guid)
def get_media_requests(self, item, info):
#yield Request(item['images']) # Adding meta. Dunno how to put it in one line :-)
for image in item['images']:
yield Request(image)
我發現我的方式在2017年,scrapy 1.1.3
def file_path(self, request, response=None, info=None):
return request.meta.get('filename','')
def get_media_requests(self, item, info):
img_url = item['img_url']
meta = {'filename': item['name']}
yield Request(url=img_url, meta=meta)
像上面的代碼,你可以在get_media_requests()
你想要的名字添加到請求元,並把它放回file_path()
通過request.meta.get('yourname','')
。
感謝您的支持。您是否有使用圖像過期(http://doc.scrapy.org/topics/images.html#image-expiration)功能的經驗,如果是這樣的代碼會影響它嗎? – fortuneRice 2011-06-01 20:16:47
我沒有經驗。我檢查了scrapy源代碼。到期應繼續工作。如果您發現過期失效,請告訴我 – llazzaro 2011-06-02 01:38:07