關於Scrapy框架

1、安裝:

在配置好Python3的環境以後,能夠在cmd或者編輯器的終端窗口裏使用pip3 list查看已安裝的Python模塊。
安裝scrapy框架:
Windows上:在cmd或者編輯器的終端窗口裏使用pip3 install scrapy,等待提示便可完成。輸入scrapy -v能夠查看版本以及幫助命令。如圖:
html

使用scrapy startproject projectname能夠建立爬蟲項目,建立完成以後會出現以下圖所示的文件結構:
注:紅色方框所標記的文件夾不會被建立,它與scrapy無關,只是在vscode中的一些運行配置文件,能夠忽略。

mySpider文件夾下面有一個spiders子文件夾和五個.py文件和一個.cfg文件。這裏對結構作一個簡要介紹。spiders文件夾下面是爬蟲文件,__init__.py爲此項目的模塊文件,默認爲空,暫時不用。items.py主要用來定義咱們須要獲取的數據。middlewares.py中間件文件,主要用來定義下載中間件和爬蟲中間件的內容。pipelines.py處理獲取到數據的文件。settings.py爲項目配置文件,能夠對項目進行一些自定義設置,好比開啓或者關閉中間件,日誌警告等級,啓用或者關閉pipelines,以及其優先級的設置,是否開啓cookies等。scrapy.cfg內的內容爲下圖: shell

默認爲本項目的 settings.py,項目爲建立的項目名稱。

使用 scrapy genspider spidername domain[starturl]能夠建立一個爬蟲,使用命令以後如圖:

使用scrapy crawl spidername能夠啓動爬蟲項目。瀏覽器

2、數據流向:

關於數據流向總體大體分爲5個部分:
一、Scheduler:常稱爲調度器,存放Requests對象,其中包括url地址、headerspost數據,cookies、代理等等。Scheduler會將Requests對象經過Engine發送到Downloader模塊進行處理。
二、Downloader:常稱爲下載器,此模塊在得到Requests對象以後會對服務器發送請求,而且獲得Response,隨後將Response經過Engine發送給Spiders模塊。
三、Spiders:此模塊用於提取所須要的數據,能夠分爲兩個部分。第一部分,提取urlheaderscookispost等數據組裝成Requests對象經過Engine發給調度器。第二部分,將提取到有用的數據經過Engine傳遞到Item Pipeline模塊。
四、Item Pipeline:將爬取到的數據列入一個隊列,另外是對爬取到的數據進行保存和其餘的一些操做。
五、Scrapy Engine:爲整個框架的調度,傳遞各個模塊之間的數據,使得其餘4個模塊相互獨立。除過Item Pipeline,每一個模塊會首先將數據傳給Scrapy Engine,而後由Scrapy Engine傳遞給下一個模塊。大體的數據流以下圖:
服務器

DownloaderEngine之間存在一個 Downloader Middlewares稱爲下載中間件,能夠對本身的 Requests請求做出一些修改,好比設置代理 IP,修改 UA等。在這裏 RequestsResponse都是通過這個組件的。

SpidersEngine之間存在着一個 Spider Middlewares稱爲爬蟲中間件,處理來自 DownloaderResponse,能夠對組成的 Requests對象進行一些過濾操做。在這裏 Spider Middlewares不對想要獲得的數據進行處理,由於有專門的 Item Pipeline模塊對想要獲得的數據進行處理。

3、各個模塊的介紹:

一、關於Scrapy Engine模塊,這一部分在項目創建的時候其實已經實現好了,不用咱們再去手動編寫,對於數據在各個模塊之間的流動,Scrapy Engine會自行進行調度。
二、調度器主要是處理來處理創建爬蟲開始的url地址和通過組裝以後的Requests對象,將其列成一個隊列,有序的送給Scrapy Engine交給下一個模塊。在傳遞給下載器以前會先通過下載中間件,若是開啓了Downloader Middlewares組件的話,對象會先通過這個組件進行處理,作出相應的自定義修改,而後給下載器想服務器發送請求。
三、下載器想服務器發送請求以後,服務器會給咱們一個響應,這個響應能夠經過response.text查看,返回的是一個網頁的源代碼(Ajax請求的方法可能另有不一樣),而後可使用正則或者Xpath選擇器對須要的數據進行提取。隨後將響應結果交還給Engine,再由Engine交給spider
四、在交給spider以前會有一個爬蟲中間件,默認是關閉狀態的。通常不用,並且在中間件中內置了一些方法,能夠在作出相應操做的時候對方法進行調用。在middlwares.py文件中有相應的模板。通過中間件以後就到了spider模塊了,這個地方是須要咱們編寫的,由於對於每次數據的獲取均可能不太同樣,因此要作出相應的改變。主要就是在咱們新建的爬蟲文件下的parse方法下進行處理獲得數據。本身能夠新建方法,可是這個方法不能被更名,並且是經過這個方法來將item數據傳給pipeline的。
五、pipeline模塊主要是對拿到的數據進行處理,而在settings.py文件中,pipeline模塊是默認關閉的,因此須要手動開啓。取消掉pipeline的註釋便可。pipeline裏的默認內容以下圖: cookie

而在 settings.py文件中有 ITEM_PIPELINES這個項目,而且是個字典,鍵爲一個 pipeline類,意味着在管道處理模塊能夠設置多個 pipeline來處理數據,一方面是處理來自不一樣爬蟲文件的數據,能夠經過爬蟲類的 name屬性來判斷是哪一個爬蟲,以此來作出相應的數據處理。另外一方面就是對於一個爬蟲來講能夠創建多個 pipeline來處理數據,假設一個 pipeline對數據進行處理,另一個 pipeline對數據進行保存工做。而這個字典的值就是當前 pipeline的優先級,數字越小說明優先級越高,就越早執行。
兩個中間件暫時不用,用到的時候再解釋。

4、關於所建立的爬蟲的結構和方法:

在使用scrapy genspider spidername以後,會在spider目錄下建立一個spidernamepy文件,這個文件就是須要編寫爬蟲的地方,在建立好了爬蟲文件以後如圖: 框架

這是一個 DtyySpider類,下面有三個屬性和一個方法,這個 parse方法就是處理來自引擎的 response。類的 name屬性爲這個爬蟲的名稱,以後可使用 scrapy crawl dytt能夠啓動當前爬蟲,固然這個屬性還能夠用來判斷是哪一個爬蟲,能夠在一個框架下面建立多個不一樣的爬蟲。經過 name屬性來判斷是哪一個爬蟲,而後能夠在 pipeline裏面對不一樣的爬蟲作相應的處理。

這裏建議使用scrapy shell url進行調試,這裏能夠調試本身的正則、CSSXpath等語句是否正確,查看是否能夠準確的提取到數據。而後再運行爬蟲便可,這樣作的好處是,在沒有配置IP池的狀況下,能夠不用對網址進行請求,防止請求屢次以後被網站禁封IP
dom

這裏先對咱們建立的爬蟲文件進行講解:

以前粗略的講過這個類裏面的屬性和方法,這裏詳細講解一下。
爬蟲如何建立以及建立以後默認內容是什麼上面已經說了。首先就是DyttSpider這個類,繼承的是scrapy.Spider這個類,有興趣的能夠看看源碼,這裏再也不多說。allowed_domains屬性就是這個爬蟲能夠爬取的域名範圍。start_urls就是這個爬蟲開始的url地址。下面的parse方法就是對返回結果進行處理的函數,並且返回結果保存在response裏面,咱們可使用正則、XpathCSS選擇器等方法提取到咱們想要的值。 這裏使用一個我本身作過的例子來說解:
我這裏是對電影天堂電影信息的爬取,大約200餘頁的電影信息。代碼如圖:異步



對於非Ajax請求的網址,reponse能夠返回咱們在網頁上看到的內容,經過一個按鈕會跳轉到另一個html頁面,一樣的仍是能夠在源代碼中看見網頁上的內容。
然而對於Ajax形式的請求,在網頁源代碼處不能直接看到,是經過js進行異步加載的,意思就是在瀏覽器地址欄的那個網址不是咱們須要請求的網址,真正的網址須要在開發者工具經過抓包找到,而後對真正的url地址進行請求。
這個時候對於新找到的url可能爲get請求,也可能爲post請求,要看清楚,而後再進行操做。scrapy

這個帖子主要是做爲本身的筆記用的,若是有人看更好,但願能幫到你吧! 我也是新手一枚,還請各位大佬多多批評指正。 將持續更新......
相關文章
相關標籤/搜索