前段時間爲「周杰倫打榜」話題迅速登上微博熱搜榜 由於cxk的粉絲們質疑周杰倫微博沒有數據 (周杰倫沒有開通微博) 因而,無數隱匿江湖多年 看不下去的周杰倫老年粉開始被迫營業 html
因而一場周杰倫中老年粉VS蔡徐坤鐵軍 微博打榜大戰拉響 爲聽了那麼多年的周杰倫 粉絲們紛紛拉下老臉 和00後的微博飯圈小年輕們 從零學習如何作數據iKun們都說周杰倫的粉絲是夕陽紅老年團 python
今天咱們就用他們說的數據,來實力打臉,讓iKun們看看周杰倫的粉絲們究竟是不是中老年粉!用爬蟲爬取#周杰倫超話#
下的微博,而後再爬取他們的我的主頁信息,獲取年齡、地區、性別等信息,而後用數據分析,再可視化呈現!git
注意:文中說的微博我的主頁信息均爲微博公開信息,不包含任何隱私信息,同時全文中將不會出現任何人的我的信息,信息僅用於學習分析,任何人不得使用此教程用做商用,違者後果自付!github
咱們大概分解下技術步驟,以及使用的技術chrome
#周杰倫超話#
下的微博爬取數據咱們可使用requests庫
,保存csv文件咱們可使用內置庫csv
,而可視化數據分析此次給你們介紹一個超級好用的庫pyecharts
,技術選型好了以後咱們就能夠開始技術實現了!json
咱們在谷歌瀏覽器(chrome)中找到#周杰倫超話#
頁面,而後調出調試窗口,改成手機模式,而後過濾請求,只查看異步請求,查看返回數據格式,找到微博內容所在! api
拿到連接咱們就能夠模擬請求,這裏咱們仍是使用咱們熟悉的requests庫
。簡單幾句即可以獲取微博! 瀏覽器
咱們能夠看到返回的數據是一個json格式的,咱們一層一層尋找,就能夠找到微博內容、用戶id所在! cookie
瞭解微博返回的數據結構以後咱們就能夠將微博內容和id提取出來啦!在咱們提取一條微博以後,咱們即可以批量爬取微博啦,如何批量?固然是要分頁了?那如何分頁,這裏豬哥再教你們一遍尋找分頁參數技巧:數據結構
查找分頁參數技巧:比較第一次和第二次請求url,看看有何不一樣,找出不一樣的參數!給你們推薦一款文本比較工具:Beyond Compare
比較兩次請求的URL發現,第二次比第一次請求連接中多了一個:since_id
參數,而這個since_id參數就是每條微博的id!
微博分頁機制:根據時間分頁,每一條微博都有一個since_id,時間越大的since_id越大因此在請求時將since_id傳入,則會加載對應話題下比此since_id小的微博,而後又從新獲取最小since_id將最小since_id傳入,依次請求,這樣便實現分頁
瞭解微博分頁機制以後,咱們就能夠制定咱們的分頁策略:咱們將上一次請求返回的微博中最小的since_id做爲下次請求的參數,這樣就等於根據時間倒序分頁抓取數據!
而後寫一個for循環調用上面那個方法就能夠啦# 批量爬取
for i in range(1000):
print('第%d頁' % (i + 1))
spider_topic()
複製代碼
批量爬取微博搞定以後,咱們就能夠開始爬取用戶信息啦!
首先咱們得了解,用戶基本信息頁面的連接爲:weibo.cn/用戶id/info,我…喜歡唱、跳、rap還有籃球的同窗主頁爲例子!
因此咱們只要獲取到用戶的id就能夠拿到他的公開基本信息!回顧咱們以前分析的微博數據格式,發現其中便有咱們須要的用戶id!
因此咱們在提取微博內容的時候能夠順便將用戶id提取出來!咱們獲取到用戶id以後,只要請求weibo.cn/用戶id/info 這個url就能夠獲取公開信息了,可是查看別人用戶主頁是須要登陸的,那咱們就先用代碼模擬登陸!
咱們以前爬取豆瓣的時候,已經教過你們如何模擬登陸了,這裏就直接放出代碼!
登陸咱們使用的是requests.Session()對象,這個對象會自動保存cookies,下次請求自動帶上cookies!拿到用戶id又登陸以後,就能夠開始爬取用戶公開信息啦!
這裏公開信息咱們只要: 用戶名、性別、地區、生日這些數據!因此咱們須要將這幾個數據提取出來! 爬取用戶信息不能過於頻繁,不然會出現請求失敗(響應狀態碼=418),可是不會封你的ip,其實不少大廠 不太會輕易的封ip,太容易誤傷了,也許一封就是一個小區甚至更大!微博信息拿到了、用戶信息也拿到了,那咱們就把這些數據保存起來,方便後面作數據分析!
咱們以前一直是保存txt格式的,由於以前都是隻有一項數據,而此次是多項數據(微博內容、用戶名、地區、年齡、性別等),因此選擇CSV(Comma Separated Values逗號分隔值)格式的文件!
咱們生成一個列表,而後將數據按順序放入,再寫入csv文件! 看看生成的csv文件,注意csv若是用wps或excel打開可能會亂碼,由於咱們寫入文件用utf-8編碼,而wps或excel只能打開gbk編碼的文件,你能夠用通常的文本編輯器便可,pycharm也能夠!數據保存下來以後咱們就能夠進行數據分析了,首先咱們要知道咱們須要分析哪些數據?
由於咱們保存的數據格式爲:'用戶id', '用戶名', '性別', '地區', '生日', '微博id', '微博內容',的不少行,而如今作數據分析須要獲取指定的某一列,好比:性別列,因此咱們須要封裝一個方法用來讀取指定的列!
這裏豬哥還使用了Counter
類來統計詞頻,方便後面數據分析,他返回的格式爲:{'女': 1062, '男': 637}。
在咱們分析以前,有一件很重要的事情,那就是選擇一個合適可視化庫!你們都知道Python可視化庫很是多,以前咱們一直在用matplotlib庫
作詞雲,matplotlib作一些簡單的繪圖很是方便。可是今天咱們須要作一個全國分佈圖,因此通過豬哥對比篩選,選擇了國人開發的pyecharts庫
。選擇這個庫的理由是:開源免費、文檔詳細、圖形豐富、代碼簡介,用着就是一個字:爽!
po一張他們的官方文檔圖片
這裏有很是詳細的例子,直接複製過來就能夠運行獲得圖片!選擇了可視化庫以後,咱們就來使用吧!
這裏說下爲何生成的是html?由於這是動態圖,就是能夠點擊選擇顯示的,很是人性化!執行以後會生成一個gender.html文件,在瀏覽器打開就能夠! 效果圖中能夠看到,在打榜的粉絲中女性多於男性, 女性佔比大概爲62%!這一項是你們比較關心的,真的是夕陽紅粉絲團嗎?
上圖中咱們發現 爲周杰倫打榜的主力軍爲:90後!下面咱們來看看打榜粉絲全國各省的分佈狀況!
上圖中咱們能夠看到 打榜最多的三個省(直轄市)依次爲:廣州、北京、上海!咱們來看看這些打榜的粉絲們都在說什麼!
上圖分析出現一些 有趣的詞:營業、老年人、奶茶!看來打榜粉絲們都自認爲本身是老年人,哈哈哈!
從結果來說爲周杰倫打榜的粉絲主力軍仍是80、90後,畢竟曾經的青春啊,並且女生要比男生多,打榜粉絲最多的地區爲廣東!
從技術分析今天這個例子有很多的新東西,瞭解新浪微博分頁機制、爬取用戶公開信息、使用csv庫保存文件、使用pyecharts作數據可視化!
固然中間遇到了不少問題,只有本身親自嘗試纔會知道,豬哥已經把源碼放在github(github.com/pig6/sina_t… 或點擊 閱讀原文)中,感興趣的同窗記得轉發收藏有時間的時候嚐嚐鮮!