Visualización simple del rastreador de etiquetas Bilibili
1. Introducción básica
Bilibili ha seguido la tendencia de los nuevos medios online en los últimos años, atrayendo cada vez a más gente a unirse a su plataforma con su plan de incentivos a la creación y produciendo un gran número de obras. Pero como un maestro, ¿cómo elegir un tema adecuado para la creación, puede rastrear y analizar algunos datos del sitio web, para obtener el contenido que más les gusta a los usuarios en un cierto período de tiempo? De acuerdo con esta intención original, observé el contenido del sitio web de la estación B y descubrí que contenía una tabla de clasificación, así que me pregunté si podría rastrear los enlaces de video de la tabla de clasificación y obtener los datos similares de todos los videos, etc., y usar estos datos como Asignar pesos a las etiquetas del video y visualizarlos, sin embargo, como acabo de aprender crawlers y python, el código puede tener todavía algunas deficiencias, pero la idea inicial básicamente se puede realizar.
2. Herramientas utilizadas
Configuración regional: versión python3.7
Biblioteca de terceros: selenium (dado que la estación b usa una URL renderizada dinámicamente, puede usar selenium para rastrear información renderizada dinámicamente), BeautifulSoup, pytagcloud, pygame
3. Preparación preliminar
selenium: Aquí uso el Chrome de selenium.webdriver, por lo que necesito instalar la versión correspondiente de ChromeDriver descargada de la computadora, que se puede obtener a través de la red espejo.
Los detalles se pueden conocer a través de: https://www.cnblogs.com/lfri/p/10542797.html , creo que este es muy detallado.
BeautifulSoup: Puede obtenerlo directamente a través de pip: pip3 install beautifulsoup4
pytagcloud: Consígalo: pip3 install pytagcloud
Pero debe asegurarse de que pygame esté instalado cuando lo use, porque pytagcloud ha importado esta biblioteca. El primer parámetro pasado a su función make_tags() debe ser un objeto de la clase dict_items, que se puede obtener mediante los elementos del diccionario() (python3).
Configuración de fuente china de pytagcloud:
1. Abra la carpeta de fuentes en la carpeta pytagcloud y mueva el archivo ttf de la fuente correspondiente a ella.
2. Abra el archivo fonts.json en fuentes y escriba las fuentes añadidas en el archivo. Tenga en cuenta que
el nombre de fuente pasado por la función de formato del archivo json es el "nombre" correspondiente. Si no hay un archivo chino, el chino ¡La nube de palabras no se puede generar!
4. Implementación del código
(1) Rastrear la tabla de clasificación de la estación B
from selenium import webdriver
from bs4 import BeautifulSoup
import time
class LinkCatch:
'返回视频网址列表'
_url = ''
_brower = webdriver.Chrome()
_html=''
_arrLink =[]
def __init__(self, url:str):
self._url=url#设置排行榜的url
def __catch(self):
print('LinkCatch.catch()正在运行。。。')
self._brower.get(self._url)
time.sleep(3)#等待,防止爬取到未加载完毕的网址
self._html=self._brower.page_source
def __dataAnalyze(self):
print('LinkCatch.dataAnalyze()正在运行。。。')
soup = BeautifulSoup(self._html,'lxml')
temparr = soup.find_all(class_='rank-item')
for item in temparr:
self._arrLink.append(item.a['href'])#储存网址
def run(self):
#获取并返回网址列表
self.__catch()
self.__dataAnalyze()
#self._brower.close()
return self._arrLink
(2) Obtener información numérica y etiquetas como el número de Me gusta del enlace del video
class DataCatch:
'返回一个字典数组,包含标签与硬币点赞数的总数(权值化)'
_linkArr=[]
_likeRate = 1
_coinRate = 1
_shareRate = 1
_collectRate = 1
_brower = webdriver.Chrome()
__keyword = ['share','collect','coin','like']
__timeout = 3 #设置睡眠等待时间,可以使得未获取的视频数据变少
__defaultList=[]
def __init__(self, linkArr,rate:int=1000):
#传入网址列表
self._linkArr = linkArr
def setRate(self,share:float,collect:float,coin:float,like:float):
#设置不同数值的权占比
print('DataCatch.setRate()正在运行。。。')
self. _likeRate =like
self._coinRate=coin
self._shareRate =share
self._collectRate =collect
def __dataDeal(self,arr):
#返回不同数值权占比乘以其数值之和 初始化为1:1:1:1
print('DataCatch.dataDeal()正在运行。。。')
temparr =[]
for item in arr:#处理字符串含有的‘万’
temp =0
if not item.isdigit():
temp += float(item.split('万')[0])
temp*=10000
else:
temp=float(item)
temparr.append(temp)
total = 0
total = temparr[0]* self._shareRate+temparr[1]*self._collectRate+temparr[2]*self._coinRate+temparr[3]*self. _likeRate
return total
def __synthesis(self,tagArr,numberArr):
#传入标签数组和硬币等数量数组,返回一个标签与权值字典,即将一个视频的标签和其权值合成
print('DataCatch.synthesis()正在运行。。。')
N=self.__dataDeal(numberArr)
dic ={
}
for item in tagArr:
dic.update({
item:N})
return dic
def __catchdata(self):
#获取所需视频网址的所有信息
print('DataCatch.catchdata()正在运行。。。')
dic= {
}
for item in self._linkArr:
tagArr = []
numberArr=[]
self._brower.get(item)
time.sleep(self.__timeout)
for name in self.__keyword:
numberArr.append(self._brower.find_element_by_class_name(name).text)
if not numberArr[0].split('万')[0].split('.')[0].isdigit() :
#判别是否抓取到未渲染完成的网址,是的话将其放入defualtlist,这里未对未渲染完成的网址进行重新获取
print("Link"+item+"doesn't got!")
self.__defaultList.append(item)
continue
soup =BeautifulSoup(self._brower.page_source,'lxml')
for item in soup.find_all(name='li',class_='tag'):
tagArr.append(item.a.text)
tempdic = self.__synthesis(tagArr,numberArr)
keyArr = tempdic.keys()
for item in keyArr:
#如果标签已经存在在字典里,将其权值与字典里的权值相加,得到新的权值,如果没有,将标签与其权值放进字典
if item in dic:
dic.update({
item:dic.get(item)+tempdic.get(item)})
else:
dic.update({
item:tempdic.get(item)})
return dic
def printDefaultList(self):
i=1
for item in self.__defaultList:
print(i + item)
i=i+1
def getDefaultList(self):
#用于重新获取,不过懒得写重新获取了,dbq
return self.__defaultList
def run(self):
#返回标签及其权值的字典,以供可视化使用
print('DataCatch.run()正在运行。。。')
self.printDefaultList()
return self.__catchdata()
(3) Visualizar
if __name__ =='__main__':
from pytagcloud import create_tag_image, make_tags
from pytagcloud.lang.counter import get_tag_counts
url='https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'#B站排行榜的URL
linkArr = LinkCatch(url).run()
dic = DataCatch(linkArr).run()
count = dic.items()
tags = make_tags(count, maxsize=120)#maxsize设置字体的最大大小
create_tag_image(tags, 'D://TEST//B站爬虫测试.png', size=(1000,1000), fontname='Deng')#这里的Deng为等线字体,需要自己添加进pytagcloud的字体库中
(4) Productos terminados obtenidos