Scrapy爬蟲實戰(2)

此文章繼上一篇《scrapy爬蟲框架的介紹,實戰》,通過爬蟲實戰,進一步理解,學習scrapy爬蟲框架。本文就以知名的技術博客Jobbole爲例,主要說一下和上一篇爬蟲實戰的有別之處

目標

爬取Jobbole網站的所有文章,並對信息進行處理保存。

分析

打開網頁http://blog.jobbole.com/all-posts/,分析網頁內容。

在文章列表頁面我們需要抓取紅框內的信息,並對文章詳細頁面進一步爬取,是的,這裏也要對圖片進行一個下載操作。

在文章詳細頁面,我們要提取文章的類型和文章的標籤,當然,如果有需要你也可以提取更多你需要的信息。這裏要注意,如下圖的文章。

可能會有評論數,或者多個標籤,我們就要進行一些處理,提取出我們想要的信息。至於如何定位到標籤,我就不多做闡述。


開始爬蟲8

先來看jobbolespider.py文件。

這裏我要說一下ItemLoader對象,在之前的爬蟲代碼中我們使用的是response.xpath()這種方法提取的數據,那既然可以使用這種方法,爲什麼還要用ItemLoader方法呢。相較於前者,後者的優勢在於簡化了代碼,更便於維護。當然,具體問題具體處理,兩種方法都是可行的,在合適的地方用合適的方法才能剛好的解決問題。又扯遠了,迴歸正題,我們繼續將ItemLoader。

ItemLoader對象的基本使用

#引入模塊
from scrapy.loader import ItemLoader

#實例化對象
loader=ItemLoader(item=* , response=* , selector=* )
#這裏有三個重要的參數
#item 就是你定義的存儲數據的item實例對象
#response 網頁的response對象
#selector 這個是選擇器對象

#方法
loader.add_xpath('item字段名', 'xpath規則')
loader.add_css('item字段名', 'css規則')
loader.add_value('item字段名', value值)

#通過此方法返回item對象
item=loader.load_item()

提取的數據不一定是我們最終需要的數據,我們還需要對數據進行進一步處理,而scrapy也爲我們提供瞭解決方案。

 

在items.py中,我們可以看到scrapy.Field()方法中有兩個參數,input_processor和output_processor,第一個參數是指定預處理方法,例如對數據進行正則運算。第二個參數是指定輸出方法,items的默認存儲方式是list,你可以使用內置的函數TakeFirst()方法以非list方式輸出。這裏說一下MapCompose()方法,他的參數是不確定的,就是說你可以指定多個處理方法。

這裏注意一下,指定的方法有一個value參數,這個就是提取的數據。

 

如果每個字段都需要用到一個方法處理,那麼一一去指定就太麻煩了。我們看一下ItemLoader類中有這麼幾行

 

我們是可以指定默認參數的,我們需要寫一類繼承ItemLoader類。

 

這時我們就不需要一一制定參數了,而當某一個字段不需要此方法處理時,另行指定output_processorc參數就行。 

我們再來說說如何下載圖片,scrapy爲我們提供了一個叫ImagesPipeline的類,我們需要在settings.py中進行如下設置。

設置完成後scrapy就會自動爲我們下載圖片。但是我們不僅要下載圖片,還要獲取圖片路徑信息,所以我們要換一種方式。我們需要在pipeline.py中聲明一個類並繼承ImagesPipeline類,在該類中重寫item_completed這個方法。直接看代碼

相應的在settings.py中的也要開啓此類

這裏需要特別提一下,在jobbolespider.py中解析時,我們是對兩類不同的頁面進行解析,相應的我們就要寫兩個解析函數。但是兩個頁面爬取的內容我們是需要放入同一個item對象裏的,這裏就需要將parse方法中實例化的Itemloader對象parse_detail方法中,在此方法的最後再yield item。

最後,就是對數據進行存儲至數據庫了。基本的存儲方法我就吧說了,這裏我要說的是以異步方式將數據存至數據庫。之前一篇文章中,存入數據庫是同步的,需要等待數據存儲完成才能繼續爬取數據,而爬蟲中,數據的爬取速度往往是大於存入數據庫的速度的,使用異步方式則大大提升了爬蟲的效率。

我們先來導入我們需要的模塊

再來就是先將數據庫信息寫入settings,py文件中,方便之後的操作

既然將到這裏就順帶提一下,scrapy的內置方法from_settings,但你在類中聲明瞭這個方法,他就會先於__init__調用此方法,其中一個參數settings,你可以通過字典的方式進行查詢,直接獲取字段的值,而cls參數,即你的自定義類對象。

然後我們繼續來看,首先我們要通過adbapi.ConnectionPool方法實例化對象。先來看一下他的參數

第一個參數就是你需要使用的操作數據庫的模塊名稱,而後面的參數就是數據庫的瞭解信息,以字典方法傳入

實例化對象後就可以對數據進行插入操作了

同樣的還是在process_item方法中進行實現

這樣我們就完成爬蟲,來看一下結果


好的,今天就這樣8,明天也要加油?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章