Una 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.
inserte la descripción de la imagen aquí
2. Abra el archivo fonts.json en fuentes y escriba las fuentes añadidas en el archivo. Tenga en cuenta que
inserte la descripción de la imagen aquí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
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/YmgmY/article/details/106110676
Recomendado
Clasificación