[Python] Utilisez Python comme un simple crawler pour explorer les commentaires de la station B

Table des matières

Introduction

2. Analyser les pages Web

3. Coder

1. tête

2. Obtenez un commentaire racine

3. Obtenez les commentaires des enfants

Quatre, le code total

V. Résumé


Introduction

        Il n'y a pas de fonction de recherche pour les commentaires Bilibili, j'ai donc écrit un crawler pour explorer les commentaires Bilibili et les stocker dans un fichier txt local

        Tout d'abord, vous devez installer la bibliothèque de requêtes de python et la bibliothèque beautifulsoup

demandes d'installation pip

pip installer bs4

        Si s'affiche avec succès, cela signifie que l'installation est réussie

        Voici toutes les bibliothèques nécessaires

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

2. Analyser les pages Web

        Exemple de page Web         Lanyin "Explorer la fenêtre" BV18T411G7xJ

        Nous avons vérifié le code source de la page et constaté qu'il n'y avait aucune information sur les commentaires dans le code source. Nous avons continué à glisser jusqu'à la position du commentaire et avons constaté que le commentaire prenait un certain temps à se charger avant d'apparaître. À ce moment, j'ai deviné que nous devions capturer le package pour obtenir les informations du commentaire.

        Ouvrez F12, interrogez les options liées à la réponse dans le réseau et recherchez les informations de commentaire.

         J'ai extrait l'URL et vérifié les différentes données à l'intérieur

      

         Je ne sais pas pourquoi l'URL ici doit supprimer les données derrière le rappel pour l'afficher normalement

Téléchargez Json Formatter          dans Edge pour une meilleure vue.

        Nous avons constaté qu'un paquet ne peut pas afficher tous les commentaires, nous continuons à glisser vers le bas, recherchons des données sur la réponse dans F12 et extrayons l'URL

        On constate que seul next changera, alors qu'est-ce que next=1 ? En pratique, on constate que les données de next=1 et next=0 sont les mêmes, on peut donc partir directement de 1 lors de la programmation.

        Mais nous avons constaté qu'il n'y a que le commentaire racine et aucun sous-commentaire. Nous soupçonnons que les sous-commentaires se trouvent dans un autre package. Vérifiez les sous-commentaires de l'un des commentaires et nous avons détecté un nouveau package dans F12 .

        De même, nous extrayons l'URL et observons que les réponses sont les sous-commentaires requis. De même, toutes les réponses ne peuvent pas être affichées sur une seule page.Après observation, on constate que seul le pn de chaque commentaire est différent.

         Alors, comment les sous-commentaires et les commentaires racine sont-ils liés ?

        En observant l'URL, nous avons constaté que l'URL du sous-commentaire a la racine, nous avons donc étudié la cohérence entre la racine et le sous-commentaire, et avons constaté que le rpid de la racine est la racine du sous- commentaire , donc nous trouvé la relation.

         Enfin, lors de l'écriture du code, j'ai trouvé un problème, c'est-à-dire que certains commentaires racine n'ont pas besoin d'être développés, donc l'élément de réponse dans le package de sous-commentaires est vide, et les informations de ces commentaires existent dans le package de commentaires de tige , nous n'avons qu'à simplement le juger.

        Une fois que vous avez compris la structure, la programmation est beaucoup plus simple.

3. Coder

1. tête

#网页头
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. Obtenez un commentaire racine

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. Obtenez les commentaires des enfants

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 cette façon, tous les modules sont assemblés

Quatre, le code 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. Résumé

        Le code que j'ai écrit par moi-même est nul, bienvenue pour me corriger.

Je suppose que tu aimes

Origine blog.csdn.net/ClushioAqua/article/details/129834114
conseillé
Classement