Srapy第三篇: ImagesPipeline的使用
大家好呀,我來填坑了(半夜寫文也是有些醉啊,課太多沒有辦法唉。。)
(先隨便放個圖)
上次的項目一發出,立即有盆友留言:
"看來我們開的不是一輛車"
”還是您這趟比較快“
(詳情請看: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>
三、結果
結果就是下面這樣~
可以從框中看到圖片下載異常的提示(scrapy會自動跳過)
我們點開DropItem的網址,發現圖片真的不存在
由上來看,一共抓取成功2042張,失敗74張
來看文件發生了什么變化:
點開,可以看到生成的原圖(full)和縮略圖(thumbs)文件
再點開,thumbs中分big和small,大小縮略圖,就是之前設置的字典中的鍵
點開small,可以看到圖片真的是根據URL的SHA1 hash值來自動命名的,
(hash值很少會重復,所以可以實現重復判斷)
再隨便點開一個,如下,真的是縮略圖哦~
</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名)存入文件,更加清晰也易查看。
你覺得呢?
(不要愣啦,快快點個贊吧⊙▽⊙)