用 Python 获取 B 站播放历史记录

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

 

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

获取请求 Api 接口与 Cookie

实现起来非常容易,获取 cookie 模拟请求即可

  1. 使用 chrome 浏览器
  2. 登陆B 站,进入历史记录https://www.bilibili.com/account/history
  3. 在网页任意位置,鼠标右键检查
 
  1. 按照下图所示,进入Network页面,筛选框输入history,对结果进行筛选,页面滚轮往下即可看到浏览过程中的历史记录请求的Header
 
  1. 将 Header 下, cookie 一行的字符串复制出来到一个cookie.txt文本里
 

Python 代码实现

  • 伪造浏览器请求
import json
import requests

def read_cookies_file(filename):
    """read cookie txt file
    :param filename: (str) cookies file path
    :return: (dict) cookies
    """
    with open(filename, 'r') as fp:
        cookies = fp.read()
        return cookies

def get_header(filename):
    cookie = read_cookies_file(filename)
    headers = {
        'Accept': '*/*',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
        'Connection': 'keep-alive',
        'Cookie': cookie,
        'Host': 'api.bilibili.com',
        'Referer': 'https://www.bilibili.com/account/history',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 '
                      '(KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    }
    return headers

def req_get(headers, url):
    resp = requests.get(url, headers=headers)
    return json.loads(resp.text)
  • 使用 cookie 模拟请求
def get_all_bili_history(cookie_file):
    headers = bilibili.get_header(cookie_file)
    history = {'all': []}
    for page_num in range(MAX_PAGE):
        time.sleep(0.6)
        url = 'https://api.bilibili.com/x/v2/history?pn={pn}&ps={ps}&jsonp=jsonp'.format(pn=page_num, ps=PAGE_PER_NUM)
        result = bilibili.req_get(headers, url)
        print('page = {} code = {} datalen = {}'.format(page_num, result['code'], len(result['data'])))
        if len(result['data']) == 0:
            break
        history['all'].append(result)

    return history
  • 代码非常简单,完整代码加群973783996

存在的问题

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

安全问题

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

用 Python 获取 B 站播放历史记录的更多相关文章

  1. python爬虫抓站的一些技巧总结

    使用python爬虫抓站的一些技巧总结:进阶篇 一.gzip/deflate支持现在的网页普遍支持gzip压缩,这往往可以解决大量传输时间,以VeryCD的主页为例,未压缩版本247K,压缩了以后45 ...

  2. python CSRF跨站请求伪造

    python CSRF跨站请求伪造 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  3. Python 获取车票信息

    提示:该代码仅供学习使用,切勿滥用!!! 先来一个git地址:https://gitee.com/wang_li/li_wang 效果图: 逻辑: 1.获取Json文件的内容 2.根据信息生成URL ...

  4. 转载:用python爬虫抓站的一些技巧总结

    原文链接:http://www.pythonclub.org/python-network-application/observer-spider 原文的名称虽然用了<用python爬虫抓站的一 ...

  5. HTTP协议与使用Python获取数据并写入MySQL

    一.Http协议 二.Https协议 三.使用Python获取数据 (1)urlib (2)GET请求 (3)POST请求 四.爬取豆瓣电影实战 1.思路 (1)在浏览器中输入https://movi ...

  6. 用Python爬E站本

    用Python爬E站本 一.前言 参考并改进自 OverJerry 大佬的 教你怎么用Python爬取E站的本子_OverJerry. 本文为技术学习记录,不提供访问无存在网站的任何方法,也不包含不和 ...

  7. 用python爬虫抓站的一些技巧总结 zz

    用python爬虫抓站的一些技巧总结 zz 学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛中自动登录自动发贴的脚本,写过自动收邮件的脚本, ...

  8. 基于python对B站收藏夹按照视频发布时间进行排序

    基于python对B站收藏夹按照视频发布时间进行排序 前言 在最一开始,我的B站收藏一直是存放在默认收藏夹中,但是随着视频收藏的越来越多,没有分类的视频放在一起,想在众多视频中找到想要的视频非常困难, ...

  9. Python音频操作+同时播放两个音频

    对于python而言,音频的操作可以使用pygame包中的sound 和 music对象,本博客主要讲解这两个对象. 1.sound对象 Sound对象适合处理较短的音乐,如OGG和WAV格式的音频文 ...

随机推荐

  1. Python全栈之路----目录

    Module1 Python基本语法 Python全栈之路----编程基本情况介绍 Python全栈之路----常用数据类型--集合 Module2 数据类型.字符编码.文件操作 Python全栈之路 ...

  2. Linux与Windows的几点区别

    echo $PATH 回显Linux环境变量PATH的值,Linux下的环境变量必须大写echo %path% 回显Windows环境变量path的值 export PATH=/usr/local/t ...

  3. position(3rd week blog)

    static:静态的默认属性,上(top)下(bottom)左(left)右(right)等参数不会执行没有影响.relative:此属性会根据上(top)下(bottom)左(left)右(righ ...

  4. Linux命令行下载工具

    目录 wget aria2 cURL Youtube-dl https://zh.wikipedia.org/wiki/下载管理程序比较 https://wiki.archlinux.org/inde ...

  5. (转)python中函数参数中如果带有默认参数list的特殊情况

    在python中函数参数中如果带有默认参数list遇到问题 先看一段代码 1 2 3 4 5 6 7 8 9 def f(x,l=[]):     for i in range(x):         ...

  6. [C]最大公约数和最小公倍数

    /*求最大公约数和最小公倍数 编写程序,在主函数中输入两个正整数 a,b,调用两个函数 fun1() 和 fun2(),分别求 a 和 b 的最大公约数和最小公倍数,在主函数中输出结果. */ #in ...

  7. 使用GDB调试将符号表与程序分离后的可执行文件

    环境: Centos7.3.GCC4.8.5 适用场景: 由于调试信息比较大,通常将程序分离为可执行程序和符号信息文件,只对外发布可执行程序,需要调试时再将符号信息文件附加. 一.创建可执行程序: u ...

  8. Linux 配置SSH免密登陆

    1.在hadoop01服务器上 通过ssh -keygen 生成公私钥  [ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa] 2.把公钥给hadoop02服务器 3. ...

  9. bookmarks

    嵌入式/硬件/计算机原理 PCI ID的分配 ARM汇编指令介绍 (连续4篇) https://blog.csdn.net/makethyme/article/details/1641413https ...

  10. 动画讲解TCP的3次握手,4次挥手

    https://mp.weixin.qq.com/s/TUBhH_lJe6M4KgAZO-rP2A TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一.很多读者都知道三次和四次,但是如果问深入 ...