登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] python网页爬取——B站,改革春风吹满地

[复制链接]
发表于 2019-2-12 22:46:08 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 编程
学习安排: 用python爬取B站的数据并分析
开始时间: 2019-02-12
结束时间:
本帖最后由 303516225 于 2019-2-12 22:47 编辑

今天看到python爬取b站的信息的文章,给大家分享一下。


数据获取


在获取视频评论之前,我们首要做的就是分析其网页结构,寻找目标数据(也就是我们要的评论数据在哪里,这点很重要)



224608hao9s65p6jy69ewz.jpg
最终发现,目标数据的url链接为:

https://api.bilibili.com/x/v2/reply?&type=1&oid=19390801&pn=1


由上图可看出,其评论数据是以json数据形式存在于网页端的,可看出一共有1946页评论,每页评论20条,总评论63579条(楼层下面存在评论)。今天恋习Python与大家一起主要是爬取楼层评论,共1940*20=38920条。


接下来,就爬取思路很明确,从一个JSON文件开始,爬完20条评论,更改路径后获取第二个JSON文件,以此类推,直到爬完所有的评论数据。


我们主要爬取的数据信息有8个维度,如下:

楼层  时间  点赞数  昵称  性别  等级  评论内容   回复数

详细代码:

importrequests
fromfake_useragentimportUserAgent
importjson
importtime
importpandasaspd

#下载网页评论数据
defget_page_json(url):
try:
ua=UserAgent(verify_ssl=False)
headers={"User-Agent":ua.random}
json_comment=requests.get(url,headers=headers).text
returnjson_comment
except:
returnNone

#解析网页评论数据
defparse_page_json(json_comment):
try:
comments=json.loads(json_comment)
except:
return"error"

comments_list=[]
#获取当页数据有多少条评论(一般情况下为20条)
num=len(comments['data']['replies'])

foriinrange(num):
comment=comments['data']['replies']
comment_list=[]
floor=comment['floor']
ctime=time.strftime("%Y-%m-%d%H:%M:%S",time.localtime(comment['ctime']))#时间转换
likes=comment['like']
author=comment['member']['uname']
sex=comment['member']['sex']
level=comment['member']['level_info']['current_level']
content=comment['content']['message'].replace('\n','')#将评论内容中的换行符去掉
#print(content)
rcount=comment['rcount']
comment_list.append(floor)
comment_list.append(ctime)
comment_list.append(likes)
comment_list.append(author)
comment_list.append(sex)
comment_list.append(level)
comment_list.append(content)
comment_list.append(rcount)

comments_list.append(comment_list)

save_to_csv(comments_list)


defsave_to_csv(comments_list):
data=pd.DataFrame(comments_list)
#注意存储文件的编码为utf_8_sig,不然会乱码,后期会单独深入讲讲为何为这样(如果为utf-8)
data.to_csv('春晚鬼畜_1.csv',mode='a',index=False,sep=',',header=False,encoding='utf_8_sig')


defmain():
base_url="https://api.bilibili.com/x/v2/reply?&type=1&oid=19390801&pn=1"
#通过首页获取评论总页数
pages=int(json.loads(get_page_json(base_url))['data']['page']['count'])//20
forpageinrange(pages):
url="https://api.bilibili.com/x/v2/reply?&type=1&oid=19390801&pn="+str(page)
json_comment=get_page_json(url)
parse_page_json(json_comment)
print("正在保存第%d页"%int(page+1))

ifpage ==0:
time.sleep(5)

main()

好懒~~不想说~~~
发表于 2019-2-13 15:02:01 | 显示全部楼层
同学,B站上找资料,你给我解锁了B站的新玩法
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表