Scrapy学习篇(九)之文件与图片下载
Media Pipeline
Scrapy為下載item中包含的文件(比如在爬取到產品時,同時也想保存對應的圖片)提供了一個可重用的 item pipelines . 這些pipeline有些共同的方法和結構(稱之為media pipeline)。我們可以使用FilesPipeline和Images Pipeline來保存文件和圖片,他們有以下的一些特點:
- Files Pipeline
- 避免重新下載最近已經下載過的數據
- 指定存儲路徑
- 避免重新下載最近已經下載過的數據
- 在一個爬蟲里,你抓取一個項目,把其中圖片的URL放入 file_urls 組內。
- 項目從爬蟲內返回,進入項目管道。
- 當項目進入 FilesPipeline,file_urls 組內的URLs將被Scrapy的調度器和下載器(這意味著調度器和下載器的中間件可以復用)安排下載,當優先級更高,會在其他頁面被抓取前處理。項目會在這個特定的管道階段保持“locker”的狀態,直到完成文件的下載(或者由于某些原因未完成下載)。
- 當文件下載完后,另一個字段(files)將被更新到結構中。這個組將包含一個字典列表,其中包括下載文件的信息,比如下載路徑、源抓取地址(從 file_urls 組獲得)和圖片的校驗碼(checksum)。 files 列表中的文件順序將和源 file_urls 組保持一致。如果某個圖片下載失敗,將會記錄下錯誤信息,圖片也不會出現在 files 組中。
- Images Pipeline
- 避免重新下載最近已經下載過的數據
- 指定存儲路徑
- 將所有下載的圖片轉換成通用的格式(JPG)和模式(RGB)
- 縮略圖生成
- 檢測圖像的寬/高,確保它們滿足最小限制
注意:你需要安裝Pillow 庫來實現以上的拓展功能。
啟用Media Pipeline
要想使用media pipeline,你需要在設置添加一些必要的信息。
# 同時啟用圖片和文件管道 ITEM_PIPELINES = {'scrapy.pipelines.images.ImagesPipeline': 1,'scrapy.pipelines.files.FilesPipeline': 2,} FILES_STORE = 'D:' # 文件存儲路徑 IMAGES_STORE = 'D' # 圖片存儲路徑# 避免下載最近90天已經下載過的文件內容 FILES_EXPIRES = 90 # 避免下載最近90天已經下載過的圖像內容 IMAGES_EXPIRES = 30# 設置圖片縮略圖 IMAGES_THUMBS = {'small': (50, 50),'big': (250, 250), } # 圖片過濾器,最小高度和寬度,低于此尺寸不下載 IMAGES_MIN_HEIGHT = 110 IMAGES_MIN_WIDTH = 110你可能會好奇文件的命名,在當你啟用media pipeline以后,
它的默認命名方式是這樣的,文件以它們URL的 SHA1 hash 作為文件名。
例如,
對下面的圖片URL:http://www.example.com/image.jpg,
其SHA1 hash 值為:3afec3b4765f8f0a07b78f98c07b83f013567a0a
將被下載并存為下面的文件:<IMAGES_STORE>/full/3afec3b4765f8f0a07b78f98c07b83f013567a0a.jpg
其中, 是定義在 IMAGES_STORE 設置里的文件夾,我們設置的是D盤,full 是用來區分圖片和縮略圖(如果使用的話)的一個子文件夾,這個文件夾scrapy會自動生成。
擴展Media Pipeline
下面我們以ImagesPipeline為例來自定義ImagesPipeline,需要重寫以下兩個方法:
get_media_requests(item, info)
def get_media_requests(self, item, info):for image_url in item['image_urls']:yield scrapy.Request(image_url) 這些請求將被管道處理,當它們完成下載后,結果將以2元素的元組列表形式傳送到 item_completed() 方法: 每個元組包含 (success, file_info_or_error):
在工作流程中可以看到,管道會得到圖片的URL并從項目中下載。為了這么做,你需要重寫 get_media_requests() 方法,并對各個圖片URL返回一個Request:- success 是一個布爾值,當圖片成功下載時為 True ,因為某個原因下載失敗為False
file_info_or_error 是一個包含下列關鍵字的字典(如果成功為 True )或者出問題時為 Twisted Failure 。
[(True,{'checksum': '2b00042f7481c7b056c4b410d28f33cf','path': 'full/0a79c461a4062ac383dc4fade7bc09f1384a3910.jpg','url': 'http://www.example.com/files/product1.jpg'}),(False,Failure(...))]
url - 文件下載的url。這是從 get_media_requests() 方法返回請求的url。
path - 圖片存儲的路徑(類似 IMAGES_STORE)
checksum - 圖片內容的 MD5 hash
item_completed() 接收的元組列表需要保證與 get_media_requests() 方法返回請求的順序相一致。下面是 results 參數的一個典型值:該方法 必須返回每一個圖片的URL。
- success 是一個布爾值,當圖片成功下載時為 True ,因為某個原因下載失敗為False
item_completed(results, items, info)
當一個單獨項目中的所有圖片請求完成時,例如,item里面一共有10個URL,那么當這10個URL全部下載完成以后,ImagesPipeline.item_completed() 方法將被調用。默認情況下, item_completed() 方法返回item。
使用ImagesPipeline下載圖片
下面我們用上面學習到的知識來下載一些圖片。
我們以http://jandan.net/ooxx為例,把頁面上的圖片下載下來,并產生縮略圖
我們新建一個項目,名為jiandan,各個文件內容如下。
- item.py
- jiandan_spider.py
- settings.py
- pipelinse.py
運行這個spider,你會發現,圖片已經下載好了,如下圖所示。
圖片內容你可以自己慢慢看。
轉載于:https://www.cnblogs.com/cnkai/p/7400467.html
總結
以上是生活随笔為你收集整理的Scrapy学习篇(九)之文件与图片下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MAC EI Capitan上更新系统自
- 下一篇: Python的可视化包 – Matplo