Scrapy提供了一個 item pipeline ,來下載屬于某個特定項目的圖片,比如,當你抓取產品時,也想把它們的圖片下載到本地。
這條管道,被稱作圖片管道,在 ImagesPipeline 類中實現,提供了一個方便并具有額外特性的方法,來下載并本地存儲圖片:
Pillow 是用來生成縮略圖,并將圖片歸一化為JPEG/RGB格式,因此為了使用圖片管道,你需要安裝這個庫。 Python Imaging Library (PIL) 在大多數情況下是有效的,但眾所周知,在一些設置里會出現問題,因此我們推薦使用 Pillow 而不是 PIL.
首先在setting中激活以下
ITEM_PIPELINES = {
'chinazproject.pipelines.ChinazProjectImagePipeline': 299, # 激活圖片下載管道
}
pipelines
from scrapy.contrib.pipeline.images import ImagesPipeline
import scrapy
from chinazproject.items import ChinazprojectWebInfoItem,ChinazprojectTagItem
import os
取出配置文件
from scrapy.utils.project import get_project_settings
os.remove()# 重命名
獲取settings文件的信息
images_store = get_project_settings().get('IMAGES_STORE')
class ChinazProjectImagePipeline(ImagesPipeline):
def get_media_requests(self,item,info):
"""
根據圖片的url地址,構造requuests請求
:param item:
:param info:
:return:
"""
if isinstance(item,ChinazprojectWebInfoItem):
# 獲取圖片地址,發起請求
img_url = 'http:'+item['coverImage']
print('獲取圖片地址', img_url)
yield scrapy.Request(img_url)
# 如果有多個圖片地址,item['coverImage']對應的是一個列表
# img_urls = item['coverImage']
# return [scrapy.Request(x) for x in img_urls]
def item_completed(self,results,item,info):
"""
圖片下載之后的回調結果
:param results: [(True/False,{'path':'圖片下載之后的一個儲存路徑','url':'圖片的url地址','ckecksum':'經過HASH加密的一個字符串'})]:圖片下載成功還是失敗
:param item:
:param info:
:return:
"""
if isinstance(item,ChinazprojectWebInfoItem):
paths = [result['path'] for status,result in results if status]
print('圖片下載結果',results)
if len(paths)>0:
print('圖片下載成功')
# 使用os的rename方法修改文件的名稱
os.rename(images_store+'/'+paths[0],images_store+'/'+item['title']+'.jpg')
image_path = images_store+'/'+item['title']+'.jpg'
print('修改后的路徑',image_path)
item['locakImgePath'] = image_path
else:
# 如果沒有成功獲取到圖片,將這個item丟棄
from scrapy.exceptions import DropItem
raise DropItem('沒有獲取到圖片,遺棄item')
# 獲取圖片地址,交給下一個管道處理
return item