爬取华农兄弟b站评论

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

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

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

爬取华农兄弟b站评论_第1张图片

 

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

爬取华农兄弟b站评论_第2张图片

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

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

爬取华农兄弟b站评论_第3张图片

如上图所示,链接只剩下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站评论_第4张图片

你可能感兴趣的:(爬虫,华农兄弟,爬取评论,爬虫)