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