Scrapy爬女神圖(二)—— 原來還能這樣玩

Srapy第三篇: ImagesPipeline的使用

大家好呀,我來填坑了(半夜寫文也是有些醉啊,課太多沒有辦法唉。。)
(先隨便放個圖)

Paste_Image.png

上次的項目一發出,立即有盆友留言:

"看來我們開的不是一輛車"
還是您這趟比較快

(詳情請看:Scrapy爬女神圖(一)—— 這是你們要的小姐姐
。。。。。
我,,,我還只是個純潔的寶寶好嘛。。。


</br>

不過,既然咱坑都挖了,還是得填不是?

今天就來談談,如何用Scrapy中ImagesPipeline(圖片管道),爬取可愛的小姐姐們_
</br>
</br>

一、基礎知識

Scrapy提供了一個item pipeline,下載某特定項目的圖片,又叫ImagesPipeline(圖片管道)

1、可以實現如下功能
將所有下載的圖片轉換成通用的格式(JPG)和模式(RGB)
避免重復下載已經下載過的圖
生成指定縮略圖
檢測圖片的寬和高,確保它們滿足最小限制
由上,為了使用ImagePipeline并獲得縮略圖,需要安裝pillow(不推薦用PIL)</br></br>
2、使用ImagesPipeline工作流程
(直接截了官網的圖)

</br></br>3、實現 定制圖片管道
正如工作流程所示,Pipeline將從item中獲取圖片的URLs并下載它們,使用get_media_requests處理圖片,并返回一個Request對象,這些請求對象將被Pipeline處理,當完成下載后,結果將發送到item_completed方法,當一個單獨項目中的所有圖片請求完成時(要么完成下載,要么因為某種原因下載失敗),ImagesPipeline.item_completed()方法將被調用。</br>
結果results為一個二元組的list,每個元祖包含(success, image_info_or_error)
success: boolean值,success=true表示成功下載 ,反之失敗
image_info_or_error 是一個包含下列關鍵字的字典(如果成功為 True )或者出問題時為 Twisted Failure 。</br></br>字典包含以下鍵值對url:原始URL ****path:本地存儲路徑 checksum****:校驗碼
失敗則包含一些出錯信息。

</br>
</br>

二、代碼修改

延續之前例子,不夠清楚噠請看上一篇文:Scrapy爬女神圖(一)—— 這是你們要的小姐姐
改動主要在settings和pipelines上
為了大家理解得更加清楚些,這回盡量多點注釋_
<settings部分>

# -*- coding: utf-8 -*-
# Scrapy settings for XiaoHua project

BOT_NAME = 'XiaoHua'
SPIDER_MODULES = ['XiaoHua.spiders']
NEWSPIDER_MODULE = 'XiaoHua.spiders'

#是否遵守機器人規則
ROBOTSTXT_OBEY = False

#一次可以requests請求的最大次數,默認16,
CONCURRENT_REQUESTS=16

#下載延遲設置為1s
DOWNLOAD_DELAY=1

#禁用Cookies防止被ban
COOKIES_ENABLED = False

#設置headers
DEFAULT_REQUEST_HEADERS = {
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding':'gzip, deflate, sdch',
'Accept-Language':'zh-CN,zh;q=0.8',
'Cache-Control':'max-age=0',
'Connection':'keep-alive',
'User-Agent':'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}

#管道設置
ITEM_PIPELINES = {'XiaoHua.pipelines.XiaohuaPipeline': 1}

#IMAGES_STORE用于設置圖片存儲路徑
IMAGES_STORE=r'F:\\Desktop\code\info\XiaoHua2'

#IMAGES_THUMBS用于生成大小不同的縮略圖
#以字典形式表示,鍵為文件名,值為圖片尺寸
IMAGES_THUMBS={
'small': (50, 50),
'big': (200, 200),}

#以下兩個設置可以過濾尺寸小于100的圖片
IMAGES_MIN_HEIGHT=100
IMAGES_MIN_WIDTH=100

#IMAGES_EXPIRES用于設置失效期限
#這里是90天,避免管道重復下載最近已經下載過的
IMAGES_EXPIRES=90

</br>

<pipelines部分>

改動最大

# -*- coding: utf-8 -*-
import scrapy
from scrapy.exceptions import DropItem
#需要導入ImagesPipeline
from scrapy.pipelines.images import ImagesPipeline
from XiaoHua import settings
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

class XiaohuaPipeline(ImagesPipeline):

    #用get_media_requests方法進行下載控制,返回一個requests對象
    #對象被Pipeline處理,下載結束后,默認直接將結果傳給item_completed方法
    def get_media_requests(self, item,info):
        yield scrapy.Request(item['detailURL'])

    def item_completed(self,results,item,info):
        #創建圖片存儲路徑
        path=[x['path'] for ok,x in results if ok]
        #判斷圖片是否下載成功,若不成功則拋出DropItem提示
        if not path:
            raise DropItem('Item contains no images')
        print u'正在保存圖片:', item['detailURL']
        print u'主題', item['title']
        return item

items部分和spiders部分相應做下精簡
完整版代碼下載,輕戳這里:github地址

</br>

三、結果

結果就是下面這樣~

page1

可以從框中看到圖片下載異常的提示(scrapy會自動跳過)

page2

我們點開DropItem的網址,發現圖片真的不存在

page3

page4

由上來看,一共抓取成功2042張,失敗74張
來看文件發生了什么變化:
點開,可以看到生成的原圖(full)和縮略圖(thumbs)文件


再點開,thumbs中分big和small,大小縮略圖,就是之前設置的字典中的鍵


點開small,可以看到圖片真的是根據URL的SHA1 hash值來自動命名的,
(hash值很少會重復,所以可以實現重復判斷)

page5

再隨便點開一個,如下,真的是縮略圖哦~

page6

</br>
</br>

四、資料推薦

終于差不多啦,送送福利_
我收集了一些比較優秀的資料,大家可以做個參考~
官方文檔
Scrapy0.24—— ImagesPipeline部分
優秀博客
http://www.lxweimin.com/p/2528edf4485c
用scrapy自動爬取下載圖片
</br>
</br>

五、總結

最后連帶之前的內容一并總結下
這兩篇我們使用Scrapy抓取多級網頁及圖片
1、抓取多級網頁:用meta傳遞數據
2、Scrapy抓取圖片:scrapy框架+requests的get方式
3、Scrapy抓取圖片: scrapy框架+內置ImagesPipeline方式

兩種方式其實下載速度差不多(后面那一種可能快一些)
</br>
不過ImagesPipeline可自定義縮略圖、過濾小圖,還可將打印提示一些出錯或不存在而無法下載的圖片。 但個人感覺這個項目里面,使用第一種,將圖片歸類(以title名)存入文件,更加清晰也易查看。

你覺得呢?

(不要愣啦,快快點個贊吧⊙▽⊙)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容