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

前言

哈喽,好久不见了吧,各位新年好!博主春节也是比较忙的,没时间去写文章和"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 httpxdef 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_urldata['qrcode_key'] = qrcode_keyreturn dataif __name__ == "__main__":print(get_qrurl())

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

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

话不多说,贴代码

import json
import httpx
import qrcodedef 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_urldata['qrcode_key'] = qrcode_keyreturn datadef 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 osdef 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_urldata['qrcode_key'] = qrcode_keyreturn datadef 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 osdef 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_urldata['qrcode_key'] = qrcode_keyreturn datadef 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 cookiedef 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.rhkb.cn/news/67755.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技巧丨哔哩哔哩转正答题技巧

技巧丨哔哩哔哩转正答题技巧 技巧丨哔哩哔哩转正答题技巧 准备工具答题 卷一(第一部分)卷一(第二部分)卷二:自选题 前言:前几天在B站看视频,想吐槽一下内容,结果发现需要转正后才能…

哔哩哔哩第三方神器软件,早该用上了

今天分享几个b站第三方神器app,下载地址在公众号苏生不惑后台回复 b站。 BBLL 哔哩哔哩2023最新第三方TV和pad端开源软件https://github.com/xiaye13579/BBLL ,支持8K、弹幕、直播,大会员通用,首页只有推荐、热门、番剧、影视等模…

Miko二次元动漫视频网站源码 视频播放带仿哔哩哔哩视频字幕弹幕

非常大气漂亮的Miko动漫视频网站整站源码,二次元动漫网源码。Dz后台管理方便,整站数据都设置好了,传上即可制作一个完整的动漫网。 安装教程: 1.源码上传到空间 2.自己修改里面数据库信息(错一个网站就打不开&#xff…

哔哩哔哩弹幕api及一些解释

有两个弹幕api接口,分别是移动端与电脑端 https://comment.bilibili.com/ cid .xml https://api.bilibili.com/x/v1/dm/list.so?oid cid以电脑端为例子,使用谷歌浏览器打开某个哔哩哔哩的视频: 右键–检查–network–刷新–一个个找吧&…

哔哩哔哩自动生成视频上传,B站发布软件使用教程

哔哩哔哩自动生成视频上传,B站发布软件使用教程,全自动引流发帖软件介绍#引流发帖软件#全自动引流发帖#引流推广#拓客引流#爆粉软件 大家好,我是百收编辑狂潮老师,下面给大家讲一下 b 站上传软件它的一个使用方法。第一次使用的时…

【大厂直通车】哔哩哔哩日常实习_测开面经

📑哈喽,大家好,我是小浪;本篇博客更新的是最新B站测开面经,本专栏非常适合目前准备找实习,或者准备冲秋招测试,测开方向的同学阅读订阅,持续更新各大厂真题面经,带你成为offer收割机!! 🧃对于订阅本专栏的同学们,博主在努力更新,只需要一杯奶茶钱,订阅本专栏,…

如何在微信公众号的文章推送中展示bilibili的视频

0x00 需求背景: 我们学院举办了一个短视频设计大赛,需要在官方公众号里进行线上投票,选出大家最喜欢的视频。 然而微信公众号的文章推送中,限制了每篇文章只能上传三部视频,而我们需要把三十部作品都放到一篇文章中…

从B站 (哔哩哔哩) 泄露的源码里发现了B站视频推荐的秘密

这两天闲来无事,回顾了一下年前B站沸沸扬扬的代码泄露事件,大致翻阅了一些泄露的代码发现了一些有意思的事情,其中就包括 B站视频推荐 加权部分算法 的相关代码。 不过后期 B站官方辟谣说是老版本代码,并且已经进行相应的防御措施…

哔哩哔哩用户需求分析报告

先说总结与建议 根据需求优先级列表排序和用户需求程度排序,基于对目标群体的认知和日常使用,总结出以下几点优化建议: 内容方面 加强内容审查,同时加快内容审核。针对UP主上传的视频内容,可提供用户评分功能&#…

国足晋级12强 | 爬取《NBA30支球队》“现役球员信息”,再来看看篮球吧!

我爸对篮球真可是相当钟爱,基本是每个赛季必追。我就不同了,自从高中毕业后,就再也没怎么看篮球了。于是,我就有感而发,是否可以爬取现役球员的一些信息,看看我还有几个认识的。 1. 页面分析 我爬取的页…

“元宇宙”是什么?涂子沛:人可在数据空间“复活”

点击上方“程序猿技术大咖”,关注并选择“设为星标” 回复“加群”获取入群讨论资格! 来源:https://view.inews.qq.com/a/20211204A047MY00 “最近热火的‘元宇宙’,其实是在原有的空间中增加了数据空间,在这个数据空间…

计算机学院篮球赛,“新生杯”,篮球热火——记重庆大学计算机学院小组篮球赛第五场...

2016年11月3日中午12点40分,梅园篮球场,等待着与计算机学院少年的篮球之约,阳光正好,少年风华正茂。 参与篮球赛第五场的共有两组比赛。第一组是16级物联VS16级计科6班,由15级计科1班的洪浩和16级计科3班的李润南担任裁…

云中,雁门关外

大同,塞外,黄土高坡,云中。 晋剧、北路梆子、耍孩、数来宝,汇聚一堂。 这里是贾樟柯的英雄地:《任逍遥》《江湖儿女》皆出于此地。这里的男人说话爱拍肩膀拍胸脯拍大腿。 大同的天气四季分明,常年少雨&…

热火赛前获专家一致看好 凯尔特人难再入总决赛

资料图:詹姆斯在场上仍然势不可挡。中新社发 张炜 摄 中新网5月28日 随着凯尔特人在抢七中大胜费城76人,NBA东部决赛的对阵双方也已尘埃落定。对此,ESPN邀请了14位篮球专家对东区决赛的前景进行了预测。结果显示,迈阿密热火的支持…

最近抖音热火的华为太空人手表,附源码下载

一、效果展示 用javascript写的一个太空人表盘。源码请从文章末尾获取下载 原文地址:https://blog.csdn.net/weixin_43532890/article/details/115047940 源码下载:https://pan.baidu.com/s/1SFOFQCIW1Jn9J5u0HjTQKg 密码: 5mv9

猜想:企业SaaS热火之后……

企业SaaS目前热火涌动,尤其在云计算、大数据、移动应用、互联网金融等新概念簇拥下,创业者、投资者、客户似乎对于这一并不很新的概念追捧度大幅提升。 那企业SaaS未来将会怎样,试着做些猜想。 从碎片化到集成 现在的企业SaaS业务基本都是从某…

AI数据标注工具Doccano

Doccano是一款开源的标注工具,用于自然语言处理和机器学习任务。它提供了用户友好的界面,使用户能够轻松地标注文本、序列标注、文本分类和文本配对等任务。doccano支持多种标注格式,并且可以方便地与其他机器学习工具集成。它的简单性和灵活…

人工智能会率先发现外星生命吗?

重要提示 亲爱的读者朋友,微信又改版啦!如果没有加星标,或者不常读我们的文章,我们的文章就不会在您的“订阅号消息”里大图展示,甚至不被推送,太容易错过了。ಥ_ಥ 请星标Nature Portfolio,常读…

chatgpt赋能python:Python界面的黑色设置

Python界面的黑色设置 Python是一种高级编程语言,广泛应用于各种领域。然而,许多人在使用Python编写代码时,可能会对其默认的白色界面颜色感到厌烦。本文将介绍如何将Python界面设置为黑色,以提高编程体验。 为什么要将Python界…

在latex中使用GB/T 7714—2015参考文献著录规则

毕业论文中的参考文献要求参照《文后参考文献著录规则》(GB/T 7714-2005)的要求书写: http://www.cessp.org.cn/uploads/1/file/public/201607/20160708142456_8mqgu0dpgk.pdf 我直接使用的是 gbt7714 package, GitHub 链接: ht…