怎樣利用數據爬取和分析工具寫出《黃燜雞米飯是怎麼火起來的》這樣的文章?
《黃燜雞米飯是怎麼火起來的》地址:黃燜雞米飯是怎麼火起來的?
去年開始研究做爬蟲,搞了一套分散式的爬蟲系統,主要目標是幫別人做數據採集。後來看到黃燜雞米飯是怎麼火起來的? - 何明科的回答,進而關注了《數據冰山》,發現裡面的大數據分析的文章都相當有意思,圖表也一個比一個專業。我當時的表情大約是這樣的:
我的天哪,這麼神奇嗎? 放下手機,操起鍵盤,正準備也搞上一篇 「大數據分析:郭德綱和女演員的相愛相殺之後,wuli濤濤是如何火起來的」。後來轉念一想,這不是赤果果的抄襲了,媽媽是怎麼教導我的。再說了,以我這樣的實力,寫了這樣的文章,以後別人還怎麼寫呢?
俗話說得好:授人以魚不如授人以漁,獨樂樂不如眾樂樂。不如我們就以黃燜雞米飯為例,給大家講講如何才能寫出這樣一篇圖文並茂的分析文章來吧。
先來一段硬廣:本文所有代碼,都需要運行在本人搭建的神箭手雲爬蟲框架上,打算完全自己寫爬蟲的同學,領會精神即可。
- 數據來源分析
首先需要黃燜雞米飯門店的創建時間,來分析黃燜雞米飯隨時間的增長,其次需要門店的地域信息來分析不同地域黃燜雞米飯的增長情況。
分析大眾點評的商戶門店信息,可以在商戶的貢獻榜頁面找到相關的信息,如下圖:
這裡需要對數據作幾個近似處理:
- 僅選取商戶名中包含"黃燜雞米飯"的門店
- 將商戶的添加時間近似看作門店的創建時間
- 大眾點評無法查到已經關閉的商戶,所以這裡不考慮門店的關閉,僅選取現存的門店
- 開始寫爬蟲
上面分析了對數據的需求,下面就開始動手寫爬蟲爬取數據啦~
熟悉爬蟲的人都知道,一個爬蟲的基本工作流程是:
- 首先挑選一部分種子URL(也可以叫入口URL),並放入到待爬隊列中
- 從待爬隊列中取出一個URL,下載內容並從中抽取信息,同時發現新URL,並加入到待爬隊列中。重複此步驟,直至待爬隊列為空。
上面加粗了3個重點,種子URL、抽取信息和發現新URL。
- 種子URL
也可以叫入口URL,爬蟲以這些URL為入口,以某種規則發現新的URL,最終爬遍所有想要的網頁。為了爬取高效,我決定直接用大眾點評的搜索,選擇大眾點評的搜索結果頁作為入口URL,爬取結果頁的所有商戶並篩選後作為樣本數據。大眾點評的搜索也是分區域的,要把所有區域的搜索結果頁都作為入口URL,形如
http://www.dianping.com/search/keyword/{region_id}/0_%E9%BB%84%E7%84%96%E9%B8%A1%E7%B1%B3%E9%A5%AD
其中region_id從1到2323(很容易可以發現此範圍內是中國的區域,數字再大就到國外了,如果多了或者少了請告訴我)。
- 抽取信息
從網頁中抽取信息,最常用的是xpath,這裡我們需要抽取商戶id(防止重複),商戶名稱(過濾掉不含黃燜雞米飯的),創建時間,區域名稱,省份是沒有的,需要根據區域名稱得到。xpath可以結合Chrome的開發者工具來寫,並通過xpath插件來驗證,下面給出這幾項數據的xpath:
商戶id,抽取的數據中包含其他商戶id,需要進一步處理來得到id
//div[contains(@class,"shop-review-wrap")]/div/h3/a/@href
商戶名稱
//div[contains(@class,"shop-review-wrap")]/div/h3/a/text()
創建時間,需要進一步字元串處理後得到時間
//div[contains(@class,"block raw-block")]/ul/li[1]/span
區域名稱,同樣文本需要處理
//div[@class="breadcrumb"]/b[1]/a/span/text()
- 發現新URL
URL的發現規則不是必須配置的,但是配置之後,可以大大提高爬蟲的速率。對於大眾點評這樣規整的列表頁+詳情頁,配置好列表頁的url規則和詳情頁的url規則,爬蟲的目標就很明確,爬取速率杠杠的。一般這種規則用正則來表示,對於這裡的爬蟲,列表頁規則為
http://www.dianping.com/search/keyword/\d+/0_.*
詳情頁規則為
http://www.dianping.com/shop/\d+/editmember
另外,大眾點評限制了IP的訪問頻率,這裡可以把降低爬取速率,或是使用代理。如果你使用的是神箭手雲爬蟲,則代碼如下
configs.enableProxy = true;
自己寫爬蟲的同學,請自行Google代理IP,此處不再贅述。
- 用爬取的數據配置出圖表
折騰出了這麼多代碼,約摸著看到這的都是真愛了,那麼趕緊看看我們的成果吧:
總共爬取到14000多條數據,現在就以這些數據作為樣本來分析(下面涉及到的圖表的設置,都是在神箭手雲平台上操作完成的)。
1. 黃燜雞米飯的整體增長
像原文里的分析一樣,以季度為單位,作出2012年至2016年,黃燜雞米飯的門店數隨時間的增長情況。先看下出來的圖:
上圖中,柱形繪製的是各個季度門店的新增數,折線繪製的是截止到某個季度的總門店數。對於柱形圖/折線圖,首先設置X軸和Y軸。Y軸比較簡單,就是門店數,值類型是value,一個Y軸就可以了,不需要第二個Y軸;X軸是按季度劃分的,值類型是category,需要在爬取結果的create_time欄位上作區間劃分,這裡展示的"新增"和"總店數"兩個數據,它們的統計區間是不一樣的,"新增"統計的是create_time落在某個季度的門店數,而"總店數"統計的是create_time在某個季度之前的門店數,所以這裡的區間劃分需要定義兩個。
X軸和Y軸定義好之後,開始定義數據。
新增數展示為柱形圖。X軸的欄位選擇create_time,在create_time上劃分區間,這裡通過簡單的字元串比較就可以劃分出季度區間,比如"2013-Q2",定義它的最小值為"2013-04-01",最大值為"2013-07-01"。Y軸只需要對劃分出的區間作count操作就可以,所以配置Y軸欄位為"*",操作選擇計數。
總店數展示為折線圖。總店數跟新增數唯一的區別就是區間劃分,比如"2013-Q2",只定義它的最大值為"2013-07-01"就好了。
下圖為部分設置界面。
配置完成後保存,就可以查看生成的圖表了。
2. 分區域分析黃燜雞米飯的增長
逐年觀察各個省份黃燜雞米飯門店數的增長情況,時間維度體現在多張圖上,省份的數據通過中國地圖的著色深淺來表示。先看效果圖:
圖表類型為中國地圖,配置也比較簡單。首先在create_time上添加過濾條件來配置年份,比如要配置2014年的地圖,添加過濾條件,欄位選擇create_time,設置最大值為"2015-01-01";配置區域欄位為province_name,數據還是計數操作,選擇欄位為"*",操作為count。這樣就會篩選出2014年底黃燜雞米飯的門店,並以省為單位,分別統計門店個數。最後設置圖例,不同門店數用不同的顏色填充,就可以作出上面的系列圖。
大功告成,一碗熱騰騰的黃燜雞米飯就可以上桌了,如果想搞什麼大盤雞,小盤雞,紅燒肉,KTV啥的的,相信你都已經不在話下了吧。
完整代碼:
samples/dianping.js at master · ShenJianShou/samples · GitHub
推薦閱讀: