Barrage de la station B
Aperçu
J'ai vu des personnes sur Internet qui ont fait une visualisation de données de barrage en amont, ce qui me semblait assez intéressant, alors je l'ai fait moi-même (sans visualisation). Bénissez Wuhan, bénissez la Chine!
Réalisation de projet
(1) Obtention des données de barrage.J'ai d'abord pensé obtenir les données de barrage de toutes les vidéos d'un certain up, mais j'ai trouvé plus tard un problème: les données de barrage sont stockées en JSON ou XMl. Les données sont identifiées par un numéro d'identification. Je pensais que c'était le numéro AV de la vidéo, mais lorsque j'ai vérifié les éléments, j'ai constaté que ce n'était pas le cas. Reportez-vous à certains documents sur Internet et constatez que les données de barrage sont stockées dans une URL, donc seul le contenu de cette URL est nécessaire.
(2) Pour obtenir des données, utilisez simplement le module de requêtes auquel les robots d'exploration sont habitués
(3) Analyser les données
(4) Persistance des données et traitement simple des données
initialisation
Initialisez d'abord quelques paramètres de base qui doivent être utilisés ci-dessous
def __init__(self):
self.headers = {
# 自己添加自己的即可
}
self.base_url = 'https://api.bilibili.com/x/v1/dm/list.so?oid={}'
self.url = ''
self.barrage_result = []
self.danmu = []
self.danmu_count = []
Initialisez vos propres en-têtes et initialisez une URL de base. Ensuite, initialisez quelques paramètres à utiliser ci-dessous.
Obtenir la page Web
Obtenez des informations sur la page Web et stockez les données localement
# 获取信息
def get_page(self):
# 延时操作,防止太快爬取
time.sleep(0.5)
response = requests.get(self.url, headers=self.headers)
with open('bilibili.xml', 'wb') as f:
f.write(response.content
Données analytiques
Analysez la page Web et stockez toutes les informations de barrage dans la liste danmu
# 解析网页 将所有弹幕信息存储在danmu列表中
def param_page(self):
time.sleep(1)
if self.barrage_result:
# 文件路径,html解析器
html = etree.parse('bilibili.xml', etree.HTMLParser())
# xpath解析,获取当前所有的d标签下的所有文本内容
results = html.xpath('//d//text()')
# 将去重后的弹幕存储起来
for one in results:
self.danmu.append(one)
print('总的实时弹幕数量:', len(self.danmu))
Persistance des données
Traitement simple des données acquises, et persistance, car il y a d'autres opérations plus tard, j'ai donc sauvegardé deux formulaires.
# 对获取的弹幕数据进行简单处理
def ana_result(self):
print('开始处理弹幕')
for one_danmu in self.danmu:
if one_danmu not in self.danmu_count:
self.danmu_count.append(one_danmu)
print('弹幕去重后数量为:', len(self.danmu_count))
with open('tanmu.txt', 'w', encoding='utf-8') as f:
for danmu in self.danmu_count:
# 数量的统计
amount = self.danmu.count(danmu)
f.write(danmu + ':' + str(amount) + '\n')
book = xlwt.Workbook(encoding='utf-8-sig', style_compression=0)
sheet = book.add_sheet('B站部分视频弹幕', cell_overwrite_ok=True)
sheet.write(0, 0, '弹幕内容')
sheet.write(0, 1, '弹幕出现次数')
n = 1
for danmu in self.danmu_count:
amount = self.danmu.count(danmu)
sheet.write(n, 0, danmu)
sheet.write(n, 1, amount)
n = n + 1
book.save(u'B站部分视频弹幕.xls')
De manière générale, cela se termine après la persistance des données, mais pour les opérations suivantes, je fais ici une fonction de comptage d'un certain barrage de mots-clés
# 对含有某关键字的弹幕计数
def key_count(self, key):
value = key
pattern = '.*' + value + '.*'
tempList = []
for one in self.danmu:
obj = re.findall(pattern, one)
if len(obj) > 0:
tempList.extend(obj)
print('弹幕中含有', key, '的弹幕数量为:', len(tempList))
J'utilise le segment de programme suivant pour appeler l'ensemble du robot.
def run(self):
for i in range(145134329, 145144329):
self.get_url(i)
self.barrage_result = self.get_page()
self.param_page()
self.key_count('武汉加油')
self.key_count('武汉')
self.ana_result()
Remplissez une liste oid dans la plage, parcourez cette liste pour récupérer les données du barrage. S'il n'y a pas de liste oid connue, elle peut être parcourue comme ma méthode ci-dessus.
L'interface d'exécution est la suivante.