Scrapy爬取美女圖片續集 (原創)

來源:互聯網
上載者:User

標籤:

  上一篇咱們講解了Scrapy的工作機制和如何使用Scrapy爬取美女圖片,而今天接著講解Scrapy爬取美女圖片,不過採取了不同的方式和代碼實現,對Scrapy的功能進行更深入的運用。

 

  在學習Scrapy官方文檔的過程中,發現Scrapy自身實現了圖片和檔案的下載功能,不需要咱們之前自己實現圖片的下載(不過原理都一樣)。

  在官方文檔中,我們可以看到下面一些話:Scrapy為下載item中包含的檔案(比如在爬取到產品時,同時也想儲存對應的圖片)提供了一個可重用的 item pipelines . 這些pipeline有些共同的方法和結構(我們稱之為media pipeline)。一般來說你會使用Files Pipeline或者 Images Pipeline.

這兩種pipeline都實現了以下特性:

  • 避免重新下載最近已經下載過的資料

  • Specifying where to store the media (filesystem directory, Amazon S3 bucket)

  The Images Pipeline has a few extra functions for processing images:

  • 將所有下載的圖片轉換成通用的格式(JPG)和模式(RGB)

  • 縮圖產生

  • 檢測映像的寬/高,確保它們滿足最小限制

這個管道也會為那些當前安排好要下載的圖片保留一個內部隊列,並將那些到達的包含相同圖片的項目串連到那個隊列中。 這可以避免多次下載幾個項目共用的同一個圖片。

      從上面的話中,我們可以瞭解到 Scrapy不僅可以下載圖片,還可以產生指定大小的縮圖,這就非常有用。

 

 使用Files Pipeline

當使用 FilesPipeline ,典型的工作流程如下所示:

  1. 在一個爬蟲裡,你抓取一個項目,把其中圖片的URL放入 file_urls 組內。

  2. 項目從爬蟲內返回,進入項目管道。

  3. 當項目進入 FilesPipeline,file_urls 組內的URLs將被Scrapy的調度器和下載器(這意味著調度器和下載器的中介軟體可以複用)安排下載,當優先順序更高,會在其他頁面被抓取前處理。項目會在這個特定的管道階段保持“locker”的狀態,直到完成檔案的下載(或者由於某些原因未完成下載)。

  4. 當檔案下載完後,另一個欄位(files)將被更新到結構中。這個組將包含一個字典列表,其中包括下載檔案的資訊,比如下載路徑、源抓取地址(從 file_urls 組獲得)和圖片的校正碼(checksum)。 files 列表中的檔案順序將和源 file_urls 組保持一致。如果某個圖片下載失敗,將會記錄下錯誤資訊,圖片也不會出現在 files 組中。

 

 

使用Images Pipeline

當使用Imagespipeline ,典型的工作流程如下所示:

  1. 在一個爬蟲裡,你抓取一個項目,把其中圖片的URL放入 images_urls 組內。

  2. 項目從爬蟲內返回,進入項目管道。

  3. 當項目進入 Imagespipeline,images_urls 組內的URLs將被Scrapy的調度器和下載器(這意味著調度器和下載器的中介軟體可以複用)安排下載,當優先順序更高,會在其他頁面被抓取前處理。項目會在這個特定的管道階段保持“locker”的狀態,直到完成檔案的下載(或者由於某些原因未完成下載)。

  4. 當檔案下載完後,另一個欄位(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爬取美女圖片續集 (原創)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.