Scrapy 下載項(xiàng)目圖片

  • 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.

  1. 首先在setting中激活以下
ITEM_PIPELINES = {
 'chinazproject.pipelines.ChinazProjectImagePipeline': 299, # 激活圖片下載管道
}
  1. 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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容