摘要:當(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. 最常見(jiàn)爬取圖片方法
對(duì)于圖片爬取,最容易想到的是通過(guò)urllib庫(kù)或者requests庫(kù)實(shí)現(xiàn)。具體兩種方法的實(shí)現(xiàn)如下:
1.1 urllib使用urllib.request.urlretrieve方法,通過(guò)圖片url和存儲(chǔ)的名稱完成下載。
""" Signature: request.urlretrieve(url, filename=None, reporthook=None, data=None) Docstring: Retrieve a URL into a temporary location on disk. Requires a URL argument. If a filename is passed, it is used as the temporary file location. The reporthook argument should be a callable that accepts a block number, a read size, and the total file size of the URL target. The data argument should be valid URL encoded data. If a filename is passed and the URL points to a local resource, the result is a copy from local file to new file. Returns a tuple containing the path to the newly created data file as well as the resulting HTTPMessage object. File: ~/anaconda/lib/python3.6/urllib/request.py Type: function """
參數(shù) finename 指定了保存本地路徑(如果參數(shù)未指定,urllib會(huì)生成一個(gè)臨時(shí)文件保存數(shù)據(jù)。)
參數(shù) reporthook 是一個(gè)回調(diào)函數(shù),當(dāng)連接上服務(wù)器、以及相應(yīng)的數(shù)據(jù)塊傳輸完畢時(shí)會(huì)觸發(fā)該回調(diào),我們可以利用這個(gè)回調(diào)函數(shù)來(lái)顯示當(dāng)前的下載進(jìn)度。
參數(shù) data 指 post 到服務(wù)器的數(shù)據(jù),該方法返回一個(gè)包含兩個(gè)元素的(filename, headers)元組,filename 表示保存到本地的路徑,header 表示服務(wù)器的響應(yīng)頭。
使用示例:
request.urlretrieve("https://img3.doubanio.com/view/photo/photo/public/p454345512.jpg", "kids.jpg")
但很有可能返回403錯(cuò)誤(Forbidden),如:http://www.qnong.com.cn/uploa...。Stack Overflow指出原因:This website is blocking the user-agent used by urllib, so you need to change it in your request.
給urlretrieve加上User-Agent還挺麻煩,方法如下:
import urllib opener = request.build_opener() headers = ("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0") opener.addheaders = [headers] request.install_opener(opener) request.urlretrieve("http://www.qnong.com.cn/uploadfile/2016/0416/20160416101815887.jpg", "./dog.jpg")1.2 requests
使用requests.get()獲取圖片,但要將參數(shù)stream設(shè)為True。
import requests req = requests.get("http://www.qnong.com.cn/uploadfile/2016/0416/20160416101815887.jpg", stream=True) with open("dog.jpg", "wb") as wr: for chunk in req.iter_content(chunk_size=1024): if chunk: wr.write(chunk) wr.flush()
requests添加User-Agent也很方便,使用headers參數(shù)即可。
Scrapy 自帶 ImagesPipeline 和 FilePipeline 用于圖片和文件下載,最簡(jiǎn)單使用 ImagesPipeline 只需要在 settings 中配置。
# settings.py ITEM_PIPELINES = { "scrapy.pipelines.images.ImagesPipeline": 500 } IMAGES_STORE = "pictures" # 圖片存儲(chǔ)目錄 IMAGES_MIN_HEIGHT = 400 # 小于600*400的圖片過(guò)濾 IMAGES_MIN_WIDTH = 600
# items.py import scrapy class PictureItem(scrapy.Item): image_urls = scrapy.Field()
# myspider.py from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from ..items import BeePicture class PicSpider(CrawlSpider): name = "pic" allowed_domains = ["qnong.com.cn"] start_urls = ["http://www.qnong.com.cn/"] rules = ( Rule(LinkExtractor(allow=r".*?", restrict_xpaths=("http://a[@href]")), callback="parse_item", follow=True), ) def parse_item(self, response): for img_url in response.xpath("http://img/@src").extract(): item = PictureItem() item["image_urls"] = [response.urljoin(img_url)] yield item2.2 自定義 Pipeline
默認(rèn)情況下,使用ImagePipeline組件下載圖片的時(shí)候,圖片名稱是以圖片URL的SHA1值進(jìn)行保存的。
如:
圖片URL: http://www.example.com/image.jpg
SHA1結(jié)果:3afec3b4765f8f0a07b78f98c07b83f013567a0a
則圖片名稱:3afec3b4765f8f0a07b78f98c07b83f013567a0a.jpg
想要以自定義圖片文件名需要重寫(xiě) ImagesPipeline 的file_path方法。參考:https://doc.scrapy.org/en/lat...。
# settings.py ITEM_PIPELINES = { "qnong.pipelines.MyImagesPipeline": 500, }
# items.py import scrapy class PictureItem(scrapy.Item): image_urls = scrapy.Field() images = scrapy.Field() image_paths = scrapy.Field()
# myspider.py from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from ..items import BeePicture class PicSpider(CrawlSpider): name = "pic" allowed_domains = ["qnong.com.cn"] start_urls = ["http://www.qnong.com.cn/"] rules = ( Rule(LinkExtractor(allow=r".*?", restrict_xpaths=("http://a[@href]")), callback="parse_item", follow=True), ) def parse_item(self, response): for img_url in response.xpath("http://img/@src").extract(): item = PictureItem() item["image_urls"] = [response.urljoin(img_url)] yield item
# pipelines.py from scrapy.exceptions import DropItem from scrapy.pipelines.images import ImagesPipeline import scrapy class MyImagesPipeline(ImagesPipeline): def get_media_requests(self, item, info): for img_url in item["image_urls"]: yield scrapy.Request(img_url) 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 def file_path(self, request, response=None, info=None): image_guid = request.url.split("/")[-1] return "full/%s" % (image_guid)2.3 FilesPipeline 和 ImagesPipeline 工作流程
FilesPipeline
在一個(gè)爬蟲(chóng)里,你抓取一個(gè)項(xiàng)目,把其中圖片的URL放入 file_urls 組內(nèi)。
項(xiàng)目從爬蟲(chóng)內(nèi)返回,進(jìn)入項(xiàng)目管道。
當(dāng)項(xiàng)目進(jìn)入 FilesPipeline,file_urls 組內(nèi)的 URLs 將被 Scrapy 的調(diào)度器和下載器(這意味著調(diào)度器和下載器的中間件可以復(fù)用)安排下載,當(dāng)優(yōu)先級(jí)更高,會(huì)在其他頁(yè)面被抓取前處理。項(xiàng)目會(huì)在這個(gè)特定的管道階段保持“l(fā)ocker”的狀態(tài),直到完成文件的下載(或者由于某些原因未完成下載)。
當(dāng)文件下載完后,另一個(gè)字段(files)將被更新到結(jié)構(gòu)中。這個(gè)組將包含一個(gè)字典列表,其中包括下載文件的信息,比如下載路徑、源抓取地址(從 file_urls 組獲得)和圖片的校驗(yàn)碼(checksum)。 files 列表中的文件順序?qū)⒑驮?file_urls 組保持一致。如果某個(gè)圖片下載失敗,將會(huì)記錄下錯(cuò)誤信息,圖片也不會(huì)出現(xiàn)在 files 組中。
ImagesPipeline
在一個(gè)爬蟲(chóng)里,你抓取一個(gè)項(xiàng)目,把其中圖片的 URL 放入 images_urls 組內(nèi)。
項(xiàng)目從爬蟲(chóng)內(nèi)返回,進(jìn)入項(xiàng)目管道。
當(dāng)項(xiàng)目進(jìn)入 Imagespipeline,images_urls 組內(nèi)的URLs將被Scrapy的調(diào)度器和下載器(這意味著調(diào)度器和下載器的中間件可以復(fù)用)安排下載,當(dāng)優(yōu)先級(jí)更高,會(huì)在其他頁(yè)面被抓取前處理。項(xiàng)目會(huì)在這個(gè)特定的管道階段保持“l(fā)ocker”的狀態(tài),直到完成文件的下載(或者由于某些原因未完成下載)。
當(dāng)文件下載完后,另一個(gè)字段(images)將被更新到結(jié)構(gòu)中。這個(gè)組將包含一個(gè)字典列表,其中包括下載文件的信息,比如下載路徑、源抓取地址(從 images_urls 組獲得)和圖片的校驗(yàn)碼(checksum)。 images 列表中的文件順序?qū)⒑驮?images_urls 組保持一致。如果某個(gè)圖片下載失敗,將會(huì)記錄下錯(cuò)誤信息,圖片也不會(huì)出現(xiàn)在 images 組中。
Scrapy 不僅可以下載圖片,還可以生成指定大小的縮略圖。
Pillow 是用來(lái)生成縮略圖,并將圖片歸一化為 JPEG/RGB 格式,因此為了使用圖片管道,你需要安裝這個(gè)庫(kù)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/38687.html
摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:前篇全片都是生硬的理論使用,今天就放個(gè)靜態(tài)爬取的實(shí)例讓大家體驗(yàn)一下的使用,了解一些背后的原理。給出網(wǎng)站打開(kāi)右鍵檢查第一個(gè)電影,分析源碼先,發(fā)現(xiàn)每個(gè)標(biāo)簽就對(duì)應(yīng)著一個(gè)電影的信息。 前篇全片都是生硬的理論使用,今天就放個(gè)靜態(tài)爬取的實(shí)例讓大家體驗(yàn)一下BeautifulSoup的使用,了解一些背后的原理。 順便在這引入靜態(tài)網(wǎng)頁(yè)的概念——靜態(tài)網(wǎng)頁(yè)是指一次性加載所有內(nèi)容的網(wǎng)頁(yè),爬蟲(chóng)一次請(qǐng)求便能得到所...
摘要:在這之前,還是有必要對(duì)一些概念超輕量級(jí)反爬蟲(chóng)方案后端掘金前言爬蟲(chóng)和反爬蟲(chóng)日益成為每家公司的標(biāo)配系統(tǒng)。 爬蟲(chóng)修煉之道——從網(wǎng)頁(yè)中提取結(jié)構(gòu)化數(shù)據(jù)并保存(以爬取糗百文本板塊所有糗事為例) - 后端 - 掘金歡迎大家關(guān)注我的專題:爬蟲(chóng)修煉之道 上篇 爬蟲(chóng)修煉之道——編寫(xiě)一個(gè)爬取多頁(yè)面的網(wǎng)絡(luò)爬蟲(chóng)主要講解了如何使用python編寫(xiě)一個(gè)可以下載多頁(yè)面的爬蟲(chóng),如何將相對(duì)URL轉(zhuǎn)為絕對(duì)URL,如何限速,...
摘要:流程作為上述過(guò)程的一個(gè)演示,我們使用的網(wǎng)址為頁(yè)面如下在表單中輸入德國(guó),跳轉(zhuǎn)后的頁(yè)面如下我們可以發(fā)現(xiàn),在搜索的結(jié)果中,會(huì)出現(xiàn)德國(guó)這個(gè)搜索結(jié)果。點(diǎn)擊該搜索結(jié)果,跳轉(zhuǎn)后的頁(yè)面如下在這個(gè)頁(yè)面中有我們需要的德國(guó)的國(guó)旗。 介紹 ??本篇博客將會(huì)介紹一個(gè)Python爬蟲(chóng),用來(lái)爬取各個(gè)國(guó)家的國(guó)旗,主要的目標(biāo)是為了展示如何在Python的requests模塊中使用POST方法來(lái)爬取網(wǎng)頁(yè)內(nèi)容。??為了知道...
摘要:本篇就來(lái)教大家如何使用來(lái)爬取這些精美的英雄皮膚。有了英雄編號(hào)的對(duì)應(yīng)關(guān)系,再找尋下英雄皮膚的鏈接規(guī)律。將圖片保存下來(lái),并以英雄名稱皮膚序號(hào)方式命名效果展示最終的爬取效果如下圖所示。 showImg(https://segmentfault.com/img/remote/1460000018627654); 0.引言 作為一款現(xiàn)象級(jí)游戲,王者榮耀,想必大家都玩過(guò)或聽(tīng)過(guò),游戲里中各式各樣的英...
閱讀 3054·2021-11-22 15:29
閱讀 1732·2021-10-12 10:11
閱讀 1761·2021-09-04 16:45
閱讀 2242·2021-08-25 09:39
閱讀 2793·2021-08-18 10:20
閱讀 2516·2021-08-11 11:17
閱讀 451·2019-08-30 12:49
閱讀 3314·2019-08-30 12:49