本帖最后由 303516225 于 2019-2-12 22:47 编辑
今天看到python爬取b站的信息的文章,给大家分享一下。
数据获取
在获取视频评论之前,我们首要做的就是分析其网页结构,寻找目标数据(也就是我们要的评论数据在哪里,这点很重要)
最终发现,目标数据的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()
|