按計劃把爬妹子圖的爬蟲文章寫完,此次重寫了pipeline,對圖片進行重命名,並分目錄存儲。git
源碼簡單直接上了。。。github
from scrapy.pipelines.images import ImagesPipeline from scrapy.http import Request class SpiderMeizituPipeline(ImagesPipeline): @classmethod def get_media_requests(self, item, info): return Request(item['image_urls'][0],meta={'imagegroup':item['images'],'imageindex':item['index']}) def file_path(self, request, response=None, info=None): imagegroup = request.meta['imagegroup'] imageindex = request.meta['imageindex'] filepath = 'full/%s/%s.jpg' % (imagegroup,imageindex) return filepath
網上用Scrapy爬圖後更名的文章不少,代碼稍有不一樣,原理都是同樣。Scrapy原生的ImagesPipeline
中,只能用SHA1哈希值
存儲文件名,若是咱們要存儲自定義的文件名(本身定義文件名固然要有意義的,而文件含義通常存儲在item
中)就要重寫ImagePipeline
。在原生的ImagesPipeline
類中,設置存儲路徑和文件名的方法是file_path
,咱們看源碼,它的參數只有4個:self
,request
, response
,info
。並無item
,那麼就要想辦法把item
中的內容傳輸到file_path
中。所以,就要重寫get_media_requests
和file_path
方法。scrapy
get_media_requests的做用是解析item
中的image_urls
,並把url
逐個發送給Scrapy引擎,這裏同網上其餘文章同樣,爲request
添加meta
,這樣就把圖片名稱和序號傳給了file_path()
file_path的做用就是定義圖片存儲路徑和文件名,沒有太多好說的了。ide