找回密码
 立即注册

QQ登录

只需一步,快速开始

本帖最后由 lou 于 2020-4-27 11:22 编辑

Geek专栏:用Python获取B站播放历史记录



今天Geek专栏为大家带来
乐聚机器人王松博士的
“用Python获取B站播放历史记录”

最近 B 站出了一个年度报告,统计用户一年当中在 B 站上观看视频的总时长和总个数。过去一年我居然在 B 站上看了 2600+ 个视频,总计251 个小时,居然花了这么多时间,吓得我差点把 Bilibili App 卸载了...

158.png

然而我又很好奇,到底我在 B 站上都看了些什么类型的视频,用几行 Python 代码实现了一下。

获取请求 Api 接口与 Cookie

实现起来非常容易,获取 cookie 模拟请求即可
1. 使用 chrome 浏览器
2. 登陆 B 站,进入历史记录https://www.bilibili.com/account/history
3. 在网页任意位置,鼠标右键 检查

159.png

4. 按照下图所示,进入Network 页面,筛选框输入 history,对结果进行筛选,页面滚轮往下即可看到浏览过程中的历史记录请求的Header

160.png

5. 将 Header 下, cookie 一行的字符串复制出来到一个 cookie.txt 文本里

161.png

Python 代码实现

伪造浏览器请求

  1. import json
  2. import requests
  3. def read_cookies_file(filename):
  4.     """read cookie txt file
  5.     :param filename: (str) cookies file path
  6.     :return: (dict) cookies
  7.     """
  8.     with open(filename, 'r') as fp:
  9.         cookies = fp.read()
  10.         return cookies
  11. def get_header(filename):
  12.     cookie = read_cookies_file(filename)
  13.     headers = {
  14.         'Accept': '*/*',
  15.         'Accept-Encoding': 'gzip, deflate, br',
  16.         'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
  17.         'Connection': 'keep-alive',
  18.         'Cookie': cookie,
  19.         'Host': 'api.bilibili.com',
  20.         'Referer': 'https://www.bilibili.com/account/history',
  21.         'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 '
  22.                       '(KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
  23.     }
  24.     return headers
  25. def req_get(headers, url):
  26.     resp = requests.get(url, headers=headers)
  27.     return json.loads(resp.text)
复制代码
使用 cookie 模拟请求

  1. def get_all_bili_history(cookie_file):
  2.     headers = bilibili.get_header(cookie_file)
  3.     history = {'all': []}
  4.     for page_num in range(MAX_PAGE):
  5.         time.sleep(0.6)
  6.         url = 'https://api.bilibili.com/x/v2/history?pn={pn}&ps={ps}&jsonp=jsonp'.format(pn=page_num, ps=PAGE_PER_NUM)
  7.         result = bilibili.req_get(headers, url)
  8.         print('page = {} code = {} datalen = {}'.format(page_num, result['code'], len(result['data'])))
  9.         if len(result['data']) == 0:
  10.             break
  11.         history['all'].append(result)
  12.     return history
复制代码

代码非常简单,完整代码在 https://github.com/wangshub/bilibili-history

存在的问题

本来想拿到所有的播放记录,做一些统计和预测,但是经过实测,B 站只能获取到最近 1000 条或者最近 3 个月的播放记录
如果想获得更多,只能做一个监测程序,不停地从接口获取数据

安全问题


尽量不要使用不安全的wifi 网络,有可能会被别有用心之人获取网络请求的 Package,易泄露个人隐私。

分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册