2014年12月13日 星期六

[Python][教學] Scrapy(Web Crawler) to PostgreSQL(一)簡介 & 網路爬蟲基本設定


        Scrapy是python上很受歡迎的爬網框架,官方網站為:http://doc.scrapy.org/en/latest/index.html.介紹Scrapy的網站很多,官網自己就寫得很清楚,一些中文化的資料可參考像是http://www.addbook.cn/book/scrapy中文手册等資料.今天主要介紹的是爬網之後的動作.爬網並不是單純爬文而已,而是為了提供之後進一步的分析,所以資料都必須儲存下來,儲存的方式有很多種,可以單純是個file,再由分析軟體來處理資料,或是把資料放在資料庫中,做進一步的分析.


        之前所做的爬網專案,爬網下來後的資料是轉成csv檔後丟給R做分析,分析後直接產生report.但是這樣的方式卻有個缺點--資料難以再利用.為了加強資料可利用性以及爬網的彈性,所以開始嘗試使用JSON之類的NOSQL方案來儲存爬網資料.格式決定了,那資料庫呢?知名的NOSQL DB像是Mongo等都在考慮範圍內,但是如果RDB資料放一個DB,NOSQL資料又放一個DB這樣子徒增資料串連的困擾,幸好一些傳統RDB資料庫也開始支援NOSQL的格式,其中處理的不錯,又是開源軟體,同時也是公司使用的企業DB,在這樣的交集之下,選擇了postgreSQL來作為存放爬網資料的首選.

        爬網框架確定,資料格式確定,DB確定,接下來就是把這三個東西兜在一起.

         這個裡面放了主要的爬蟲程式,包括網址,parsing路徑以及方法:
  • import項目:
        就是按照官網教學,把該import的東西import進來.items是上一層目錄放的檔案,裡面的Item為items.py中的主要物件,設定了輸出的欄位.
  • Class宣告:
        這邊是主程式的內容,宣告物件名稱的時候,需要繼承一個Spider,Scrapy提供了各種Spider可以用(http://doc.scrapy.org/en/latest/topics/spiders.html#spider-arguments).我目前使用的是最基本的Spider,還有CrawlSpider等其他厲害的爬蟲可以設定.
這邊我設定了三個值:
  1. name:crawler的名字,在呼叫時需要用到
  2. allowed_domains:要爬哪個網域
  3. start_urls:初始要爬的網址,每個網址會產生不同的response往下面丟,我這邊是用迴圈控制要爬的頁面數量.
  • 方法宣告:
  1. parse():在start_urls爬下來的網頁會變成response丟到parse()裡面去,其實在parse裡面就可以設定parsing,但是我是參考別人把這兩塊分開,所以利用callback呼叫了parse_profile,把真正的parsing部分放在後面.
  2. parse_profile():這邊放了要parsing的資料,因為只是一個小POC,所以沒有太複雜的結構,單純的把爬下來的東西丟回item,item是在items.py中設定的欄位.
  3. 比較值得注意的是item['total']這個欄位,因為目標是要在DB中儲存JSON檔案,而postregSQL中,JSON格式的檔案是佔一個欄位,所以我特別將欄位拉出來,直接把整個item物件轉成dictionary格式丟進去.(因為Scrapy在設計item物件來存放資料時,就是使用key-value pair的方式來儲存資料,可以直接轉換成dictionary)

原本想說基本設定官方說明很清楚,沒有打算扯太多,沒想到還是想得太細節...只好分段落補完了.整個程式不長,花最多時間的還是在處理encoding的事情...orz