Scrapy框架提供了ImagePipeLine管道,用於下載網頁中的圖片,存儲到本地或者雲
框架提供的默認管道功能是,在Spider中收集圖片url,作爲列表存儲到Item的指定屬性image_urls中去,管道自動會下載圖片並且可以存儲完整圖像和縮略圖到指定的存儲位置,圖片名稱爲url的hash
這裏主要有一個問題,圖片如果要分類、分詳情存儲,比如一個詳情頁面的圖片放到一個文件夾中,這樣的要求舊需要定製ImagePipeLine
1.圖片存儲Item
import scrapy
# 地產圖片實體
class Image(scrapy.Item):
# 地產編號
no = scrapy.Field()
# 地產類型
classify = scrapy.Field()
# 圖片url
image_urls = scrapy.Field()
主要字段爲image_urls,這個屬性存儲了圖片url列表,屬性名稱可以配置,其他屬性是爲了生成存儲目錄
2.自定義ImagePipeLine
import os
import scrapy
from urllib.parse import urlparse
from image import Image
from scrapy.pipelines.images import ImagesPipeline
#圖片管道
class MyImagesPipeline(ImagesPipeline):
def get_media_requests(self, item, info):
#只處理Info
if isinstance(item, Image):
classify = item.get('classify')
no = item.get('no')
for url in item.get(self.images_urls_field, []):
print(url)
name = classify+"/"+no+"/"
yield scrapy.Request(url=url, meta={'name':name})
def file_path(self, request, response=None, info=None):
#文件路徑 images/<類別>/<編號>/<文件名>
return 'images/' + request.meta['name']+request.url.split('/')[-1].split('?')[0]
重寫get_media_requests方法,首先判斷了Item的類型,然後獲取url,遍歷發出請求,設置元數據name用於構造目錄路徑
重寫file_path方法·,這個方法直接返回相對目錄路徑,其中拼接了元數據中的路徑,起到了分開存儲的目的