1. 程式人生 > >爬取微博使用者公開資訊,分析為周杰倫打榜的夕陽紅老年團,告訴你他們真實年齡!

爬取微博使用者公開資訊,分析為周杰倫打榜的夕陽紅老年團,告訴你他們真實年齡!

前段時間為“周杰倫打榜”話題迅速登上微博熱搜榜
因為cxk的粉絲們質疑周杰倫微博沒有資料
(周杰倫沒有開通微博)
於是,無數隱匿江湖多年
看不下去的周杰倫老年粉開始被迫營業

於是一場周杰倫中老年粉VS蔡徐坤鐵軍
微博打榜大戰拉響
為聽了那麼多年的周杰倫
粉絲們紛紛拉下老臉
和00後的微博飯圈小年輕們
從零學習如何做資料

一、需求背景

iKun們都說周杰倫的粉絲是夕陽紅老年團

今天我們就用他們說的資料,來實力打臉,讓iKun們看看周杰倫的粉絲們到底是不是中老年粉!

二、功能描述

用爬蟲爬取#周杰倫超話#下的微博,然後再爬取他們的個人主頁資訊,獲取年齡、地區、性別等資訊,然後用資料分析,再視覺化呈現!

注意:文中說的微博個人主頁資訊均為微博公開資訊,不包含任何隱私資訊,同時全文中將不會出現任何人的個人資訊,資訊僅用於學習分析,任何人不得使用此教程用作商用,違者後果自付!

三、技術方案

我們大概分解下技術步驟,以及使用的技術

  1. 爬取#周杰倫超話#下的微博
  2. 根據每條微博爬取該使用者基本資訊
  3. 將資訊儲存到csv檔案
  4. 使用資料分析使用者年齡、性別分佈
  5. 分析粉絲團的地區分佈
  6. 使用詞雲分析打榜微博內容

爬取資料我們可以使用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. 我們可以將性別資料做生成餅圖,簡單直觀
  2. 將年齡資料作出柱狀圖,方便對比,看看到底是不是夕陽紅老年團
  3. 將地區做成中國熱力圖,看看哪個地區粉絲最活躍
  4. 最後將微博內容做成詞雲圖,直觀瞭解大家在說啥

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 或點選 閱讀原文)中,感興趣的同學記得轉發收藏有時間的時候嚐嚐鮮!