前言
2012,一個卡牌,一個雷恩加爾,一群紅衣少年的歡聲笑語,
2013,一個杰斯,一個扎克,一場支離破碎的夢境,
2014,一個螳螂,一個蘭博,一座搖搖欲墜的基地,
2015,一個寡婦,一個妖姬,一本永遠疊不上去的梅賈竊魂卷,
2016,一個盲僧,一個奧拉夫,一串恥辱的數字,
2017,一個克格莫,一個青鋼影,一個賽區絕境中最后的救贖,
2018,一個刀妹,一個劍魔,一個至高無上的尊嚴,
2019,一個泰坦,一個盲僧,一個浴火重生的鳳凰,
2020,一個船長,一個劍姬,一個殺戮無法彌補的遺憾,
2021,一個皇子,一個佐伊,一個挽大廈于將傾的騎士,
今天的主角就是2021年英雄聯盟全球總決賽冠軍——EDG,當天奪冠訊息一出,立馬登頂各大媒體平臺熱搜榜,引發巨大反響,本文以B站官方賽事評論為例,來看看能不能發現什么有趣的內容!
探尋網頁規律
待爬取鏈接:https://www.bilibili.com/video/BV1EP4y1j7kV?p=7
F12打開抓包工具–>選擇network–>向下滑動評論–>尋找對應資料包

資料包鏈接如下:
https://api.bilibili.com/x/v2/reply/main?callback=jQuery172020429646890840103_1636422926026&jsonp=jsonp&next=2&type=1&oid=891511588&mode=3&plat=1&_=1636423918172
直接打開會發現并不是對應的 json 檔案,

仔細觀察鏈接會發現有 “callback=jQuery172020429646890840103_1636422926026” 這個引數,根據字面意思應該是回呼引數,我們嘗試將它刪掉,重現打開,

現在資料包就可以得到了,下一步找到控制“頁數”的引數即可,經測驗發現就是 next=2 這個引數,
資料抓取
獲取url串列
通過 url 模板,格式化 url ,保存到待抓取串列中,
def get_url_list():
url_list = []
# url模板
url = f'https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next=%d&type=1&oid=891511588&mode=3&plat=1&_=1636423918172'
for i in range(1, 10):
# 將格式化的url添加到字串中
url_list.append(url%i)
return url_list
抓取程式
因為待抓取的資料還是有些多,整個抓取采用 異步協程 的方式,使用時要替換請求頭 headers 中的 cookie ,本次的代碼只對網頁請求進行異步操作,檔案讀寫這部分并未設計異步,
async def get_page(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
'cookie': "填寫自己對應的網頁cookie"
}
async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=False), trust_env=True) as session:
while True:
async with session.get(url=url, headers=headers, timeout=8) as response:
# 更改相應資料的編碼格式
response.encoding = 'utf-8'
# 遇到IO請求掛起當前任務,等IO操作完成執行之后的代碼,當協程掛起時,事件回圈可以去執行其他任務,
page_text = await response.text()
print(f"{url.split('=')[-1]}爬取完成!")
break
return save_to_csv(page_text)
資料決議與存盤
從上面圖中的內容可以看到,資料結構還是有點復雜的,這里我根據個人興趣提取了一部分感興趣的欄位,大部分評論具有回復內容,這里只采集第一級評論的回復,資料保存時要注意 DataFrame 的表頭不要重復保存,
def save_comment(df, dic, rep=False):
message = dic['content']['message'] if not rep else dic['content']['message'].split(':', 1)[-1]
df = df.append({'ctime':dic['ctime'],
'like':dic['like'],
'uname':dic['member']['uname'],
'sex':dic['member']['sex'],
'current_level':dic['member']['level_info']['current_level'],
'message':message},
ignore_index=True)
def save_to_csv(page_text):
df = pd.DataFrame({'ctime': [], 'like': [], 'uname': [], 'sex': [],
'current_level': [], 'message': []})
data = json.loads(page_text)
comment = data['data']['replies']
for dic in comment:
save_comment(df, dic)
if dic['replies'] != None:
for reply in dic['replies']:
save_comment(df, reply, rep=True)
header = False if Path(r'C:\Users\pc\Desktop\bilibili.csv').is_file() else True
df.to_csv(r'C:\Users\pc\Desktop\bilibili.csv', header=header, index=False, mode='a')
print('成功保存:' + str(len(df)) + '條')
完整原始碼文末獲取
資料可視化
寫文時間確實不多,只有用 Tableau 簡單可視化一下了!
熱評發布時間分布

可以看到熱評發布時間集中在 11月6日下午5-6點,基本占了整個熱評池的一半左右,
評論熱度排行

下面看一下熱度排名前三的評論:
jiejie:像scout說實話,我真的很想給他一個冠軍你知道嗎?
他在edg打了那么久,我很想去給他一個冠軍,我其實我是幻想過,我們一起在冰島打到最后,我們一起捧獎杯的那個畫面,我們六個,芙蘭朵,viper,妹扣,俊嘉,如果廠長小象能來的話,我們八個人一起捧起召喚師獎杯,
lpl是最牛逼的,沒有之一!
————點贊數104089
也許有一天,我說也許,也許有一天,我們再次對英雄聯盟電子競技失去了信心,因為韓國的宰治,從四強賽看來,已卷土重來,
但我覺得不是今天,
也許有一天,這些我們所熟知的熱愛的選手,沒有辦法堅持在舞臺上了,
但也不是今天,
今天,EDG浴血奮戰!不破不立!來迎戰LCK一號種子DK戰隊,我們準備進入召喚師峽谷!77777!!![打call][打call][打call]
————點贊數67413
騎士拔劍,攘除外敵,重建王朝,
我懂了是亞瑟王傳說!
————點贊數37223
評論人群等級

大佬是真的多呀,2級的只有2%左右!5級6級大佬占了73%,4級的我瑟瑟發抖,,
評論人群性別比例

評論中男女占比 5:1 ,男生還是主力軍!
合成看板


原始碼獲取
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/354654.html
標籤:其他
