標籤:
上一篇咱們講解了Scrapy的工作機制和如何使用Scrapy爬取美女圖片,而今天接著講解Scrapy爬取美女圖片,不過採取了不同的方式和代碼實現,對Scrapy的功能進行更深入的運用。
在學習Scrapy官方文檔的過程中,發現Scrapy自身實現了圖片和檔案的下載功能,不需要咱們之前自己實現圖片的下載(不過原理都一樣)。
在官方文檔中,我們可以看到下面一些話:Scrapy為下載item中包含的檔案(比如在爬取到產品時,同時也想儲存對應的圖片)提供了一個可重用的 item pipelines . 這些pipeline有些共同的方法和結構(我們稱之為media pipeline)。一般來說你會使用Files Pipeline或者 Images Pipeline.
這兩種pipeline都實現了以下特性:
The Images Pipeline has a few extra functions for processing images:
這個管道也會為那些當前安排好要下載的圖片保留一個內部隊列,並將那些到達的包含相同圖片的項目串連到那個隊列中。 這可以避免多次下載幾個項目共用的同一個圖片。
從上面的話中,我們可以瞭解到 Scrapy不僅可以下載圖片,還可以產生指定大小的縮圖,這就非常有用。
使用Files Pipeline
當使用 FilesPipeline ,典型的工作流程如下所示:
-
在一個爬蟲裡,你抓取一個項目,把其中圖片的URL放入 file_urls 組內。
-
項目從爬蟲內返回,進入項目管道。
-
當項目進入 FilesPipeline,file_urls 組內的URLs將被Scrapy的調度器和下載器(這意味著調度器和下載器的中介軟體可以複用)安排下載,當優先順序更高,會在其他頁面被抓取前處理。項目會在這個特定的管道階段保持“locker”的狀態,直到完成檔案的下載(或者由於某些原因未完成下載)。
-
當檔案下載完後,另一個欄位(files)將被更新到結構中。這個組將包含一個字典列表,其中包括下載檔案的資訊,比如下載路徑、源抓取地址(從 file_urls 組獲得)和圖片的校正碼(checksum)。 files 列表中的檔案順序將和源 file_urls 組保持一致。如果某個圖片下載失敗,將會記錄下錯誤資訊,圖片也不會出現在 files 組中。
使用Images Pipeline
當使用Imagespipeline ,典型的工作流程如下所示:
-
在一個爬蟲裡,你抓取一個項目,把其中圖片的URL放入 images_urls 組內。
-
項目從爬蟲內返回,進入項目管道。
-
當項目進入 Imagespipeline,images_urls 組內的URLs將被Scrapy的調度器和下載器(這意味著調度器和下載器的中介軟體可以複用)安排下載,當優先順序更高,會在其他頁面被抓取前處理。項目會在這個特定的管道階段保持“locker”的狀態,直到完成檔案的下載(或者由於某些原因未完成下載)。
-
當檔案下載完後,另一個欄位(images)將被更新到結構中。這個組將包含一個字典列表,其中包括下載檔案的資訊,比如下載路徑、源抓取地址(從 images_urls 組獲得)和圖片的校正碼(checksum)。 images 列表中的檔案順序將和源 images_urls 組保持一致。如果某個圖片下載失敗,將會記錄下錯誤資訊,圖片也不會出現在 images 組中。
Pillow 是用來產生縮圖,並將圖片歸一化為JPEG/RGB格式,因此為了使用圖片管道,你需要安裝這個庫。 Python Imaging Library (PIL) 在大多數情況下是有效,但眾所周知,在一些設定裡會出現問題,因此我們推薦使用 Pillow 而不是PIL.
咱們這次用到的就是Images Pipeline,用來下載圖片,同時使用 Pillow 產生縮圖。在安裝Scrapy的基礎上,使用pip install pillow 安裝這個模組。
開啟cmd,輸入scrapy startproject jiandan,這時候會產生一個工程,然後我把整個工程複製到pycharm中(還是使用IDE開發快)。
就是工程的結構。
jiandanSpider.py ------Spider 蜘蛛
items.py -----------------對要爬取資料的模型定義
pipelines.py-------------咱們最終要儲存的資料
settings.py----------------對Scrapy的配置
接下來我把代碼貼一下(複製代碼請到我部落格):
jiandanSpider.py(和之前沒有變化):#coding:utf-8#需要安裝pillow模組import scrapyfrom jiandan.items import JiandanItemfrom scrapy.crawler import CrawlerProcessclass jiandanSpider(scrapy.Spider): name = ‘jiandan‘ allowed_domains = [] start_urls = ["http://jandan.net/ooxx"] def parse(self, response): item = JiandanItem() item[‘image_urls‘] = response.xpath(‘//img//@src‘).extract()#提取圖片連結 # print ‘image_urls‘,item[‘image_urls‘] yield item new_url= response.xpath(‘//a[@class="previous-comment-page"]//@href‘).extract_first()#翻頁 # print ‘new_url‘,new_url if new_url: yield scrapy.Request(new_url,callback=self.parse)
items.py(增加了一個欄位,請看之前對Images Pipeline的描述) :# -*- coding: utf-8 -*-# Define here the models for your scraped items## See documentation in:# http://doc.scrapy.org/en/latest/topics/items.htmlimport scrapyclass JiandanItem(scrapy.Item): # define the fields for your item here like: image_urls = scrapy.Field()#圖片的連結 images = scrapy.Field()
pipelines.py(改變最大,看注釋):# -*- coding: utf-8 -*-# Define your item pipelines here## Don‘t forget to add your pipeline to the ITEM_PIPELINES setting# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.htmlimport osimport urllibimport scrapyfrom scrapy.exceptions import DropItemfrom scrapy.pipelines.images import ImagesPipelinefrom jiandan import settingsclass JiandanPipeline(ImagesPipeline):#繼承ImagesPipeline這個類,實現這個功能 def get_media_requests(self, item, info):#重寫ImagesPipeline get_media_requests方法 ‘‘‘ :param item: :param info: :return: 在工作流程中可以看到, 管道會得到檔案的URL並從項目中下載。 為了這麼做,你需要重寫 get_media_requests() 方法, 並對各個圖片URL返回一個Request: ‘‘‘ for image_url in item[‘image_urls‘]: yield scrapy.Request(image_url) def item_completed(self, results, item, info): ‘‘‘ :param results: :param item: :param info: :return: 當一個單獨項目中的所有圖片請求完成時(要麼完成下載,要麼因為某種原因下載失敗), item_completed() 方法將被調用。 ‘‘‘ image_paths = [x[‘path‘] for ok, x in results if ok] if not image_paths: raise DropItem("Item contains no images") return item
settings.py(主要是對縮圖的設定):# -*- coding: utf-8 -*-# Scrapy settings for jiandan project## For simplicity, this file contains only settings considered important or# commonly used. You can find more settings consulting the documentation:## http://doc.scrapy.org/en/latest/topics/settings.html# http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html# http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.htmlBOT_NAME = ‘jiandan‘SPIDER_MODULES = [‘jiandan.spiders‘]NEWSPIDER_MODULE = ‘jiandan.spiders‘ITEM_PIPELINES = { ‘jiandan.pipelines.JiandanPipeline‘: 1,}# ITEM_PIPELINES = {‘jiandan.pipelines.ImagesPipeline‘: 1}IMAGES_STORE=‘E:\\jiandan2‘DOWNLOAD_DELAY = 0.25IMAGES_THUMBS = {#縮圖的尺寸,設定這個值就會產生縮圖 ‘small‘: (50, 50), ‘big‘: (200, 200),}
最後咱們開始運行程式,cmd切換到工程目錄,
輸入scrapy crawl jiandan,啟動爬蟲。。。
大約25分鐘左右,爬蟲工作結束。。。
咱們去看看美女圖吧。
咱們開啟thumbs檔案夾,看看縮圖,下面有咱們設定的不同的尺寸。
今天的分享就到這裡,如果大家覺得還可以呀,記得打賞呦。
歡迎大家支援我公眾號:
本文章屬於原創作品,歡迎大家轉載分享。尊重原創,轉載請註明來自:七夜的故事 http://www.cnblogs.com/qiyeboy/
Scrapy爬取美女圖片續集 (原創)