この記事の転載は禁止されています
EDGがチャンピオンシップを獲得し、ファンは揚げています!
11月6日、北京時間のリーグオブレジェンドS11ファイナルで、中国のLPLディビジョンチームEDGEスポーツクラブが韓国のLCKディビジョンチームDK3:2を破り、2021リーグオブレジェンドグローバルファイナルチャンピオンシップを獲得しました。
このゲームは、ネットワーク全体の注目も集めました。
- Weiboホット検索で1位、8,194万回の再生回数を示しています。
- bilibiliプラットフォーム、3億5000万人を魅了、フルスクリーンの弾幕。
- TencentVideoは600万人が視聴しています。
- DouyuおよびHuyaプラットフォームの人気も高いです。
- ゲーム終了後、CCTV NewsはWeiboを派遣し、EDGチームがチャンピオンシップを獲得したことを祝福しました。
ゲームはとても暑いので、みんなは何と言いましたか?
Pythonを使用して31,000の弾幕データを分析しましたが、画面にはファンからの祝福と感情が溢れています。
生放送やニュースを通じてゲームの全過程を感じるだけでなく、Pythonを通じてホットスポットを分析してファンの熱意を感じることができます。
この記事で使用されているソースコード、フォントファイル、ストップワードファイル、背景画像はすべて、友達として追加して受け取ることができます。
弾丸画面データを取得する方法を教えてください
1.簡単な説明
生放送を見たことがない友達も安心、リプレイあり!開会式から5試合、優勝の瞬間まで、全7本の動画をまとめました。
各動画には、ファンから投稿された弾幕があります。今日私がしなければならないのは、各ビデオの弾丸画面データを取得し、ファンが落ち着きのない気分になっているときに何を言ったかを確認することです。
ステーションBのウェブサイトはとても速く変化していると言わざるを得ません。去年は見つけやすかったのを覚えています。しかし、今日それは見つかりませんでした。
しかし、それは問題ではありません。前の弾幕数据网址接
口を使用することができます。
API: https ://api.bilibili.com/x/v1/dm/list.so?oid=XXX
このOIDは実際には数字の文字列であり、各ビデオには固有のOIDがあります。
2.OIDデータ検索
このセクションでは、このOIDを見つけるために段階的に説明します。OIDを見つけるには、まずcid
。と呼ばれるものを見つけます。
F12をクリックし、最初に開発ツールを開き、図の指示に従って1-5の操作を完了します。
pagelist
No. 3:このページにはたくさんのリクエストがありますが、で始まるリクエストを見つける必要があります。- No. 4:対応する
Header
下部を確認します。リクエストURLがあり、必要なcidはこのURLにあります。 - No. 5:
Preview
リクエストURLをリクエストするための対応する下部を確認し、提供された結果に応答します。図の丸で囲んだ部分は、必要なCIDデータです。
2.CIDデータの取得
上記のリクエストURLが見つかりました。これで、リクエストを開始して、内部のCIDデータを取得するだけで済みます。
import requests
import json
url = 'https://api.bilibili.com/x/player/pagelist?bvid=BV1EP4y1j7kV&jsonp=jsonp'
res = requests.get(url).text
json_dict = json.loads(res)
#pprint(json_dict)
for i in json_dict["data"]:
oid = i["cid"]
print(oid)
結果は次のようになります。
実際、ここでcidに対応する数値文字列は、oidの後の数値文字列です。
3.URLを連結します
danmaku apiインターフェースだけでなく、cidデータもあり、それらをつなぎ合わせることで最終的なURLを取得できます。
url = 'https://api.bilibili.com/x/player/pagelist?bvid=BV1EP4y1j7kV&jsonp=jsonp'
res = requests.get(url).text
json_dict = json.loads(res)
#pprint(json_dict)
for i in json_dict["data"]:
oid = i["cid"]
api = "https://api.bilibili.com/x/v1/dm/list.so?oid="
url = api + str(oid)
print(url)
結果は次のとおりです
。7つのビデオの箇条書きデータに対応する合計7つのURLがあります。
表示するには、1つをクリックするだけです。
4.定期的にブレットチャットデータを抽出して保存します
完全なURLを取得したら、その中のデータを抽出するだけです。ここでは、正規表現を直接使用します。あなたにそれを説明するために例としてビデオの1つを取り上げましょう。
final_url = "https://api.bilibili.com/x/v1/dm/list.so?oid=437729555"
final_res = requests.get(final_url)
final_res.encoding = chardet.detect(final_res.content)['encoding']
final_res = final_res.text
pattern = re.compile('<d.*?>(.*?)</d>')
data = pattern.findall(final_res)
with open("弹幕.txt", mode="w", encoding="utf-8") as f:
for i in data:
f.write(i)
f.write("\n")
結果は次のようになります。
これは1ページのデータであり、合計で7200のデータがあります。
完全なコード
上記では、プロセスの各ステップを段階的に説明しました。ここでは、コードを関数に直接カプセル化します。
import os
import requests
import json
import re
import chardet
# 获取cid
def get_cid():
url = 'https://api.bilibili.com/x/player/pagelist?bvid=BV1EP4y1j7kV&jsonp=jsonp'
res = requests.get(url).text
json_dict = json.loads(res)
cid_list = []
for i in json_dict["data"]:
cid_list.append(i["cid"])
return cid_list
# 拼接url
def concat_url(cid):
api = "https://api.bilibili.com/x/v1/dm/list.so?oid="
url = api + str(cid)
return url
# 正则提取数据
def get_data(url):
final_res = requests.get(url)
final_res.encoding = chardet.detect(final_res.content)['encoding']
final_res = final_res.text
pattern = re.compile('<d.*?>(.*?)</d>')
data = pattern.findall(final_res)
return data
# 保存数据
def save_to_file(data):
with open("弹幕数据.txt", mode="a", encoding="utf-8") as f:
for i in data:
f.write(i)
f.write("\n")
cid_list = get_cid()
for cid in cid_list:
url = concat_url(cid)
data = get_data(url)
save_to_file(data)
結果は次のとおりです。
本当に素晴らしい、合計3.1wのデータです。
乳母レベルの単語クラウドマップ作成チュートリアル
得られたデータは、EDG背景画像を使用して見栄えの良い単語雲画像を作成します。
# 1 导入相关库
import pandas as pd
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from imageio import imread
import warnings
warnings.filterwarnings("ignore")
# 注意:动态添加词语集
for i in ["EDG","永远的神","yyds","牛逼","发来贺电"]
jieba.add_word(i)
# 2 读取文本文件,并使用lcut()方法进行分词
with open("弹幕数据.txt",encoding="utf-8") as f:
txt = f.read()
txt = txt.split()
txt = [i.upper() for i in txt]
data_cut = [jieba.lcut(x) for x in txt]
# 3 读取停用词
with open("stoplist.txt",encoding="utf-8") as f:
stop = f.read()
stop = stop.split()
stop = [" "] + stop
# 4 去掉停用词之后的最终词
s_data_cut = pd.Series(data_cut)
all_words_after = s_data_cut.apply(lambda x:[i for i in x if i not in stop])
# 5 词频统计
all_words = []
for i in all_words_after:
all_words.extend(i)
word_count = pd.Series(all_words).value_counts()
# 6 词云图的绘制
# 1)读取背景图片
back_picture = imread("EDG.jpg")
# 2)设置词云参数
wc = WordCloud(font_path="simhei.ttf",
background_color="white",
max_words=1000,
mask=back_picture,
max_font_size=200,
random_state=42
)
wc2 = wc.fit_words(word_count)
# 3)绘制词云图
plt.figure(figsize=(16,8))
plt.imshow(wc2)
plt.axis("off")
plt.show()
wc.to_file("ciyun.png")
結果は次のとおりです。