天天看點

Python爬蟲—scrapy架構八、圖檔資料爬取之ImagesPipeline

一、預備知識

1.、什麼是架構?

        就是一個內建了很多功能,并且具有很強通用性的一個項目模版。

2.、如何學習架構?

        專門學習架構封裝的各種功能的詳細用法。

3.、什麼是scrapy?

        爬蟲中封裝好的明星架構。功能:高性能的持久化存儲,異步的資料下載下傳,高性能的資料解析,分布式。

二、scrapy架構的基本使用

        —環境的安裝:—mac or linux:pip install scrapy

步驟1:建立一個工程:scrapy startproject xxxPro

步驟2:cd xxxPro

步驟2:在spiders子目錄中建立一個爬蟲檔案

—scrapy genspider spiderName  www.xxx.com

步驟3:執行工程:scrapy crawl spiderName 

三、scrapy資料解析

xpath傳回的是清單,但是清單元素一定是Selector類型的對象。

extract可以将Selector對象中的data參數存儲的字元串提取出來。

清單調用了extract之後,則表示将清單中每一個Selector對象中data對應的字元串提取了出來。

四、scrapy持久化存儲

方式1:基于終端指令:

        —要求:隻可以将parse方法的傳回值存儲到本地的文本檔案中

        —終端輸入指令:scrapy crawl 檔案名 -o ./持久化存儲的檔案名.csv  

        —注意:基于終端持久化存儲對應的文本檔案的類型隻可以為:‘json’,‘jsonlines’,‘jl’,‘csv’,‘xml’,‘marshal’,‘pickle’).

        —優點:簡潔高效便捷

        —缺點:局限性較強(資料隻可以存儲到指定字尾的文本檔案中)

方式2:基于管道:(pipelines)

1、編碼流程:

        -步驟1:資料解析

        -步驟2:在item類中定義相關屬性

        -步驟3:将解析的資料封裝存儲到item類型的對象中

        -步驟4:将item類型的對象送出給管道進行持久化存儲操作(yield item)

        -步驟5:在管道類的process_item中要将其接收到的item對象中存儲的資料進行持久化存儲

        -步驟6:在配置檔案中開啟管道(ITEM_PINELINES = {‘管道檔案中的管道類’:300 , })#300表示的是優先級,數值越小,優先級越高。

2、優點:通用性強

五、基于Spider的全站資料爬取

        就是将網站中某闆塊下的全部頁碼對應頁碼資料進行爬取

實作方式:

        —将所有頁面的url添加到start_urls清單中(不推薦)

        —自行手動進行請求發送(推薦)

                yield scrapy.Request(url,callback)     callback專門用做資料解析

六、五大核心元件

        引擎、spider、下載下傳器、排程器、管道

        Spider->引擎->排程器->引擎->下載下傳器—>網際網路->下載下傳器->引擎->spider(parse方法)->item給引擎->管道持久化存儲

1、引擎(Scrapy):

         用來處理整個系統的資料流處理,觸發事務(架構核心)

2、排程器(Scheduler):

        排程器由過濾器和隊列兩部分組成。過濾器會将重複的對象進行過濾,進而存儲到隊列中。

        用來接受引擎發過來的請求,壓入隊列中,并在引擎再次請求的時候傳回,可以想象成一個url(抓取頁面的網址或者說是連結)的優先隊列,由它來決定下一個要抓取的網址是什麼,同時去除重複的網址。

3、下載下傳器(Downloader):

        用于下載下傳頁面内容,并将網頁内容傳回給蜘蛛(Scrapy下載下傳器是建立在twisted這個高效的異步模型上的)

4、爬蟲(Spiders):産生url,對url進行手動發送;進行資料解析。

        爬蟲是主要幹活的,用于從特定的網頁中提取自己需要的資訊,即所謂的實體(Item)。使用者也可以讓Scrapy繼續抓取下一個頁面。

5、項目管道(Pipeline):持久化存儲

        負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證明體的有效性、清除不需要的資訊。當頁面被爬蟲解析後,将被發送到項目管道,并經過幾個特定的次序處理資料。

七、請求傳參

使用場景:如果爬取解析的資料不在同一張頁面中。(深度爬取)

八、圖檔資料爬取之ImagesPipeline

基于scrapy爬取字元串類型的資料和爬取圖檔類型的資料差別?

        —字元串:隻需要基于xpath進行解析且送出管道進行持久化存儲

        —圖檔:xpath解析出圖檔src的屬性值。單獨的對圖檔位址發起請求擷取圖檔二進制類型的資料

ImagePipeline:

        隻需要将img的src的屬性值進行解析,送出到管道,管道就會對圖檔的src進行請求發送擷取圖檔的二進制類型的資料,且還會幫我們進行持久化存儲。

使用流程:

        —資料解析(圖檔的位址)

        —将存儲圖檔位址的item送出到指定的管道類

        —在管道檔案中自定制一個基于ImagesPipeLine的一個管道類

                def get_media_requests(self,item,info):

                def file_path(self,request,response=None,info=None)

                def item_completed(self,results,item,info):

        —在配置檔案中:

                指定圖檔存儲的目錄:IMAGES_STORE = ‘./imgs_bobo’

                指定開啟的管道類:自定制的管道類

        —在配置檔案中進行如下配置:

 IMAGES_STORE = ‘√imgs’:表示最終圖檔存儲的目錄
           

        —管道類的編寫:

from scapy.piplelines.images import ImagesPipeline

import scrapy

class ImgproPipeline(object):

Item = None

def process_item(self,item,spider):

return item 

#ImagesPipeline專門用于檔案下載下傳的管道類,下載下傳過程支援異步和多線程

class ImgPipeLine(ImagesPipeline):

# 對item中的圖檔進行請求操作

def get_media_requests(self,item,info):

yield scrapy.Request(item[ ‘src’ ])



# 定制圖檔的名稱

def file_path(self,request,response=None,info=None)

url = request.url

file_name = url.split(‘/’)[-1]

return file_name



def item_completed(self,results,item,info):

return item # 該傳回值會傳遞給下一個即将被執行的管道類