欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

爬取华农兄弟b站评论

程序员文章站 2024-03-25 17:29:30
...

竹鼠的N种si法在前段时间十分的火,中暑了,打架受伤了,吃太多了都成为了华农兄弟吃竹鼠的理由,所以今年就来看看华农兄弟b站的评论是什么样的

首先要知道b站的评论是有一个单独的文件的,所以我们要找到这个文件,那么在chorme浏览器中打开开发者选项的network,

如果是空白的,那么刷新一下就有了,如图前面为reply的这个文件就是我们要寻找的文件,如果找不到那么可能是页面未完全刷新或是b站改变了相关的页面策略

爬取华农兄弟b站评论

 

而在preview中可以发现这是json格式的,将其展开,可以发现是一个多重的字典

爬取华农兄弟b站评论

所以最终获得评论,点赞数等就是对这个多重字典进行操作,如要获取评论,则可以用类似于coment["content"]["message"]来获取,而comment是一个对象

而另外一个关键是获得所有的文档,如果下载则需要下载很多个文档,因为每页评论是一个文档。所以应该动态的获取。而将鼠标移动到刚才的reply开头的文档,会浮现出一个链接,这时右键拷贝链接并在浏览器中打开,会发现无法打开。但是若对此链接进行一些处理即可打开。

爬取华农兄弟b站评论

如上图所示,链接只剩下pn,type和oid三个参数,也只需要这三个参数就能打开对应的json形式的字典。而获取多个页面值需要修改pn参数即可。

 

import requests
import json
import time
import csv

def parse_url(html):
    try:
        #加载json字符串
        reply_data = json.loads(html)
    except:
        print("error")
    
    commentlist = []
    hlist = []
 
    hlist.append("序号")
    hlist.append("名字")
    hlist.append("性别")
    hlist.append("时间")
    hlist.append("评论")
    hlist.append("点赞数")
    hlist.append("回复数")
    #获取数据
    for i in range(20):
        comment = reply_data["data"]["replies"][i]
        rlist = []
        
        username = comment["member"]["uname"]    #用户名
        sex = comment["member"]["sex"]           #性别
        ctime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(comment['ctime']))   #发表时间
        content = comment["content"]["message"]        #评论
        like = comment["like"]                         #点赞数
        rcount = comment["rcount"]                     #回复数
        
        rlist.append(username)
        rlist.append(sex)
        rlist.append(ctime)
        rlist.append(content)
        rlist.append(like)
        rlist.append(rcount)
        
        commentlist.append(rlist)
        #print(commentlist)
    #写入文件
    write_to_file(commentlist)

def fetch(url):
    headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
    }
    try:
        res = requests.get(url,headers = headers)
        html = res.text
        return html
    except:
        print("error")

def write_to_file(comment_list):
    #保存为txt文件
    file = open("comment.txt","a",encoding="utf-8")
    file.write(str(comment_list))
    file.close()
    
if __name__ == "__main__":
    for page in range(1,54):
        #动态生成链接
        url_ = "https://api.bilibili.com/x/v2/reply?pn={page}&type=1&oid=30430636"
        url = url_.format(page = page)
        #获取对应的json字符串
        html = fetch(url)
        #获取相关数据
        parse_url(html)
        #每爬取10个页面睡眠5秒
        if(page % 10 == 0):
            time.sleep(5)
        

最后发现可能有错误,是列表错误,因为有的页面评论数小于20,所以会报错,但是不影响结果。也可以动态的获取评论数,这里不予展示了,各位看官可以自行发挥。

最终保存的结果(用txt文本效果一般,不便于观看,也可以保存为csv格式便于观看,且b站有许多emoji是电脑无法识别的,所以可以考虑进行数据清洗):

爬取华农兄弟b站评论