1. 程式人生 > 其它 >python爬蟲+R資料視覺化 例項

python爬蟲+R資料視覺化 例項

Python 和 r語言這對黃金搭檔,在資料獲取,分析和視覺化展示方面,各具特色,相互配合,當之無愧成為資料分析領域的兩把利劍。該專案分為兩個模組:

1,資料準備階段 採用python網路爬蟲,實現所需資料的抓取;

2,資料處理和資料視覺化,採用r語言作為分析工具並作視覺化展示。

第一,資料準備模組 資料來源選用筆者所在學校的內網(校內俗稱OB),採用儲存cookie模擬登入,以板塊為單位,進行論壇帖子的抓取,並且根據發貼人的連線,再深入到發貼人的主頁進行發貼人個人公開資訊的抓取,最後以每一條帖子作為一條記錄儲存到檔案,按照此邏輯筆者於2016年5月13日-2016年5月26日設定ubuntu下定時任務,按時抓取並儲存獲得資料。

以下進行詳細分析: 首先需要載入的庫:

進行模擬登入並儲存cookie 需要有登入介面和論壇首頁的url和儲存cookie和錯誤日誌檔案

post_url = 'http://ourob.cn/bbs/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1'

url = 'http://ourob.cn/bbs/forum.php'

err_str = '' #儲存error詳情

filename = 'cookie_ob.txt'

模擬登入和生成cookie檔案

cookie = cookielib.MozillaCookieJar(filename)

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))

#post請求引數

postdata = urllib.urlencode({

'fastloginfield':'username',

'handlekey':'ls',

'username':'my user name',

'password':'my password',

'quickforward':'yes',

'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0',

'Connection':'keep-alive'

})

login_url = post_url

opener.open(login_url,postdata)

cookie.save(ignore_discard=True,ignore_expires=True)

嘗試用cookie模擬登入論壇首頁,並下載原始碼,提取所需欄位資訊

login_url = post_url

以下即可採用正則表示式,提取 今日發帖數,會員人數,線上人數 程式碼如下:

#正則獲取列表頁 user_num,topic_num,online_num

這種廣度搜索爬蟲都會涉及到需要補全連結的坑,所以本文采用定義補全連結函式,在需要的部分對該函式進行呼叫。

接下來,就是深入到各個板塊下進行爬取,事先定義好了一個盛放各板塊url的.py檔案block_list,已經在開始部分匯入,還需要增加翻頁功能,如下:

後續的部分思路相對比較簡單,但是涉及到提取欄位,程式碼部分比較複雜,這裡值得提一下的是:有的網站登入一段時間由於某些原因是會失效的(ob就是),但是究竟多久失效,這個沒辦法知道,所以為了避免因為登入失效而導致爬去失敗或者資料丟失,乾脆直接採用抓取頁面前,均使用cookie重新登入,實現如下(提取欄位部分不全):

if tag.em.span.has_attr('class') and tag.em.span.get('class')[0] == 'xi1':

最終得到的資料是這個樣子的:

第二,資料處理和資料視覺化 主要採用r語言讀取資料,進行頻數統計和圖表展示 簡單貼幾段程式碼: 讀取剪下板資料 並採用table()函式求頻數

data3<-read.table("clipboard",header = T)

柱狀圖

p <- ggplot(data = tb3, aes(x=b_type,y=freq))
ggplot(data=data1,aes(x=time))+geom_line(aes(y=線上人數,colour="線上人數"))+geom_line(aes(y=今日發帖,colour="今日發帖"))

餅圖

p<-ggplot(data=tb3,aes(x="",y=freq,fill=factor(b_type)))+geom_bar(stat="identity",width=1)

很顯然,發帖數和線上人數呈現正相關關係,二者在23:30左右的時候急速下降,主要是由於校內這個時候斷網,斷電,大家也都該洗洗睡了~,一直到早上7:20左右,人數開始回升,從這也可以看出童鞋們起床時間還是很早滴(因為要上課…),線上人數全天除了後半夜基本保持在500以上,上圖:

r語言版

發帖人數統計,呈現波動性很大,通過查詢日曆,顯而易見,發帖數高的日期13,14,21,22均為週末,看來大家週末放鬆的方式之一還真是逛~O~B,再看16,17,18可想而知童鞋們都膠著在上課,作業中,無暇顧及玩ob了…

從板塊角度來看,人們對不同板塊有不同的熱愛,但是結果上,分佈很不均勻,基本上大家經常水的就那麼幾個,有些則是很久頁無人問津…

從ob會員上來看,分佈依然很不均勻,活躍的就是那麼幾個(我猜大部分比較活躍的都是版主有木有~~)

這裡統計了一下,發帖數排名前十的,會員暱稱,能找到你自己麼??

那麼還有一個問題,大家都是在幾點比較容易發帖呢??用資料說話,接著看圖…

結果就是發帖時間有兩個高峰:一個是上午九點到十點,另一個是晚上七點到十點,也比較符合預期。 辛苦抓取了帖子作者的資訊,我們來看一看,都是哪一級的學生經常浪跡ob,說實話,當我看到結果的時候,瞬間覺得我已經在沙灘上了。。。

來一張一目瞭然的~

喜歡發帖和出生月份有木有關係??,來看看…

當然還要精確到天…

最後,還有血型

難道是說A型血,更傾向於逛ob嗎,道理在哪裡??? 到此,全部結束