摘要:簡(jiǎn)介用類提供一種方便的方式來(lái)下載和存儲(chǔ)圖片。如圖片下載完畢后,處理結(jié)果會(huì)以二元組的方式返回給函數(shù)。如圖片結(jié)果則圖片名稱如果想進(jìn)行更改,請(qǐng)參考使用框架的下載圖片如何保持原文件名呢
1.ImagesPipeline簡(jiǎn)介
Scrapy用ImagesPipeline類提供一種方便的方式來(lái)下載和存儲(chǔ)圖片。
特點(diǎn):
將下載圖片轉(zhuǎn)換成通用的JPG和RGB格式
避免重復(fù)下載
縮略圖生成
圖片大小過(guò)濾
當(dāng)使用圖片管道 ImagePipeline,典型的工作流程如下:
在一個(gè)爬蟲里,你抓取一個(gè)項(xiàng)目,把其中圖片的URL放入image_urls組內(nèi)。
項(xiàng)目從爬蟲內(nèi)返回,進(jìn)入項(xiàng)目管道。
當(dāng)項(xiàng)目進(jìn)入ImagePipeline, image_urls組內(nèi)的URLs將被Scrapy的調(diào)度器和下載器安排下載(這意味著調(diào)度器和中間件可以復(fù)用),當(dāng)優(yōu)先級(jí)更高,會(huì)在其他頁(yè)面被抓取前處理. 項(xiàng)目會(huì)在這個(gè)特定的管道階段保持"locker"的狀態(tài),直到完成圖片的下載(或者由于某些原因未完成下載)。
當(dāng)圖片下載完, 另一個(gè)組(images)將被更新到結(jié)構(gòu)中,這個(gè)組將包含一個(gè)字典列表,其中包括下載圖片的信息,比如下載路徑,源抓取地址(從image_urls組獲得)和圖片的校驗(yàn)碼. images列表中的圖片順序?qū)⒑驮磇mage_urls組保持一致.如果某個(gè)圖片下載失敗,將會(huì)記錄下錯(cuò)誤信息,圖片也不會(huì)出現(xiàn)在images組中。
項(xiàng)目目錄結(jié)構(gòu):
要想成功爬取圖片,需要經(jīng)過(guò)以下幾個(gè)步驟:
(1) 在items.py中添加image_urls、images和image_paths字段,代碼如下:class DoubanImgsItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() image_urls = Field() images = Field() image_paths = Field()(2)在settings.py中設(shè)置條件和屬性,代碼如下:
# Configure item pipelines # See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html # ImagePipeline的自定義實(shí)現(xiàn)類 ITEM_PIPELINES = { "douban_imgs.pipelines.DoubanImgDownloadPipeline": 300, } #設(shè)置圖片下載路徑 IMAGES_STORE = "D:doubanimgs" # 過(guò)期天數(shù) IMAGES_EXPIRES = 90 #90天內(nèi)抓取的都不會(huì)被重抓(3)在spiders/download_douban.py中書寫ImageSpider的代碼:
# coding=utf-8 from scrapy.spiders import Spider import re from scrapy import Request from ..items import DoubanImgsItem class download_douban(Spider): name = "download_douban" default_headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Encoding": "gzip, deflate, sdch, br", "Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6", "Cache-Control": "max-age=0", "Connection": "keep-alive", "Host": "www.douban.com", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36", } def __init__(self, url="1638835355", *args, **kwargs): self.allowed_domains = ["douban.com"] self.start_urls = [ "http://www.douban.com/photos/album/%s/" % (url)] self.url = url # call the father base function # super(download_douban, self).__init__(*args, **kwargs) def start_requests(self): for url in self.start_urls: yield Request(url=url, headers=self.default_headers, callback=self.parse) def parse(self, response): list_imgs = response.xpath("http://div[@class="photolst clearfix"]//img/@src").extract() if list_imgs: item = DoubanImgsItem() item["image_urls"] = list_imgs yield item(4)在pipelines.py中自定義ImagePipeline代碼:
# -*- 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.html from scrapy.pipelines.images import ImagesPipeline from scrapy.exceptions import DropItem from scrapy import Request from scrapy import log class DoubanImgsPipeline(object): def process_item(self, item, spider): return item class DoubanImgDownloadPipeline(ImagesPipeline): default_headers = { "accept": "image/webp,image/*,*/*;q=0.8", "accept-encoding": "gzip, deflate, sdch, br", "accept-language": "zh-CN,zh;q=0.8,en;q=0.6", "cookie": "bid=yQdC/AzTaCw", "referer": "https://www.douban.com/photos/photo/2370443040/", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36", } def get_media_requests(self, item, info): for image_url in item["image_urls"]: self.default_headers["referer"] = image_url yield Request(image_url, headers=self.default_headers) def item_completed(self, results, item, info): image_paths = [x["path"] for ok, x in results if ok] if not image_paths: raise DropItem("Item contains no images") item["image_paths"] = image_paths return item
在自定義ImagePipeline代碼中,作為重要的是要重載get_media_requests(self, item, info)和item_completed(self, results, item, info)這兩個(gè)函數(shù)。
get_media_requests(self,item, info):
ImagePipeline根據(jù)image_urls中指定的url進(jìn)行爬取,可以通過(guò)get_media_requests為每個(gè)url生成一個(gè)Request。如:
for image_url in item["image_urls"]: self.default_headers["referer"] = image_url yield Request(image_url, headers=self.default_headers)
item_completed(self, results, item, info):
圖片下載完畢后,處理結(jié)果會(huì)以二元組的方式返回給item_completed()函數(shù)。這個(gè)二元組定義如下:
(success, image_info_or_failure)
其中,第一個(gè)元素表示圖片是否下載成功;第二個(gè)元素是一個(gè)字典。如:
def item_completed(self, results, item, info): image_paths = [x["path"] for ok, x in results if ok] if not image_paths: raise DropItem("Item contains no images") item["image_paths"] = image_paths return item
運(yùn)行結(jié)果如下:
下載成功以后,你就會(huì)在剛才設(shè)置的保存圖片的路徑里看到下載完成的圖片:IMAGES_STORE = "D:doubanimgs"
默認(rèn)情況下,使用ImagePipeline組件下載圖片的時(shí)候,圖片名稱是以圖片URL的SHA1值進(jìn)行保存的。
如:
圖片URL:http://www.example.com/image.jpg
SHA1結(jié)果:3afec3b4765f8f0a07b78f98c07b83f013567a0a
則圖片名稱:3afec3b4765f8f0a07b78f98c07b83f013567a0a.jpg
如果想進(jìn)行更改,請(qǐng)參考:使用scrapy框架的ImagesPipeline下載圖片如何保持原文件名呢?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44408.html
摘要:百度云搜索,搜各種資料搜網(wǎng)盤,搜各種資料注意數(shù)據(jù)保存的操作都是在文件里操作的將數(shù)據(jù)保存為文件是一個(gè)信號(hào)檢測(cè)導(dǎo)入圖片下載器模塊定義數(shù)據(jù)處理類,必須繼承初始化時(shí)打開文件為數(shù)據(jù)處理函數(shù),接收一個(gè),里就是爬蟲最后來(lái)的數(shù)據(jù)對(duì)象文章標(biāo)題是 【百度云搜索,搜各種資料:http://www.bdyss.cn】 【搜網(wǎng)盤,搜各種資料:http://www.swpan.cn】 注意:數(shù)據(jù)保存的操作都是在p...
摘要:當(dāng)項(xiàng)目進(jìn)入,組內(nèi)的將被的調(diào)度器和下載器這意味著調(diào)度器和下載器的中間件可以復(fù)用安排下載,當(dāng)優(yōu)先級(jí)更高,會(huì)在其他頁(yè)面被抓取前處理。這個(gè)組將包含一個(gè)字典列表,其中包括下載文件的信息,比如下載路徑源抓取地址從組獲得和圖片的校驗(yàn)碼。 1. 最常見爬取圖片方法 對(duì)于圖片爬取,最容易想到的是通過(guò)urllib庫(kù)或者requests庫(kù)實(shí)現(xiàn)。具體兩種方法的實(shí)現(xiàn)如下: 1.1 urllib 使用urllib...
摘要:百度云搜索,搜各種資料搜網(wǎng)盤,搜各種資料編寫爬蟲文件循環(huán)抓取內(nèi)容方法,將指定的地址添加到下載器下載頁(yè)面,兩個(gè)必須參數(shù),參數(shù)頁(yè)面處理函數(shù)使用時(shí)需要方法,是庫(kù)下的方法,是自動(dòng)拼接,如果第二個(gè)參數(shù)的地址是相對(duì)路徑會(huì)自動(dòng)與第一個(gè)參數(shù)拼接導(dǎo) 【百度云搜索,搜各種資料:http://bdy.lqkweb.com】 【搜網(wǎng)盤,搜各種資料:http://www.swpan.cn】 編寫spiders爬...
摘要:很多人學(xué)習(xí)爬蟲的第一驅(qū)動(dòng)力就是爬取各大網(wǎng)站的妹子圖片,比如比較有名的。最后我們只需要運(yùn)行程序,即可執(zhí)行爬取,程序運(yùn)行命名如下完整代碼我已上傳到微信公眾號(hào)后臺(tái),在癡海公眾號(hào)后臺(tái)回復(fù)即可獲取。本文首發(fā)于公眾號(hào)癡海,后臺(tái)回復(fù)即可獲取最新編程資源。 showImg(https://segmentfault.com/img/remote/1460000016780800); 閱讀文本大概需要 1...
摘要:爬取百思不得姐首先一步一步來(lái),我們先從爬最簡(jiǎn)單的文本開始。將百思不得姐段子保存到中別忘了將管道加到配置文件中。雖然我只是簡(jiǎn)單的爬了百思不得姐,不過(guò)這些方法可以應(yīng)用到其他方面,爬取更多更有用的數(shù)據(jù)。 前一篇文章介紹了很多關(guān)于scrapy的進(jìn)階知識(shí),不過(guò)說(shuō)歸說(shuō),只有在實(shí)際應(yīng)用中才能真正用到這些知識(shí)。所以這篇文章就來(lái)嘗試?yán)胹crapy爬取各種網(wǎng)站的數(shù)據(jù)。 爬取百思不得姐 首先一步一步來(lái),我...
閱讀 3947·2021-10-19 13:23
閱讀 2326·2021-09-09 11:37
閱讀 2507·2019-08-29 15:20
閱讀 3407·2019-08-29 11:08
閱讀 1661·2019-08-26 18:27
閱讀 1764·2019-08-23 12:20
閱讀 3028·2019-08-23 11:54
閱讀 2544·2019-08-22 15:19