Python爬虫实战之哔哩哔哩二维码登录申请

news2025/7/18 9:32:14

前言

哈喽,好久不见了吧,各位新年好!博主春节也是比较忙的,没时间去写文章和"coding"。最近我们学校也是初九就开学了,所以更加没时间创作了🤣

言归正传,本次写这篇文章算是想要对我个人的一次小总结吧。

本篇文章会围绕B站的登录请求来进行一次Python爬虫实战,用到的也是异步爬虫库httpx,我也是刚学爬虫不久,文章有什么错误欢迎各位大佬指正,指导

开始

1.准备

你需要准备的东西有这些:

  1. httpx
  2. qrcode
  3. 浏览器
  4. 勤劳的双手

其中1,2两点都是python第三方拓展库,httpx主要用来爬取数据,qrcode负责生成二维码,在此提示一下,本文章适合有一定爬虫基础的同学阅读,如果你是新手可以先去学习一点基础再来阅读本文章效果更佳

2.理清思路

我们先来理解一下b站的二维码生成机制,先上流程图

大概流程清晰了吧

接着我们来到B站官网,打开F12,使用开发者调试器找请求,找到我用方框框起来的请求,这个就是请求登录验证链接以及qrcode_key的接口

我们可以看到请求完接口是这样的

那么思路有了,接口也找到了,接下来该干正事了

3.开干!

首先随便新建一个py文件,然后写入以下代码

import json
import httpx

def get_qrurl() -> list:
    """返回qrcode链接以及token"""
    with httpx.Client() as client:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
        }
        url = 'https://passport.bilibili.com/x/passport-login/web/qrcode/generate?source=main-fe-header'
        data = client.get(url=url, headers=headers)
    total_data = data.json()
    qrcode_url = total_data['data']['url']
    qrcode_key = total_data['data']['qrcode_key']
    data = {}
    data['url'] = qrcode_url
    data['qrcode_key'] = qrcode_key
    return data

if __name__ == "__main__":
    print(get_qrurl())

接着我们运行一下,打印返回的值,发现,返回的值就是我们在浏览器看到的验证链接和qrcode

至此我们已经完成了向哔哩哔哩服务器发送请求的步骤,接下来就该生成二维码了,这里我们需要借助qrcode库来实现二维码的生成

话不多说,贴代码

import json
import httpx
import qrcode

def get_qrurl() -> list:
    """返回qrcode链接以及token"""
    with httpx.Client() as client:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
        }
        url = 'https://passport.bilibili.com/x/passport-login/web/qrcode/generate?source=main-fe-header'
        data = client.get(url=url, headers=headers)
    total_data = data.json()
    qrcode_url = total_data['data']['url']
    qrcode_key = total_data['data']['qrcode_key']
    data = {}
    data['url'] = qrcode_url
    data['qrcode_key'] = qrcode_key
    return data

def make_qrcode():
    """制作二维码"""
    data = get_qrurl()
    qr = qrcode.QRCode(
        version=5,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=10,
        border=4,
    )
    qr.add_data(data['url'])
    qr.make(fit=True)
    # fill_color和back_color分别控制前景颜色和背景颜色,支持输入RGB色,注意颜色更改可能会导致二维码扫描识别失败
    img = qr.make_image(fill_color="black")
    img.show()

if __name__ == "__main__":
    make_qrcode()

在这里我们定义了一个make_qrcode的函数,作用是生成二维码,可以发现,在该函数最后一行调用了show方法,作用是显示二维码

注意! 程序运行的函数发生改变,请注意更改

我们来看看运行后是怎样的效果

我们扫描生成的二维码会发现使用的协议是网页端的

至此我们已经成功一大半了吧

如果你要用作qq机器人的话还需要加个二维码状态判断,这里给大家总结一下我发现的各种二维码状态码及对应状态

这里给大家贴上我总结的状态码对照表

那么二维码搞定了,接下来该如何进行?

我们需要保存扫码完成后的cookie值,像这样

import json
import httpx
import qrcode
import os

def get_qrurl() -> list:
    """返回qrcode链接以及token"""
    with httpx.Client() as client:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
        }
        url = 'https://passport.bilibili.com/x/passport-login/web/qrcode/generate?source=main-fe-header'
        data = client.get(url=url, headers=headers)
    total_data = data.json()
    qrcode_url = total_data['data']['url']
    qrcode_key = total_data['data']['qrcode_key']
    data = {}
    data['url'] = qrcode_url
    data['qrcode_key'] = qrcode_key
    return data

def make_qrcode(data):
    """制作二维码"""
    qr = qrcode.QRCode(
        version=5,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=10,
        border=4,
    )
    qr.add_data(data['url'])
    qr.make(fit=True)
    # fill_color和back_color分别控制前景颜色和背景颜色,支持输入RGB色,注意颜色更改可能会导致二维码扫描识别失败
    img = qr.make_image(fill_color="black")
    img.show()


def sav_cookie(data, id):
    """用于储存cookie"""
    try:
        with open(f'./bilibili_login/cookie/{id}.json', 'w') as f:
            json.dump(data, f, ensure_ascii=False)
    except FileNotFoundError:
        os.mkdir('./bilibili_login/cookie')
        with open(f'./bilibili_login/cookie/{id}.json', 'w') as f:
            json.dump(data, f, ensure_ascii=False)

def main_run():
    """主函数"""
    data = get_qrurl()
    token = data['qrcode_key']
    make_qrcode(data)
    with httpx.Client() as client:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
        }
        url = f"https://passport.bilibili.com/x/passport-login/web/qrcode/poll?qrcode_key={token}&source=main-fe-header"
        data_login = client.get(url=url, headers=headers)  # 请求二维码状态
        data_login = json.loads(data_login.text)
    code = int(data_login['data']['code'])
    if code == 0:
        cookie = dict(client.cookies)
        sav_cookie(cookie, 'test')

if __name__ == "__main__":
    main_run()

运行完毕后会在当前脚本目录下生成一个bilibili_login文件夹,里面有cookie文件夹,里面拥有一个test.json存放用户的cookie,这样我们便完成了cookie的获取以及存储,接下来就是带着cookie访问哔哩哔哩获取个人信息了

我们先定义一个读取cookie的函数,像这样

def load_cookie(id) -> dict:
    """用于加载cookie"""
    try:
        file = open(f'./bilibili_login/cookie/test.json', 'r')
        cookie = dict(json.load(file))
    except FileNotFoundError:
        msg = '未查询到用户文件,请确认资源完整'
        cookie = 'null'
        print(msg)
    return cookie

接着我们定义一个person函数,用作返回个人信息,像这样

def person():
    """获取个人资料"""
    url = 'https://api.bilibili.com/x/web-interface/nav'
    cookie = load_cookie()
    with httpx.Client() as client:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
        }
        data = client.get(url=url, headers=headers, cookies=cookie)
    data = data.json()
    person_data = data['data']  # 获取个人信息
    user_name = person_data['uname']  # 用户名
    coin_num = str(person_data['money'])  # 硬币数量
    level = str(person_data['level_info']['current_level'])  # 等级
    face = str(person_data['face'])  # 头像链接
    print(person_data)

一切准备就绪!我们试着运行一下,可以看到返回的个人数据是json格式的,这里就不展示了,还请各位大佬自行尝试

好的,我们贴上完整代码

import json
import httpx
import qrcode
import os


def get_qrurl() -> list:
    """返回qrcode链接以及token"""
    with httpx.Client() as client:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
        }
        url = 'https://passport.bilibili.com/x/passport-login/web/qrcode/generate?source=main-fe-header'
        data = client.get(url=url, headers=headers)
    total_data = data.json()
    qrcode_url = total_data['data']['url']
    qrcode_key = total_data['data']['qrcode_key']
    data = {}
    data['url'] = qrcode_url
    data['qrcode_key'] = qrcode_key
    return data


def make_qrcode(data):
    """制作二维码"""
    qr = qrcode.QRCode(
        version=5,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=10,
        border=4,
    )
    qr.add_data(data['url'])
    qr.make(fit=True)
    # fill_color和back_color分别控制前景颜色和背景颜色,支持输入RGB色,注意颜色更改可能会导致二维码扫描识别失败
    img = qr.make_image(fill_color="black")
    img.show()


def sav_cookie(data, id):
    """用于储存cookie"""
    try:
        with open(f'./bilibili_login/cookie/{id}.json', 'w') as f:
            json.dump(data, f, ensure_ascii=False)
    except FileNotFoundError:
        os.mkdir('./bilibili_login/cookie')
        with open(f'./bilibili_login/cookie/{id}.json', 'w') as f:
            json.dump(data, f, ensure_ascii=False)


def main_run():
    """主函数"""
    data = get_qrurl()
    token = data['qrcode_key']
    make_qrcode(data)
    with httpx.Client() as client:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
        }
        url = f"https://passport.bilibili.com/x/passport-login/web/qrcode/poll?qrcode_key={token}&source=main-fe-header"
        data_login = client.get(url=url, headers=headers)  # 请求二维码状态
        data_login = json.loads(data_login.text)
    code = int(data_login['data']['code'])
    if code == 0:
        cookie = dict(client.cookies)
        sav_cookie(cookie, 'test')


def load_cookie() -> dict:
    """用于加载cookie"""
    try:
        file = open(f'./bilibili_login/cookie/test.json', 'r')
        cookie = dict(json.load(file))
    except FileNotFoundError:
        msg = '未查询到用户文件,请确认资源完整'
        cookie = 'null'
        print(msg)
    return cookie


def person():
    """获取个人资料"""
    url = 'https://api.bilibili.com/x/web-interface/nav'
    cookie = load_cookie()
    with httpx.Client() as client:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
        }
        data = client.get(url=url, headers=headers, cookies=cookie)
    data = data.json()
    person_data = data['data']  # 获取个人信息
    user_name = person_data['uname']  # 用户名
    coin_num = str(person_data['money'])  # 硬币数量
    level = str(person_data['level_info']['current_level'])  # 等级
    face = str(person_data['face'])  # 头像链接
    print(person_data)


if __name__ == "__main__":
    person()

这里有一点需要注意的是,我们需要先运行main_run来获取和储存cookie,接着在运行person进行个人信息获取,注意顺序不要搞混,否则可能会报错

结尾

恭喜大家ヾ(≧▽≦*)o,至此我们已经完成了个人信息的获取,本教程仅作为学习用途,希望这篇文章能帮到正在学习或者想要学习爬虫的大家,最后,我想说 Code changes the world!

结尾撒花(o゜▽゜)o☆

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/197763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试基础(五) 之 了解测试团队的组织架构

今天来了解一下软件测试团队的组织架构模式到底是什么样子。测试团队的组织架构模式的分类一个公司软件测试的组织架构,可能会决定你未来的成长空间,同时也决定了我们的工作模式到底是什么样子。现在测试行业内通常测试团队的组织架构主要分成两种&#…

亚马逊站内流量太少,如何拓展流量渠道增加产品销量?

近两年,经历了行业大洗牌之后,由于入驻平台卖家逐日增多,站内广告成本越来越高,想要抢占更多的站内流量变得愈发困难,一天出不了几单的情况也随处可见。因此,当站内流量的获取遭遇瓶颈,卖家想要…

阿里二面:RocketMQ 消费者拉取一批消息,其中部分消费失败了,偏移量怎样更新?

大家好,我是君哥。最近有读者参加面试时被问了一个问题,如果消费者拉取了一批消息,比如 100 条,第 100 条消息消费成功了,但是第 50 条消费失败,偏移量会怎样更新?就着这个问题,今天…

Pycharm出现‘Error loading package list:Connection refused: connect’问题

问题描述依次打开File->Settting窗口点击图中号弹出如下错误:Package错误窗口‘Error loading package list:Connection refused: connect 一段时间后继续弹出以下窗口:2.问题分析目前这个问题普遍说是由于网络配置原因引起的,在这之前&am…

【数据结构/C++】 树详解

目录树树的定义树的基本术语二叉树⼆叉树的种类满二叉树完全二叉树二叉树的性质二叉树的遍历方法前序遍历中序遍历后序遍历层序遍历二叉树的实现树 树的定义 树(Tree)是n(n≥0)个结点的有限集。n0时称为空树。在任意一颗非空树中…

[Effective Objective] 块与大中枢派发

为了解决多线程问题,苹果公司以全新的方式设计了多线程。核心就是“块”(block)与“大中枢派发”(Grand Central Dispatch, GCD)。 “块”是一种可在C、C及Objective-C代码中使用的“词法闭包”,借由此机制…

在一起多少天怎么设置?如何微信推送在一起多少天

马上情人节要到了,你和你的对象在一起多久了?两个人在恋爱中,会需要记录彼此在一起的每一天,特别是一些重要的纪念日比如100天纪念日,365天、或者520天纪念日。市面上有许多工具,可以帮我们记录这些重要的日…

指针空值nullptr(C++11)

在良好的C/C编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现 不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下 方式对其进行初始化:void TestPtr() { in…

【Docker 02】docker镜像和容器命令大全

对于入门学习者,更推荐的方式是通过官网的Reffrence手册,学习使用命令,不仅存在用法,选项参数的解释,还有用力example。 docker命令的基本语法结构: docker 子命令 [选项] [参数] 一、Docker基本命令 1.镜像有关 一批模板文件,不同的镜像可以包含的环境内容是不一样的,…

深入了解多线程原理

目录 背景知识: 什么是进程? 什么是线程? 线程与进程的区别: Thread类及常用方法: 循环打印的例子: start() 和 run() 的区别: 通过监视窗口查看线程: 创建线程: 1.继承 …

console控制台有sql语句输出但log文件中不输出sql解决方式

控制台可以输出sql,但是log文件中无sql输出,如何解决?把握两点就可以输出:第一点,mybatis 本身的logImpl配置这个参数是配置mybatis所使用的日志框架,取值范围如下:SLF4JLOG4J #表示使用LOG4J作…

提名倒计时! | 2022 龙蜥社区优秀贡献者

各位盆友们:2022 年,那些为龙蜥壮大做出杰出贡献的人们,包括开源背后的推动者、组织者、布道者、代码贡献者,让我们看到了热爱技术的力量!为此社区推出「2022 龙蜥社区优秀贡献者」活动。截至目前,距离报名…

CSAPP Malloc Lab

CSAPP Malloc Lab 在这个实验室中,您将为C程序编写一个动态存储分配器,即您自己版本的malloc、free和realloc例程,实现一个正确,高效和快速的分配器。本实验性能指标有两个方面,内存利用率和吞吐量,这两个…

fpga图像处理(基于camera的图像读取和显示)

【声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 市面上目前很多的fpga开发板都有camera到lcd的显示demo。处理流程也是很相似的。一般的流程都是fpga首先初始化cmos,接着就是把数据从cmos读出来存储到sdram里面,显示模块再从sdra…

C语言高级教程-C语言数组(六):变长数组

C语言高级教程-C语言数组(六):变长数组一、本文的编译环境二、一维数组在执行期间确定长度三、二维数组在执行期间确定长度四、一维变长数组实例五、完整程序5.1 Main.h 文件程序5.2 Main.c 文件程序六、总结一、本文的编译环境 本文的编译环…

压缩包版本快速安装MySQL教程

安装MySQL 跟随老师 狂神学java 学习地址 bilibilihttps://www.bilibili.com/video/BV1NJ411J79W?p1&vd_source69de4cea8c2ffc0f520876695f09a2da 这里建议大家使用压缩版 , 安装快 , 方便 . 不复杂 . 1、软件下载mysql5.7 64位下载地址: https://dev.mysql.com/get/Dow…

数据治理与IT治理的关系

前面我们辨析了数据治理的概念。这一篇文章要讲数据治理与IT治理的关系,首先来看看IT治理的概念。IT治理的理念最早是IBM(InternationalBusiness Machines Corporation,国际商业机器公司)引入中国的,属于公司治理的一部…

中金公司:全面注册制监管规则解读(附97页报告原文pdf下载链接)

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年12月份热门报告盘点罗振宇2023年跨年演讲PPT原稿吴晓波2022年年终秀演讲PPT原稿推荐技术在vivo互联网商业化业务中的实践.pdf2023年,如何科学制定年度规划&a…

Spring Batch 批处理数据表

目录 引言 概述 batch_job_instance表 batch_job_execution表 batch_job_execution_context表 batch_job_execution_params表 btch_step_execution表 batch_step_execution_context表 H2内存数据库 转视频版 引言 接着上篇:Spring Batch 步骤对象-返回状…

MybatisPlus多表查询之零sql编写实现

1.前言 年初节奏还没有快起来,适合做做技术前瞻,无论是对个人还是团队都是好事。真要说分享,其实感觉也没啥好分享的,就像接手新项目一样,代码都是自己看,别人讲的再多,不看,不用&am…