爬取微博使用者公開資訊,分析為周杰倫打榜的夕陽紅老年團,告訴你他們真實年齡!
前段時間為“周杰倫打榜”話題迅速登上微博熱搜榜
因為cxk的粉絲們質疑周杰倫微博沒有資料
(周杰倫沒有開通微博)
於是,無數隱匿江湖多年
看不下去的周杰倫老年粉開始被迫營業
於是一場周杰倫中老年粉VS蔡徐坤鐵軍
微博打榜大戰拉響
為聽了那麼多年的周杰倫
粉絲們紛紛拉下老臉
和00後的微博飯圈小年輕們
從零學習如何做資料
一、需求背景
iKun們都說周杰倫的粉絲是夕陽紅老年團
今天我們就用他們說的資料,來實力打臉,讓iKun們看看周杰倫的粉絲們到底是不是中老年粉!
二、功能描述
用爬蟲爬取#周杰倫超話#
下的微博,然後再爬取他們的個人主頁資訊,獲取年齡、地區、性別等資訊,然後用資料分析,再視覺化呈現!
注意:文中說的微博個人主頁資訊均為微博公開資訊,不包含任何隱私資訊,同時全文中將不會出現任何人的個人資訊,資訊僅用於學習分析,任何人不得使用此教程用作商用,違者後果自付!
三、技術方案
我們大概分解下技術步驟,以及使用的技術
- 爬取
#周杰倫超話#
下的微博 - 根據每條微博爬取該使用者基本資訊
- 將資訊儲存到csv檔案
- 使用資料分析使用者年齡、性別分佈
- 分析粉絲團的地區分佈
- 使用詞雲分析打榜微博內容
爬取資料我們可以使用requests庫
,儲存csv檔案我們可以使用內建庫csv
,而視覺化資料分析這次給大家介紹一個超級好用的庫pyecharts
,技術選型好了之後我們就可以開始技術實現了!
四、爬取超話微博
1.找到超話載入資料URL
我們在谷歌瀏覽器(chrome)中找到#周杰倫超話#
頁面,然後調出除錯視窗,改為手機模式,然後過濾請求,只檢視非同步請求,檢視返回資料格式,找到微博內容所在!
微博請求連結:https://m.weibo.cn/api/container/getIndex?jumpfrom=weibocom&containerid=1008087a8941058aaf4df5147042ce104568da_-_feed
2.程式碼模擬請求資料
拿到連結我們就可以模擬請求,這裡我們還是使用我們熟悉的requests庫
。簡單幾句便可以獲取微博!
3.提取微博內容
我們可以看到返回的資料是一個json格式的,我們一層一層尋找,就可以找到微博內容、使用者id所在!
瞭解微博返回的資料結構之後我們就可以將微博內容和id提取出來啦!
4.批量爬取微博
在我們提取一條微博之後,我們便可以批量爬取微博啦,如何批量?當然是要分頁了?那如何分頁,這裡豬哥再教大家一遍尋找分頁引數技巧:
查詢分頁引數技巧:比較第一次和第二次請求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()
四、爬取使用者資訊
批量爬取微博搞定之後,我們就可以開始爬取使用者資訊啦!
首先我們得了解,使用者基本資訊頁面的連結為:https://weibo.cn/使用者id/info,我們以某**喜歡唱、跳、rap還有籃球**的同學主頁為例子!
所以我們只要獲取到使用者的id就可以拿到他的公開基本資訊!
1.獲取使用者id
回顧我們之前分析的微博資料格式,發現其中便有我們需要的使用者id!
所以我們在提取微博內容的時候可以順便將使用者id提取出來!
2.模擬登入
我們獲取到使用者id之後,只要請求https://weibo.cn/使用者id/info 這個url就可以獲取公開資訊了,但是檢視別人使用者主頁是需要登入的,那我們就先用程式碼模擬登入!
我們之前爬取豆瓣的時候,已經教過大家如何模擬登入了,這裡就直接放出程式碼!
登入我們使用的是requests.Session()物件,這個物件會自動儲存cookies,下次請求自動帶上cookies!
3.爬取使用者公開資訊
拿到使用者id又登入之後,就可以開始爬取使用者公開資訊啦!
這裡公開資訊我們只要:使用者名稱、性別、地區、生日這些資料!所以我們需要將這幾個資料提取出來!
爬取使用者資訊不能過於頻繁,否則會出現請求失敗(響應狀態碼=418),但是不會封你的ip,其實很多大廠 不太會輕易的封ip,太容易誤傷了,也許一封就是一個小區甚至更大!
五、儲存csv檔案
微博資訊拿到了、使用者資訊也拿到了,那我們就把這些資料儲存起來,方便後面做資料分析!
我們之前一直是儲存txt格式的,因為之前都是隻有一項資料,而這次是多項資料(微博內容、使用者名稱、地區、年齡、性別等),所以選擇CSV(Comma Separated Values逗號分隔值)格式的檔案!
我們生成一個列表,然後將資料按順序放入,再寫入csv檔案!
看看生成的csv檔案,注意csv如果用wps或excel開啟可能會亂碼,因為我們寫入檔案用utf-8編碼,而wps或excel只能開啟gbk編碼的檔案,你可以用一般的文字編輯器即可,pycharm也可以!
六、資料分析
資料儲存下來之後我們就可以進行資料分析了,首先我們要知道我們需要分析哪些資料?
- 我們可以將性別資料做生成餅圖,簡單直觀
- 將年齡資料作出柱狀圖,方便對比,看看到底是不是夕陽紅老年團
- 將地區做成中國熱力圖,看看哪個地區粉絲最活躍
- 最後將微博內容做成詞雲圖,直觀瞭解大家在說啥
1.讀取csv檔案列
因為我們儲存的資料格式為:’使用者id’, ‘使用者名稱’, ‘性別’, ‘地區’, ‘生日’, ‘微博id’, ‘微博內容’,的很多行,而現在做資料分析需要獲取指定的某一列,比如:性別列,所以我們需要封裝一個方法用來讀取指定的列!
這裡豬哥還使用了Counter
類來統計詞頻,方便後面資料分析,他返回的格式為:{‘女’: 1062, ‘男’: 637}。
2.視覺化庫pyecharts
在我們分析之前,有一件很重要的事情,那就是選擇一個合適視覺化庫!大家都知道Python視覺化庫非常多,之前我們一直在用matplotlib庫
做詞雲,matplotlib做一些簡單的繪圖非常方便。但是今天我們需要做一個全國分佈圖,所以經過豬哥對比篩選,選擇了國人開發的pyecharts庫
。選擇這個庫的理由是:開源免費、文件詳細、圖形豐富、程式碼簡介,用著就是一個字:爽!
- 官網:https://pyecharts.org/#/
- 原始碼:https://github.com/pyecharts/pyecharts
- 安裝:pip install pyecharts
po一張他們的官方文件圖片
這裡有非常詳細的例子,直接複製過來就可以執行得到圖片!
3.分析性別
選擇了視覺化庫之後,我們就來使用吧!
這裡說下為什麼生成的是html?因為這是動態圖,就是可以點選選擇顯示的,非常人性化!執行之後會生成一個gender.html檔案,在瀏覽器開啟就可以!
效果圖中可以看到,在打榜的粉絲中女性多於男性,女性佔比大概為62%!
4.分析年齡
這一項是大家比較關心的,真的是夕陽紅粉絲團嗎?
上圖中我們發現為周杰倫打榜的主力軍為:90後!
5.地區分析
下面我們來看看打榜粉絲全國各省的分佈情況!
上圖中我們可以看到打榜最多的三個省(直轄市)依次為:廣州、北京、上海!
6.打榜內容分析
我們來看看這些打榜的粉絲們都在說什麼!
上圖分析出現一些有趣的詞:營業、老年人、奶茶!
看來打榜粉絲們都自認為自己是老年人,哈哈哈!
七、總結
從結果來講為周杰倫打榜的粉絲主力軍還是80、90後,畢竟曾經的青春啊,而且女生要比男生多,打榜粉絲最多的地區為廣東!
從技術分析今天這個例子有不少的新東西,瞭解新浪微博分頁機制、爬取使用者公開資訊、使用csv庫儲存檔案、使用pyecharts做資料視覺化!
當然中間遇到了很多問題,只有自己親自嘗試才會知道,豬哥已經把原始碼放在github(https://github.com/pig6/sina_topic_spider 或點選 閱讀原文)中,感興趣的同學記得轉發收藏有時間的時候嚐嚐鮮!