一、預備知識
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 # 該傳回值會傳遞給下一個即将被執行的管道類