利用 Python 爬取“工商祕密”微博,看看大家都在關注些什麼?

賣山楂啦prss發表於2020-12-21

微博作為我的日常軟體之一,平時除了看看熱搜、肖戰(哈哈),我還會時不時看看祕密,雖然從來都沒有投過稿,但還是會對一些感興趣的內容評論評論或者點點贊,前兩天刷祕密突然很想知道,

  • 祕密為同學們釋出最多的是哪些內容?與哪些相關?
  • 或者哪些同學喜歡去祕密下方評論?
  • 評論最多的微博多於什麼相關?
  • 祕密經常會在什麼時間釋出微博?
  • 釋出的微博都是情感正向的還是負向的?

當然這些問題後臺應該最清楚,也有直接的資料,不過這裡我想通過爬取的資料來看看這些問題,或許會得出不一樣的結論。


開始爬蟲之旅(注:內容只是娛樂,微博內容是公開的,評論者的ID名將進行處理,只顯示一部分

抓取網址 祕密

想要的資料包括:

釋出時間、釋出的微博內容、評論、評論者、評論中的評論、評論者中的評論者

未拿資料:

評論數、點贊數、轉發數、釋出微博來源等

知道想要的資料後,接下來就開始尋找資料

一般介面資料都會存在 XHR,所以沿著這個方向基本能找到資料

部分程式碼

for i in cards:
    # 在提取json資料時,使用get方法,有就提取,沒有就為空
    # mblog可能有可能沒有
    if i.get('mblog'):
        result1 = i.get('mblog')['text']
        ids = i.get('mblog')['id']
        # print(result1,ids)
        # print('\n')
        cop = re.compile("[^\u4e00-\u9fa5]") # 匹配不是中文、大小寫、數字的其他字元
        string1 = cop.sub('', result1) 
        # print(string1)
        # print('\n')
        # result2 = re.sub('<[^<]+?>', '', result1).replace('\n', '').strip()
        sheet.append([string1,'0','0','0','0','0'])
        # =======微博下面的評論
        # time.sleep(1)
        # md = re.findall('<a href="(.*?)">',result1)[0].split('/')[-1]
        url = 'https://m.weibo.cn/comments/hotflow?id='+ ids +'&mid='+ ids +'&max_id_type=0'
        response1 = requests.get(url,timeout=30,headers=headers)
        dat1 = response1.json()
        
        if dat1['ok'] == 1:
            pinglun_num = dat1['data']['total_number']
            da = dat1['data']['data']
            for i in da:
                pinglun = cop.sub('', i['text'])
                created_at = i['created_at']
                user1 = i['user']['screen_name']
                sheet.append(['0',created_at,pinglun,user1,'0','0'])
                 # =======微博下面的評論的評論
                if i['total_number'] > 0 and i['comments']!=False:
                    comments = i['comments']
                    for g in comments:
                        text = cop.sub('', g['text'])
                        user2 = g['user']['screen_name']
                        sheet.append(['0','0','0','0',text,user2])

為了防止被封,這裡在爬取時設定了隨機頭以及2秒的睡眠,並且沒有一次性拿太多,分批次拿,每個批次儲存在不同的excel檔案,最終利用線上excel合併得到如下資料:

在這裡插入圖片描述

這裡總的拿到接近10000條資料(包括無效資料),其中祕密內容和相關評論大概有近2000條,評論者8000左右(包括重複ID)…

對資料進行處理,包括刪除重複值、異常值(特殊字元)、資料脫敏等

基本的髒資料處理好之後,下面就可以開始分析啦~~~

(1)祕密微博詞雲圖

首先,把爬取到的所有微博篩選出來

在這裡插入圖片描述
接下來,將資料匯入程式中,得到如下的詞雲圖

在這裡插入圖片描述

或者,修改一下蒙版

在這裡插入圖片描述

可以發現在最近這段時間,祕密釋出的微博內容中這幾個詞出現得最多,包括:考研圖書館寢室學校等,臨近考研,同學們可能都比較關心學校啊、圖書館啊、座位位置啊這些,這裡也祝願我們們學校的考研人都能取得理想成績,但行好事,莫問前程。

除此之外,喜歡女朋友男朋友等詞語也常常出現在微博中,也許是冬天適合談戀愛吧,記得多買一杯古茗奶茶,把它捧在手心裡,暖暖的,很貼心!

2 祕密微博評論者

這裡我一共拿到8010個使用者ID(包括重複值),均進行了處理

在這裡插入圖片描述

用資料透視表進行統計後,得到如下資料,可以看到最近一段時間在祕密下方評論最多的ID名是 海嘯*****,其次是尋找****道長、最好*****18881、我可*****假猴子ha、工商**精。
在這裡插入圖片描述

資料視覺化呈現

from pyecharts.charts import *
from pyecharts import options as opts 
from pyecharts.globals import ThemeType  
import os
os.chdir(r'C:\Users\Administrator\Desktop')
ID = ['海嘯****','尋找****道長','最好****18881','我可****假猴子ha','工商***精']
values = [53,47,36,34,34]
c = (
        Pie(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
        .add("", zip(ID,values),radius=["40%", "70%"])
        .set_global_opts(
            title_opts=opts.TitleOpts(title="祕密微博評論者TOP5",subtitle="賣山楂啦prss",pos_top="2%",pos_left = 'center'),
            toolbox_opts=opts.ToolboxOpts(
            # 是否顯示該工具
            is_show=True,
            ))
        
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}",font_size=18))
        .render("資料視覺化.html")
    )

在這裡插入圖片描述
在這裡插入圖片描述
下面在看一下 ID 名為 海嘯****同學,都在祕密平臺上評論了些什麼詞語(這裡資料較少)

在這裡插入圖片描述

評論的微博與哪些相關

在這裡插入圖片描述

3 祕密微博情感分析

這裡使用模型對每一條微博進行情感分析,分析其積極分值和消極分值

但有個問題是

祕密前段時間“改版了”,許多內容合併成一條釋出,這就會導致最終的模型訓練結果會有偏差,這裡我並沒有解決這個問題,所以結果可能具有不合理性。

在這裡插入圖片描述
進一步的判斷出每條微博的情感傾向。

在這裡插入圖片描述
資料視覺化

總的來說,最近祕密釋出的微博的情感傾向還是比較均衡的,差異並不大,正向情感略高於負向情感。
在這裡插入圖片描述

4 祕密微博釋出時間分析

由於忘記拿釋出時間的資料,所以這裡從頭在爬取一次,這次只要釋出是時間

拿到的資料如下

在這裡插入圖片描述
這裡的時間資料是中國標準時間,需要進行轉換

import pandas as pd
import numpy as np

df = pd.read_excel('C:\\Users\\Administrator\\Desktop\\釋出時間.xlsx')

def trans_format(time_string, from_format='%a %b %d %H:%M:%S +0800 %Y', to_format='%Y-%m-%d %H:%M:%S'):
    """
    @note 時間格式轉化
    :param time_string:
    :param from_format:
    :param to_format:
    :return:
    """
    time_struct = time.strptime(time_string,from_format)
    times = time.strftime(to_format, time_struct)
    return times

if __name__ == "__main__":
    df["處理後的時間"] = df['時間'].apply(trans_format)

轉換後的資料如下:

在這裡插入圖片描述
利用python 將時分秒變成小數

因為時間就是至1之間的小數,0是一天的開始,1就是1天了,所以時間是至1之間的小數,也就是中午12點是0.5。

比如這裡

0:07:35 ===0.005266...

在這裡插入圖片描述

最終處理結果
在這裡插入圖片描述
接下來開始分箱

bins = pd.read_csv(r"處理後的資料.csv")
bins
def cut_bins(x):
    if  0.083333<= x <0.250000:
        return '02:00:00--06:00:00'
    elif 0.250000 <=x <0.458333:
        return '06:00:00--11:00:00'
    elif 0.458333 <=x <0.541667:
        return '11:00:00--13:00:00'
    elif 0.541667 <=x <0.708333:
        return '13:00:00--17:00:00'
    elif 0.708333 <=x <0.791667:
        return '17:00:00--19:00:00'
    elif 0.791667 <=x <0.916667:
        return '19:00:00--22:00:00'
    else:
        return '22:00:00--02:00:00'

bins['所在時間段'] = bins['將時分秒改成常規'].map(cut_bins)
bins

在這裡插入圖片描述
統計

bins['所在時間段'].value_counts()
'''
22:00:00--02:00:00    341
13:00:00--17:00:00    222
06:00:00--11:00:00    183
19:00:00--22:00:00    156
17:00:00--19:00:00    101
11:00:00--13:00:00     98
02:00:00--06:00:00     19
Name: 所在時間段, dtype: int64
'''

資料視覺化

可以看到,祕密經常會在 22:00:00 – 02:00:00 這個時間段釋出微博,其次是下午13:00:00–17:00:00
在這裡插入圖片描述
至此,所有分析結束。

相關文章