Bombardeo de la estación B
Visión general
Vi a algunas personas en Internet haciendo una visualización de datos de bombardeo en la estación superior, lo que me pareció bastante interesante, así que lo hice yo mismo (sin visualización). ¡Bendice a Wuhan, bendice a China!
Realización de proyectos
(1) Obtención de los datos del bombardeo. Originalmente pensé en obtener los datos del bombardeo de todos los videos de un determinado up, pero luego encontré un problema: los datos del bombardeo se almacenan en JSON o XMl. Los datos se identifican con un número de identificación. Pensé que era el número av del video, pero cuando revisé los elementos, descubrí que no lo era. Consulte algunos documentos en Internet y descubrió que los datos del bombardeo se almacenan en una URL, por lo que solo se necesita el contenido de esta URL.
(2) Para obtener datos, simplemente utilice el módulo de solicitudes que utilizan los rastreadores
(3) Analizar los datos
(4) Persistencia de datos y procesamiento simple de datos
inicialización
Primero inicialice algunos parámetros básicos que deben usarse a continuación
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 = []
Inicialice sus propios encabezados e inicialice una URL básica. Luego, inicialice algunos parámetros que se utilizarán a continuación.
Obtener página web
Obtenga información de la página web y almacene los datos localmente
# 获取信息
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
Datos analíticos
Analizar la página web y almacenar toda la información del bombardeo en la lista de 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))
Persistencia de datos
Procesamiento simple de los datos adquiridos, y persistencia, porque hay otras operaciones posteriores, así que guardé dos formularios.
# 对获取的弹幕数据进行简单处理
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')
En términos generales, finaliza después de que se conservan los datos, pero para las siguientes operaciones, aquí estoy haciendo una función de contar un cierto aluvión de palabras clave
# 对含有某关键字的弹幕计数
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))
Utilizo el siguiente segmento de programa para llamar al rastreador completo.
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()
Complete una lista oid en el rango, recorra esta lista para obtener los datos del bombardeo. Si no hay una lista de oid conocida, se puede recorrer como mi método anterior.
La interfaz de ejecución es la siguiente.