使用scrapy图片管道下载图片
前言
Scrapy是Python語(yǔ)言下一個(gè)十分流行的爬蟲框架,本文不對(duì)Scrapy本身做詳細(xì)介紹。有關(guān)Scrapy的安裝可以參考官網(wǎng)的安裝指南,不過(guò)本人更推薦使用Anaconda,Anaconda集成了Python和一系列常用的的Python庫(kù),當(dāng)然也包括Scrapy。安裝好Anaconda,基本上就可以直接使用Scrapy了,免去了一些麻煩的依賴的安裝。不過(guò)事情并非總是一帆風(fēng)順,我們依然有可能遇到一些錯(cuò)誤。本人首次使用Scrapy的時(shí)候,在操作無(wú)誤的情況下還是遇到了一個(gè)和dll文件相關(guān)的錯(cuò)誤,問題倒不大,直接把具體的錯(cuò)誤信息往google上一粘,很快就找到了解決辦法。用google!用google!用google!重要的事情說(shuō)三遍。
Scrapy是一個(gè)通用的爬蟲框架,可以爬取多種形式的數(shù)據(jù),不限于本文所講的圖片下載。關(guān)于Scrapy的工作流程、基本概念和簡(jiǎn)單例子可以參考官網(wǎng)的入門教程。對(duì)于網(wǎng)頁(yè)上圖片的爬取來(lái)說(shuō),Scrapy專門提供了一個(gè)item pipeline,叫做圖片管道。有關(guān)圖片管道的使用,官網(wǎng)上在下載項(xiàng)目圖片部分里也有所介紹,而本文旨在結(jié)合一個(gè)具體的例子更清晰地說(shuō)明如何使用Scrapy的圖片管道爬取一個(gè)網(wǎng)頁(yè)上的圖片。
大概流程
使用Scrapy爬數(shù)據(jù)的流程大概包括如下4步:
下面,我將詳細(xì)介紹如何通過(guò)以上4步來(lái)完成對(duì)圖片的爬取。
創(chuàng)建Scrapy項(xiàng)目
本人是在Windows7環(huán)境下進(jìn)行的一系列操作,使用Anaconda自帶的Scrapy,而且安裝Anaconda時(shí)也允許其將相關(guān)路徑加到了環(huán)境變量里,對(duì)于其他情況本人并未遇到過(guò),這里也不做進(jìn)一步的探討。先提一點(diǎn)題外話,打開cmd,輸入scrapy version命令可以查看當(dāng)前使用的scrapy的版本情況,注意是version而不是常見的–version,截圖如下:
使用Scrapy創(chuàng)建一個(gè)項(xiàng)目是要從命令行敲命令完成的,可以打開cmd,再cd到一個(gè)我們指定的路徑下,也可以直接在一個(gè)指定的空文件夾上按住shift鍵再右擊鼠標(biāo),然后在右鍵菜單里選擇“在此處打開命令行窗口”。無(wú)論怎樣,到了指定路徑后,鍵入命令scrapy startproject image(其中,image是我們項(xiàng)目的名稱),回車就可以創(chuàng)建項(xiàng)目了,如果成功的話,會(huì)出現(xiàn)大概如下圖所示情況:
然后到之前指定的文件夾(test)下,會(huì)發(fā)現(xiàn)多了一個(gè)image文件夾,這就是剛剛創(chuàng)建出來(lái)的。點(diǎn)進(jìn)image文件夾,會(huì)發(fā)現(xiàn)一個(gè)scrapy.cfg文件(項(xiàng)目配置文件,基本上不用管)和另一個(gè)image文件夾:
再點(diǎn)進(jìn)去,又會(huì)發(fā)現(xiàn)一些Python文件和一個(gè)spiders文件夾,這些是我們需要修改來(lái)完成爬取任務(wù)的主要文件:
定義Item
接下來(lái)就是要定義Item,也就是要爬取的目標(biāo)。從上圖可以看到,items.py文件在創(chuàng)建項(xiàng)目時(shí)已經(jīng)生成好了,但是里面并沒有實(shí)質(zhì)性的內(nèi)容,我們需要對(duì)它進(jìn)行修改,代碼如下:
import scrapy class ImageItem(scrapy.Item):image_urls = scrapy.Field()images = scrapy.Field()image_paths = scrapy.Field()因?yàn)槲覀円廊D片,所以在ImageItem類里定義了圖片的url(image_urls)、圖片的實(shí)際內(nèi)容(images)以及圖片的保存路徑(image_paths)。如果除圖片本身外還需要一些其他的信息,比如對(duì)圖片的描述,只要是要爬取的網(wǎng)頁(yè)中有相關(guān)內(nèi)容,這里就可以進(jìn)行定義,而實(shí)際的爬數(shù)據(jù)的代碼要在spider類里編寫。在Scrapy中,一個(gè)Item的所有成員變量都是用scrapy.Field()來(lái)初始化的。
編寫爬蟲
之前提到的目錄結(jié)構(gòu)中,有一個(gè)spiders文件夾,這是放爬蟲文件的地方,初始時(shí),里面只有一個(gè)__init__.py文件,所以我們首先需要?jiǎng)?chuàng)建一個(gè)特定的爬蟲文件。在命令行中,cd到這個(gè)文件夾下,使用scrapy gensipder myimage https://tianqi.moji.com/liveview/ 命令來(lái)創(chuàng)建出spider文件,其中,myimage是spider的文件名,而第二個(gè)參數(shù)是一個(gè)網(wǎng)址,代表allowed_domains。allowed_domains是搜索的域名范圍,也就是爬蟲的約束區(qū)域,規(guī)定爬蟲只爬取這個(gè)域名下的網(wǎng)頁(yè)。使用命令創(chuàng)建spider文件截圖如下:
創(chuàng)建出的spider文件具體內(nèi)容如下:
import scrapyclass MyimageSpider(scrapy.Spider):name = "myimage"allowed_domains = ["https://tianqi.moji.com/liveview/"]start_urls = ('http://www.https://tianqi.moji.com/liveview//',)def parse(self, response):pass可以看到,類名以及其中的一些固定的成員變量都自動(dòng)生成好了,類名和name變量(爬蟲的唯一標(biāo)識(shí))都是根據(jù)命令中的文件名創(chuàng)建出來(lái)的,而allowed_domains和start_urls是根據(jù)第二個(gè)參數(shù)創(chuàng)建的。start_urls就是我們要爬取的網(wǎng)址,它默認(rèn)是和allowed_domains一樣,不過(guò),我們這里需要對(duì)其進(jìn)行一下修改,改成一個(gè)更具體的網(wǎng)址,而不是一個(gè)域名約束范圍。
parse函數(shù)是進(jìn)行網(wǎng)頁(yè)內(nèi)容爬取的主要函數(shù),起始時(shí)它沒有函數(shù)體(僅有個(gè)pass而已),針對(duì)自己的任務(wù),我們要對(duì)這個(gè)文件做特異的編寫,修改parse函數(shù)前,首先要import我們之前定義的item類,修改過(guò)的spider文件代碼如下:
注意,代碼中我確實(shí)修改了start_urls(關(guān)于墨跡天氣時(shí)景的一個(gè)具體網(wǎng)址)。在parse函數(shù)中,首先創(chuàng)建一個(gè)item對(duì)象,然后就是解析html網(wǎng)頁(yè),爬取我們想要的內(nèi)容,在這里我們想要的是網(wǎng)頁(yè)中圖片的地址。Scrapy使用xpath語(yǔ)法來(lái)解析html,可以是說(shuō)這是使用scrapy做爬蟲的一個(gè)非常核心的部分,所以如果想實(shí)現(xiàn)自己的爬蟲,還必須了解xpath,推薦學(xué)習(xí)w3school的XPath教程。另外,還要對(duì)要爬取的網(wǎng)頁(yè)做一定的源碼分析(網(wǎng)頁(yè)中點(diǎn)鼠標(biāo)右鍵,選查看網(wǎng)頁(yè)源代碼),這樣才能針對(duì)要爬取的內(nèi)容寫出真正能起作用的xpath語(yǔ)句。parse函數(shù)最后我們將item對(duì)象返回即可,Scrapy框架下自會(huì)有其他函數(shù)來(lái)調(diào)用它。圖片的保存路徑不屬于爬蟲本身管轄的范圍,在parse函數(shù)里不用管,而圖片的實(shí)際內(nèi)容也是在爬蟲實(shí)際運(yùn)行起來(lái)后,由Scrapy來(lái)負(fù)責(zé)的,這里也不用額外處理。
編寫Item Pipeline 文件
在創(chuàng)建項(xiàng)目時(shí),會(huì)自動(dòng)生成一個(gè)pipelines.py文件,里面包含一個(gè)ItemPipeline類,這個(gè)類是用來(lái)處理爬蟲爬取到的item的,比如丟掉一些錯(cuò)誤的item等等。本文之前講的東西其實(shí)和本文的主題并沒有特別緊密的關(guān)系,前面的流程幾乎適用于爬任何數(shù)據(jù)。而使用Scrapy圖片管道下載圖片從這里開始有點(diǎn)不一樣了。由于Scrapy為我們提供好了一個(gè)ImagesPipeline(圖片管道),所以最簡(jiǎn)單的圖片下載方式可以不用對(duì)生成的pipelines.py文件做任何修改,只需配置settings.py(也是創(chuàng)建項(xiàng)目時(shí)自動(dòng)生成)文件即可。settings.py文件中需加入以下信息:
ITEM_PIPELINES = {'scrapy.contrib.pipeline.images.ImagesPipeline': 1 }IMAGES_STORE = 'D:\\pachong\\images\\' IMAGES_EXPIRES = 90 IMAGES_MIN_HEIGHT = 100 IMAGES_MIN_WIDTH = 100其中,ITEM_PIPELINES = { ‘scrapy.contrib.pipeline.images.ImagesPipeline’: 1}指定了使用Scrapy提供的ImagesPipeline來(lái)做ItemPipeline。IMAGES_EXPIRES指定的是圖片的過(guò)期時(shí)間。IMAGES_STORE 指定了圖片的存儲(chǔ)路徑,IMAGES_MIN_HEIGHT和IMAGES_MIN_HEIGHT分別指定圖片的最小高度和最小寬度,起到一個(gè)過(guò)濾的作用。settings.py還有一個(gè)地方要改,那就是把ROBOTSTXT_OBEY由True改成False。否則,一些防爬蟲爬數(shù)據(jù)的頁(yè)面可能會(huì)拒絕請(qǐng)求,本人遇到的情況如下圖所示:
Scrapy默認(rèn)遵守robot協(xié)議,也就是ROBOTSTXT_OBEY的初值為True。但是遇到防爬取頁(yè)面,就會(huì)碰壁。
最后就是實(shí)際運(yùn)行爬蟲爬數(shù)據(jù)了,在命令行中,cd到我們之前創(chuàng)建的項(xiàng)目路徑下,鍵入scrapy crawl myimage命令,回車即可開始工作。myimage就是爬蟲文件的文件名,也是文件中name變量對(duì)應(yīng)的值。運(yùn)行結(jié)果如下:
爬蟲工作完之后,我們會(huì)在settings.py指定的存儲(chǔ)文件夾下,看到剛下載到的圖片:
總結(jié)
到此,使用Scrapy提供的圖片管道下載圖片的整個(gè)流程就介紹完了。如果還想對(duì)這些圖片做一些額外的處理,比如規(guī)定它們的文件名,那就需要實(shí)現(xiàn)定制圖片管道了,本文就不對(duì)這部分做介紹了,可以參考官網(wǎng)下載項(xiàng)目圖片或者其他博客,比如這篇scrapy 下載圖片 ImagesPipeline。記得要在settings.py文件中將ITEM_PIPELINES設(shè)為自己的ItemPipeline。
總結(jié)
以上是生活随笔為你收集整理的使用scrapy图片管道下载图片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果Mac延时摄影视频制作工具:Pers
- 下一篇: Python基础07