如何写出《黄焖鸡米饭是怎么火起来的》这样的文章
去年開始研究做爬蟲,搞了一套分布式的爬蟲系統(tǒng),主要目標是幫別人做數據采集。后來看到黃燜雞米飯是怎么火起來的? - 何明科的回答,進而關注了《數據冰山》,發(fā)現里面的大數據分析的文章都相當有意思,圖表也一個比一個專業(yè)。
我當時的表情大約是這樣的:
我的天哪,這么神奇嗎? 放下手機,操起鍵盤,正準備也搞上一篇 “大數據分析:郭德綱和女演員的相愛相殺之后,wuli濤濤是如何火起來的”。后來轉念一想,這不是赤果果的抄襲了,媽媽是怎么教導我的。再說了,以我這樣的實力,寫了這樣的文章,以后別人還怎么寫呢?
俗話說得好:授人以魚不如授人以漁,獨樂樂不如眾樂樂。不如我們就以黃燜雞米飯為例,給大家講講如何才能寫出這樣一篇圖文并茂的分析文章來吧。
先來一段硬廣:本文所有代碼,都需要運行在本人搭建的神箭手云爬蟲框架上,打算完全自己寫爬蟲的同學,領會精神即可。
·????????數據來源分析
首先需要黃燜雞米飯門店的創(chuàng)建時間,來分析黃燜雞米飯隨時間的增長,其次需要門店的地域信息來分析不同地域黃燜雞米飯的增長情況。
分析大眾點評的商戶門店信息,可以在商戶的貢獻榜頁面找到相關的信息,如下圖:
這里需要對數據作幾個近似處理:
僅選取商戶名中包含"黃燜雞米飯"的門店
將商戶的添加時間近似看作門店的創(chuàng)建時間
大眾點評無法查到已經關閉的商戶,所以這里不考慮門店的關閉,僅選取現存的門店
開始寫爬蟲
上面分析了對數據的需求,下面就開始動手寫爬蟲爬取數據啦~
熟悉爬蟲的人都知道,一個爬蟲的基本工作流程是:
首先挑選一部分種子URL(也可以叫入口URL),并放入到待爬隊列中
從待爬隊列中取出一個URL,下載內容并從中抽取信息,同時發(fā)現新URL,并加入到待爬隊列中。重復此步驟,直至待爬隊列為空。
?
上面加粗了3個重點,種子URL、抽取信息和發(fā)現新URL。
種子URL
?
也可以叫入口URL,爬蟲以這些URL為入口,以某種規(guī)則發(fā)現新的URL,最終爬遍所有想要的網頁。為了爬取高效,我決定直接用大眾點評的搜索,選擇大眾點評的搜索結果頁作為入口URL,爬取結果頁的所有商戶并篩選后作為樣本數據。大眾點評的搜索也是分區(qū)域的,要把所有區(qū)域的搜索結果頁都作為入口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(很容易可以發(fā)現此范圍內是中國的區(qū)域,數字再大就到國外了,如果多了或者少了請告訴我)。
抽取信息
?
從網頁中抽取信息,最常用的是xpath,這里我們需要抽取商戶id(防止重復),商戶名稱(過濾掉不含黃燜雞米飯的),創(chuàng)建時間,區(qū)域名稱,省份是沒有的,需要根據區(qū)域名稱得到。xpath可以結合Chrome的開發(fā)者工具來寫,并通過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()
創(chuàng)建時間,需要進一步字符串處理后得到時間
//div[contains(@class,'block raw-block')]/ul/li[1]/span
區(qū)域名稱,同樣文本需要處理
//div[@class='breadcrumb']/b[1]/a/span/text()
發(fā)現新URL
?
URL的發(fā)現規(guī)則不是必須配置的,但是配置之后,可以大大提高爬蟲的速率。對于大眾點評這樣規(guī)整的列表頁+詳情頁,配置好列表頁的url規(guī)則和詳情頁的url規(guī)則,爬蟲的目標就很明確,爬取速率杠杠的。一般這種規(guī)則用正則來表示,對于這里的爬蟲,列表頁規(guī)則為
http://www.dianping.com/search/keyword/\\d+/0_.*
詳情頁規(guī)則為
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字段上作區(qū)間劃分,這里展示的"新增"和"總店數"兩個數據,它們的統(tǒng)計區(qū)間是不一樣的,"新增"統(tǒng)計的是create_time落在某個季度的門店數,而"總店數"統(tǒng)計的是create_time在某個季度之前的門店數,所以這里的區(qū)間劃分需要定義兩個。
X軸和Y軸定義好之后,開始定義數據。
新增數展示為柱形圖。X軸的字段選擇create_time,在create_time上劃分區(qū)間,這里通過簡單的字符串比較就可以劃分出季度區(qū)間,比如"2013-Q2",定義它的最小值為"2013-04-01",最大值為"2013-07-01"。Y軸只需要對劃分出的區(qū)間作count操作就可以,所以配置Y軸字段為'*',操作選擇計數。
總店數展示為折線圖。總店數跟新增數唯一的區(qū)別就是區(qū)間劃分,比如"2013-Q2",只定義它的最大值為"2013-07-01"就好了。
下圖為部分設置界面。
?
配置完成后保存,就可以查看生成的圖表了。
2. 分區(qū)域分析黃燜雞米飯的增長
逐年觀察各個省份黃燜雞米飯門店數的增長情況,時間維度體現在多張圖上,省份的數據通過中國地圖的著色深淺來表示。先看效果圖:
?
圖表類型為中國地圖,配置也比較簡單。首先在create_time上添加過濾條件來配置年份,比如要配置2014年的地圖,添加過濾條件,字段選擇create_time,設置最大值為"2015-01-01";配置區(qū)域字段為province_name,數據還是計數操作,選擇字段為'*',操作為count。這樣就會篩選出2014年底黃燜雞米飯的門店,并以省為單位,分別統(tǒng)計門店個數。最后設置圖例,不同門店數用不同的顏色填充,就可以作出上面的系列圖。
大功告成,一碗熱騰騰的黃燜雞米飯就可以上桌了,如果想搞什么大盤雞,小盤雞,紅燒肉,×××啥的的,相信你都已經不在話下了吧。如果想要完整代碼的,請直接私信我,為了降低這篇軟文的廣告密度,在這里就不貼了。
?
-----------------------一覺醒來決定還是貼個源碼鏈接----------------------------------------
samples/dianping.js at master ·ShenJianShou/samples · GitHub
轉載于:https://blog.51cto.com/11578123/1771742
總結
以上是生活随笔為你收集整理的如何写出《黄焖鸡米饭是怎么火起来的》这样的文章的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode题目:Range Sum
- 下一篇: [MySQL 源码] 从buffer p