python 获取本地视频信息_Python利用B站API获取视频信息

本帖最后由 skeep 于 2017-7-23 12:28 编辑

Python利用B站API获取视频信息

这两天工作中需要写两个简单的爬虫,我自己参考网上的资料,手动实现了一下,今天总结一下发给大家。

[参考链接]:https://www.v2ex.com/t/347986

编写爬虫首先是分析想要爬去的页面url格式或者html页面中的标签的链接。

none.gif

11.jpg (110.69 KB, 下载次数: 1)

11

2017-7-23 12:11 上传

在浏览器中按F12打开监控面板,选择network页面,该页面中可以分析浏览器与服务器之间的交互情况。

none.gif

22.jpg (141.88 KB, 下载次数: 0)

22

2017-7-23 12:11 上传

按F5刷新页面,浏览器会向服务器发送很多请求,服务器也会对浏览器的请求做出相应相应。我们在下方选择Other,这样便可以筛选出其他类型。

none.gif

33.jpg (115.21 KB, 下载次数: 0)

33

2017-7-23 12:11 上传

我们从中选择json类型的HTTP请求,然后逐个观察分析,在每个HTTP请求的详情页中,选择Response,查看服务器发回的响应。

none.gif

44.jpg (170.44 KB, 下载次数: 0)

44

2017-7-23 12:11 上传

一直向下分析,直到找到一个返回的JSON中的内容正是我们所需的那条请求记录,其开头为stat?callback,可以看到其内部的返回数据与页面中的是有着对应关系的

none.gif

55.jpg (169.05 KB, 下载次数: 0)

55

2017-7-23 12:11 上传

在右侧的HTTP详情页面中选择Headers,然后点击Edit and Resend按钮,将找到的链接复制一下

none.gif

66.jpg (134.07 KB, 下载次数: 0)

66

2017-7-23 12:11 上传

none.gif

77.jpg (134.57 KB, 下载次数: 0)

77

2017-7-23 12:11 上传

在浏览器中新开一个标签页,然后将刚才复制的链接粘贴到到浏览器地址栏中,可以看到得到的便是json串。

none.gif

88.jpg (67.87 KB, 下载次数: 0)

88

2017-7-23 12:11 上传

我们看到这个链接非常长,带了很多冗余信息,不方便我们最后编写爬虫的URL,尝试一下之后,发现最终可以简化成http://api.bilibili.com/x/web-interface/archive/stat?aid=10001, 访问该地址,发现我们的主要数据依旧存在

none.gif

99.jpg (46.23 KB, 下载次数: 0)

99

2017-7-23 12:11 上传

主要代码如下

#craw_bilibili.py

import time

import requests

import sys

from prettytable import PrettyTable

#设置编码方式

reload(sys)

sys.setdefaultencoding(‘utf-8’)

#返回爬取的数量

def get_Craw_num():

print("-----------菜 单--------------")

i=str(raw_input("请输入爬取视频的起始编号"))

print("-----------------------------")

return i

#爬虫的功能实现

def start_craw(url):

print("开始爬取,请稍候")

headers={}

x=PrettyTable(['视频编号','播放量','弹幕','回复','收藏','硬币','分享'])

t=0

i=get_Craw_num()

while(t<100):

r=requests.get(url.format(i),headers=headers)

if r.status_code ==200:

try:

j=r.json()['data']

favorite=j['favorite']

danmaku=j['danmaku']

coin=j['coin']

view=j['view']

share=j['share']

reply=j['reply']

favorite=str(favorite)

danmaku=str(danmaku)+" "

coin=str(coin)

view=str(view)

share=str(share)

reply=str(reply)

av_num="av"+str(i)

x.add_row([av_num,view,danmaku,reply,favorite,coin,share])

except Exception as e:

pass

else:

break

i=i+1

t=t+1

print (x)

print("爬取完成")

#main函数

if __name__=="__main__":

url='https://api.bilibili.com/x/web-interface/archive/stat?aid={}'

start_craw(url)

部分代码解释

首先是导入所需的python库,以及设置编码方式为utf-8。其中PrettyTable库的作用是可以将数据按照表格的形式展示出来。代码为:

none.gif

1.jpg (19.01 KB, 下载次数: 0)

1 导入python包

2017-7-23 11:52 上传

编写获取用户输入的爬取数量的函数。将输入的数值转化成int类型,然后返回,具体代码如下:

none.gif

2.jpg (21.34 KB, 下载次数: 0)

2 获取输入

2017-7-23 12:06 上传

其次是爬虫的主体部分。首先是用prettytable,插入表头信息,然后开始构造url地址,用requests方法获取url内容,对于返回的json串进行解析,然后将每个数值对应的插入到表格中,如果插入记录到达100条,则退出该函数,具体代码如下编写主函数。

none.gif

3.png (124.66 KB, 下载次数: 0)

3 爬虫主体

2017-7-23 12:06 上传

主函数直接调用,爬虫的主体部分,代码如下:

none.gif

4.jpg (10.86 KB, 下载次数: 0)

4 主函数

2017-7-23 12:06 上传

效果展示

随便输入一个数字,如10086,然后回车,稍等一会便可以打印爬取结果

none.gif

111.png (108.73 KB, 下载次数: 1)

111

2017-7-23 12:24 上传

none.gif

222.png (1.02 MB, 下载次数: 0)

222

2017-7-23 12:25 上传

好的,很高兴回答您的问题! 首先,我们需要安装一些必要的库,如requests、BeautifulSoup、jieba、wordcloud等。你可以使用以下命令进行安装: ``` pip install requests pip install BeautifulSoup4 pip install jieba pip install wordcloud ``` 接下来,我们需要先获取视频的av号(或者BV号),然后通过BAPI接口来获取评论数据。代码如下: ```python import requests import json # 获取B视频评论 def get_bilibili_comment(aid): url = "https://api.bilibili.com/x/v2/reply?pn={}&type=1&oid={}&sort=2" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"} comments = [] for i in range(1, 6): # 抓取前5页评论 response = requests.get(url.format(i, aid), headers=headers) data = json.loads(response.text) for comment in data["data"]["replies"]: comments.append(comment["content"]["message"]) return comments # 获取B视频的av号 def get_bilibili_av(bv): url = "https://api.bilibili.com/x/web-interface/view?bvid={}" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"} response = requests.get(url.format(bv), headers=headers) data = json.loads(response.text) return data["data"]["aid"] ``` 接着,我们需要使用jieba库对评论内容进行分词,并将分词结果存储到一个列表中。代码如下: ```python import jieba # 分词 def cut_words(comments): words = [] for comment in comments: words += jieba.lcut(comment) return words ``` 最后,我们可以使用wordcloud库来制作词云图。代码如下: ```python import matplotlib.pyplot as plt from wordcloud import WordCloud # 制作词云图 def make_wordcloud(words): text = " ".join(words) wc = WordCloud(background_color="white", max_words=200, font_path="msyh.ttc") wc.generate(text) plt.imshow(wc) plt.axis("off") plt.show() ``` 完整代码如下: ```python import requests import json import jieba import matplotlib.pyplot as plt from wordcloud import WordCloud # 获取B视频评论 def get_bilibili_comment(aid): url = "https://api.bilibili.com/x/v2/reply?pn={}&type=1&oid={}&sort=2" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"} comments = [] for i in range(1, 6): # 抓取前5页评论 response = requests.get(url.format(i, aid), headers=headers) data = json.loads(response.text) for comment in data["data"]["replies"]: comments.append(comment["content"]["message"]) return comments # 获取B视频的av号 def get_bilibili_av(bv): url = "https://api.bilibili.com/x/web-interface/view?bvid={}" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"} response = requests.get(url.format(bv), headers=headers) data = json.loads(response.text) return data["data"]["aid"] # 分词 def cut_words(comments): words = [] for comment in comments: words += jieba.lcut(comment) return words # 制作词云图 def make_wordcloud(words): text = " ".join(words) wc = WordCloud(background_color="white", max_words=200, font_path="msyh.ttc") wc.generate(text) plt.imshow(wc) plt.axis("off") plt.show() if __name__ == "__main__": bv = input("请输入B视频的BV号:") aid = get_bilibili_av(bv) comments = get_bilibili_comment(aid) words = cut_words(comments) make_wordcloud(words) ``` 这样,我们就可以使用Python来抓取B视频评论,并制作词云图了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值