[Python] Use Python como un rastreador simple para rastrear los comentarios de la estación B

Tabla de contenido

I. Introducción

2. Analizar páginas web

3. Código

1. cabeza

2. Obtener comentario raíz

3. Obtener comentarios de niños

Cuatro, el código total

V. Resumen


I. Introducción

        No hay una función de búsqueda para los comentarios de Bilibili, así que escribí un rastreador para rastrear los comentarios de Bilibili y almacenarlos en txt local.

        Primero, debe instalar la biblioteca de solicitudes de python y la biblioteca beautifulsoup

solicitudes de instalación de pip

pip instalar bs4

        Si aparece correctamente, significa que la instalación se ha realizado correctamente.

        Aquí están todas las bibliotecas necesarias

import requests
from bs4 import BeautifulSoup
import re
import json
from pprint import pprint
import time

2. Analizar páginas web

        Ejemplo de página web         Lanyin "Explorando la ventana" BV18T411G7xJ

        Verificamos el código fuente de la página y encontramos que no hay información sobre los comentarios en el código fuente. Continuamos deslizándonos hacia abajo hasta la posición del comentario, y encontramos que el comentario tardó un poco en cargarse antes de aparecer. En este momento, supuse que necesitábamos capturar el paquete para obtener la información del comentario.

        Abra F12, consulte las opciones relacionadas con la respuesta en la red y encuentre la información del comentario.

         Extraje la URL y revisé los diversos datos dentro

      

         No sé por qué la URL aquí necesita eliminar los datos detrás de la devolución de llamada para verlos normalmente.

Descargue Json Formatter          en Edge para una mejor vista.

        Encontramos que un paquete no puede mostrar todos los comentarios, continuamos deslizándonos hacia abajo, buscamos datos sobre la respuesta en F12 y extraemos la URL

        Se encuentra que solo cambiará el próximo, entonces, ¿qué es el próximo = 1? En la práctica, se encuentra que los datos de next=1 y next=0 son los mismos, por lo que podemos comenzar directamente desde 1 al programar.

        Pero descubrimos que solo hay el comentario raíz y no hay subcomentarios. Sospechamos que los subcomentarios están en otro paquete. Verifique los subcomentarios de uno de los comentarios, y hemos capturado un nuevo paquete en F12.

        Del mismo modo, extraemos la URL y observamos que las respuestas son los subcomentarios necesarios. Del mismo modo, todas las respuestas no se pueden mostrar en una página.Después de la observación, se encuentra que solo el pn de cada comentario es diferente.

         Entonces, ¿cómo se relacionan los subcomentarios y los comentarios raíz?

        Al observar la URL, encontramos que la URL del subcomentario tiene raíz, por lo que estudiamos la consistencia entre la raíz y el subcomentario, y encontramos que el rpid de la raíz es la raíz del subcomentario , por lo que encontró la relación.

         Finalmente, al escribir el código, encontré un problema, es decir, algunos comentarios raíz no necesitan expandirse, por lo que el elemento de respuestas en el paquete de subcomentarios está vacío, y la información de estos comentarios existe en el paquete de comentarios raíz. , solo necesitamos simplemente simplemente juzgarlo.

        Una vez que comprende la estructura, la programación es mucho más simple.

3. Código

1. cabeza

#网页头
headers = {
    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36",
    "referer" : "https://www.bilibili.com/"
}

2. Obtener comentario raíz

def get_rootReply(headers):
    num = 1
    replay_index = 1
    while True:
        URL = (f"https://api.bilibili.com/x/v2/reply/main?&jsonp=jsonp&next={num}&type=1&oid=470113786&mode=3&plat=1&_=1680096302818")   #获得网页源码
        respond = requests.get(URL , headers = headers) # 获得源代码 抓包
        # print(respond.status_code)
        reply_num = 0
        if(respond.status_code == 200): # 如果响应为200就继续,否则退出
            respond.encoding = "UTF-8"
            html = respond.text
            json_html = json.loads(html)    # 把格式转化为json格式 一个是好让pprint打印,一个是好寻找关键代码
            
            if json_html['data']['replies'] is None or len(json_html['data']['replies']) == 0 :
                break

            for i in range(0,len(json_html['data']['replies'])):   #一页只能读取20条评论
                reply = json_html['data']['replies'][reply_num]['content']['message']
                root = json_html['data']['replies'][reply_num]['rpid']
                reply = reply.replace('\n',',')
                # print(reply)
                file.write(str(replay_index) + '.' + reply + '\n')
                if json_html['data']['replies'][reply_num]['replies'] is not None:
                    if(get_SecondReply(headers,root) == 0):
                        for i in range(0,len(json_html['data']['replies'][reply_num]['replies'])):
                            reply = json_html['data']['replies'][reply_num]['replies'][i]['content']['message']
                            reply = reply.replace('\n',',')
                            file.write("        " + reply + '\n')
                reply_num += 1 
                replay_index += 1
            num += 1
            
            time.sleep(0.5)
        else :
            print("respond error!")
            break
    file.close()

3. Obtener comentarios de niños

def get_SecondReply(headers,root):
    pn = 1
    while True:
        URL = (f"https://api.bilibili.com/x/v2/reply/reply?jsonp=jsonp&pn={pn}&type=1&oid=824175427&ps=10&root={root}&_=1679992607971")
        respond = requests.get(URL , headers = headers) # 获得源代码 抓包
        reply_num = 0
        if(respond.status_code == 200):
            respond.encoding = "UTF-8"
            html = respond.text
            json_html = json.loads(html)
            
            if json_html['data']['replies'] is None:
                if(pn == 1):
                    return 0
                else :
                    return 1
            
            for i in range(0,len(json_html['data']['replies'])):
                if json_html['data']['replies'] is None:
                    break
                reply = json_html['data']['replies'][reply_num]['content']['message']
                reply = reply.replace('\n',',')
                # print(reply)
                reply_num += 1
                file.write("        " + reply + '\n')
            pn += 1
            time.sleep(0.5)
        else:
            print("Sreply error!")
            exit(-1)

De esta manera, todos los módulos se ensamblan

Cuatro, el código total

import requests
from bs4 import BeautifulSoup
import re
import json
from pprint import pprint
import time

#网页头
headers = {
    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36",
    "referer" : "https://www.bilibili.com/"
}

file = open('lanyin.txt', 'w',encoding='utf-8')

def get_SecondReply(headers,root):
    pn = 1
    while True:
        URL = (f"https://api.bilibili.com/x/v2/reply/reply?jsonp=jsonp&pn={pn}&type=1&oid=824175427&ps=10&root={root}&_=1679992607971")
        respond = requests.get(URL , headers = headers) # 获得源代码 抓包
        reply_num = 0
        if(respond.status_code == 200):
            respond.encoding = "UTF-8"
            html = respond.text
            json_html = json.loads(html)
            
            if json_html['data']['replies'] is None:
                if(pn == 1):
                    return 0
                else :
                    return 1
            
            for i in range(0,len(json_html['data']['replies'])):
                if json_html['data']['replies'] is None:
                    break
                reply = json_html['data']['replies'][reply_num]['content']['message']
                reply = reply.replace('\n',',')
                # print(reply)
                reply_num += 1
                file.write("        " + reply + '\n')
            pn += 1
            time.sleep(0.5)
        else:
            print("Sreply error!")
            exit(-1)

    
def get_rootReply(headers):
    num = 1
    replay_index = 1
    while True:
        URL = (f"https://api.bilibili.com/x/v2/reply/main?&jsonp=jsonp&next={num}&type=1&oid=470113786&mode=3&plat=1&_=1680096302818")   #获得网页源码
        respond = requests.get(URL , headers = headers) # 获得源代码 抓包
        # print(respond.status_code)
        reply_num = 0
        if(respond.status_code == 200): # 如果响应为200就继续,否则退出
            respond.encoding = "UTF-8"
            html = respond.text
            json_html = json.loads(html)    # 把格式转化为json格式 一个是好让pprint打印,一个是好寻找关键代码
            
            if json_html['data']['replies'] is None or len(json_html['data']['replies']) == 0 :
                break

            for i in range(0,len(json_html['data']['replies'])):   #一页只能读取20条评论
                reply = json_html['data']['replies'][reply_num]['content']['message']
                root = json_html['data']['replies'][reply_num]['rpid']
                reply = reply.replace('\n',',')
                # print(reply)
                file.write(str(replay_index) + '.' + reply + '\n')
                if json_html['data']['replies'][reply_num]['replies'] is not None:
                    if(get_SecondReply(headers,root) == 0):
                        for i in range(0,len(json_html['data']['replies'][reply_num]['replies'])):
                            reply = json_html['data']['replies'][reply_num]['replies'][i]['content']['message']
                            reply = reply.replace('\n',',')
                            file.write("        " + reply + '\n')
                reply_num += 1 
                replay_index += 1
            num += 1
            
            time.sleep(0.5)
        else :
            print("respond error!")
            break
    file.close()

if __name__ == '__main__':
    get_rootReply(headers)
    print("sucessful")

V. Resumen

        El código que escribí por mí mismo es basura, bienvenido a corregirme.

Supongo que te gusta

Origin blog.csdn.net/ClushioAqua/article/details/129834114
Recomendado
Clasificación