Scrapy提供了一個(gè) item pipeline ,來下載屬于某個(gè)特定項(xiàng)目的圖片,比如,當(dāng)你抓取產(chǎn)品時(shí),也想把它們的圖片下載到本地。
這條管道,被稱作圖片管道,在 ImagesPipeline 類中實(shí)現(xiàn),提供了一個(gè)方便并具有額外特性的方法,來下載并本地存儲(chǔ)圖片:
Pillow 是用來生成縮略圖,并將圖片歸一化為JPEG/RGB格式,因此為了使用圖片管道,你需要安裝這個(gè)庫。 Python Imaging Library (PIL) 在大多數(shù)情況下是有效的,但眾所周知,在一些設(shè)置里會(huì)出現(xiàn)問題,因此我們推薦使用 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):
"""
根據(jù)圖片的url地址,構(gòu)造requuests請求
:param item:
:param info:
:return:
"""
if isinstance(item,ChinazprojectWebInfoItem):
# 獲取圖片地址,發(fā)起請求
img_url = 'http:'+item['coverImage']
print('獲取圖片地址', img_url)
yield scrapy.Request(img_url)
# 如果有多個(gè)圖片地址,item['coverImage']對應(yīng)的是一個(gè)列表
# img_urls = item['coverImage']
# return [scrapy.Request(x) for x in img_urls]
def item_completed(self,results,item,info):
"""
圖片下載之后的回調(diào)結(jié)果
:param results: [(True/False,{'path':'圖片下載之后的一個(gè)儲(chǔ)存路徑','url':'圖片的url地址','ckecksum':'經(jīng)過HASH加密的一個(gè)字符串'})]:圖片下載成功還是失敗
:param item:
:param info:
:return:
"""
if isinstance(item,ChinazprojectWebInfoItem):
paths = [result['path'] for status,result in results if status]
print('圖片下載結(jié)果',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:
# 如果沒有成功獲取到圖片,將這個(gè)item丟棄
from scrapy.exceptions import DropItem
raise DropItem('沒有獲取到圖片,遺棄item')
# 獲取圖片地址,交給下一個(gè)管道處理
return item