爬取华农兄弟b站评论
竹鼠的N种si法在前段时间十分的火,中暑了,打架受伤了,吃太多了都成为了华农兄弟吃竹鼠的理由,所以今年就来看看华农兄弟b站的评论是什么样的
首先要知道b站的评论是有一个单独的文件的,所以我们要找到这个文件,那么在chorme浏览器中打开开发者选项的network,
如果是空白的,那么刷新一下就有了,如图前面为reply的这个文件就是我们要寻找的文件,如果找不到那么可能是页面未完全刷新或是b站改变了相关的页面策略
而在preview中可以发现这是json格式的,将其展开,可以发现是一个多重的字典
所以最终获得评论,点赞数等就是对这个多重字典进行操作,如要获取评论,则可以用类似于coment["content"]["message"]来获取,而comment是一个对象
而另外一个关键是获得所有的文档,如果下载则需要下载很多个文档,因为每页评论是一个文档。所以应该动态的获取。而将鼠标移动到刚才的reply开头的文档,会浮现出一个链接,这时右键拷贝链接并在浏览器中打开,会发现无法打开。但是若对此链接进行一些处理即可打开。
如上图所示,链接只剩下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是电脑无法识别的,所以可以考虑进行数据清洗):
上一篇: [数据挖掘]数据预处理-缺失值处理
下一篇: mysql监控执行的sql语句