Python:由b站临时短链接获取到永久链接(去除分享中的杂项)

📚博客主页:knighthood2001
公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下)
🎃知识星球:【认知up吧|成长|副业】介绍
❤️如遇文章付费,可先看看我公众号中是否发布免费文章❤️
🙏笔者水平有限,欢迎各位大佬指点,相互学习进步!

用过b站的小伙伴,应该都知道,b站视频分享后,会生成一段包含标题和链接的内容,比如:【xxxxx】 https://b23.tv/Wr3moAZ。

今天,我们的重点就是去找到这个链接背后的永久链接(因为不排除这个链接过个十天半月后不能使用),而且在爬虫中,这个链接是不太规范的,如果使用这个链接当作Referer,肯定是爬不出东西的。

本文内容分三步

根据短链接网址获取其背后的永久链接


import requests
def get_permanent_link(url):
    # 使用requests库发送head请求(也可以选择GET,但HEAD更快且消耗资源更少)
    response = requests.head(url, allow_redirects=True)
    # print(response.headers)
    # 检查是否有重定向发生
    if 'location' in response.headers:
        # 如果响应头中包含'location',则表示发生了重定向
        # 递归调用自身以处理连续重定向的情况
        return get_permanent_link(response.headers['location'])
    else:
        # 如果没有重定向,则返回当前请求的URL作为永久链接
        return response.url
# 测试函数
temporary_link = "https://b23.tv/Oz899Lb"
permanent_link = get_permanent_link(temporary_link)
print("永久链接是:", permanent_link)
# https://www.bilibili.com/video/BV1LT421S7sh?buvid=XXBF6E0BE943914C6FCC270C1BC645FEABF88&from_spmid=tm.recommend.0.0&is_story_h5=false&mid=rD2uXjILlSxisOyhyvffSg%3D%3D&p=1&plat_id=116&share_from=ugc&share_medium=android&share_plat=android&share_session_id=a834af0a-dc13-4fbe-bf8f-dbc285b6c4db&share_source=COPY&share_tag=s_i&spmid=united.player-video-detail.0.0&timestamp=1716192491&unique_k=Oz899Lb&up_id=259649365

首先,最重要的就是那个短链接网址了,我们需要通过它,获取到背后的永久的url,这时候requests就派上用场了,这里涉及到判断重定向。location是HTTP协议中用来表示重定向位置的头部字段。如果响应头中包含location,那么通常意味着服务器希望客户端去访问另一个URL,即发生了重定向

因此这里需要判断一下,但是,经过几次测试,b站貌似没有发生重定向,因此直接像代码中的else情况处理即可。

此时,你就获取到了长链接。

去除短链接外的内容

争对以下这样的分享内容,我们需要提取出url,因此需要去除其他部分。
在这里插入图片描述

这时候,正则表达式就派上用场了。

import re
# 提取text中的url
def get_url(text):
    # 匹配url的正则表达式
    pattern = r'https?://[^\s]+'
    match = re.search(pattern, text)
    if match:
        return match.group()

通过这个代码,能够只留下这个短链接。

去除获得的长链接中的参数

通过上面代码,获得到的url,已经是长链接了。

但是,获取到的url中,带有很多参数,这些参数目前来看并没有什么用处,因此可以把他去除。

这里同样采用的正则表达式

经过观察,可以发现,b站视频链接中?后面的就是参数了,去掉不影响视频的加载。

代码如下:

# 获得纯净url
def get_pure_url(text):
    # 匹配url的正则表达式
    pattern = r'^(https?://[^\?]+)'
    match = re.search(pattern, text)
    if match:
        return match.group()
    else:
        return None

通过在❓处断开,取前半部分,就得到了最关键的url了。

整合一下

整合一下,使得更加美观,且后续只需要更改一下main函数的名字,就可以在别处调用了。

import requests
import re
"""
# 电脑分享链接:【夏天晚上吹着小风吃龙虾烧烤太爽了!天津凌奥夜市88元小龙虾自助】 https://www.bilibili.com/video/BV1Bw4m1i7ko/?share_source=copy_web&vd_source=80a8f348074649de1e18f1345dee7db3
# 返回数据:https://www.bilibili.com/video/BV1Bw4m1i7ko/?share_source=copy_web&vd_source=80a8f348074649de1e18f1345dee7db3
# 手机分享链接:【杭州首家100元一位313羊庄自助,震惊!-哔哩哔哩】 https://b23.tv/Wr3moAZ
# 返回数据:https://www.bilibili.com/video/BV11U411d7fR?buvid=XXBF6E0BE943914C6FCC270C1BC645FEABF88&from_spmid=tm.recommend.0.0&is_story_h5=false&mid=rD2uXjILlSxisOyhyvffSg%3D%3D&p=1&plat_id=116&share_from=ugc&share_medium=android&share_plat=android&share_session_id=4931472e-3d3c-4a66-aa7f-ee419ad505fc&share_source=COPY&share_tag=s_i&spmid=united.player-video-detail.0.0&timestamp=1717260126&unique_k=Wr3moAZ&up_id=257385649
"""
# 提取text中的url
def get_url(text):
    # 匹配url的正则表达式
    pattern = r'https?://[^\s]+'
    match = re.search(pattern, text)
    if match:
        return match.group()
def get_permanent_link(url):
    # 使用requests库发送head请求(也可以选择GET,但HEAD更快且消耗资源更少)
    response = requests.head(url, allow_redirects=True)
    # print(response.headers)
    # 检查是否有重定向发生
    if 'location' in response.headers:
        # 如果响应头中包含'location',则表示发生了重定向
        # 递归调用自身以处理连续重定向的情况
        return get_permanent_link(response.headers['location'])
    else:
        # 如果没有重定向,则返回当前请求的URL作为永久链接
        return response.url

# 获得纯净url
def get_pure_url(text):
    # 匹配url的正则表达式
    pattern = r'^(https?://[^\?]+)'
    match = re.search(pattern, text)
    if match:
        return match.group()
    else:
        return None
def main(text):
    print(get_pure_url(get_permanent_link(get_url(text))))
    return get_pure_url(get_permanent_link(get_url(text)))
if __name__ == '__main__':
    aaa = "【夏天晚上吹着小风吃龙虾烧烤太爽了!天津凌奥夜市88元小龙虾自助】 https://www.bilibili.com/video/BV1Bw4m1i7ko/?share_source=copy_web&vd_source=80a8f348074649de1e18f1345dee7db3"
    bbb = "【杭州首家100元一位313羊庄自助,震惊!-哔哩哔哩】 https://b23.tv/Wr3moAZ"
    main(aaa)
    main(bbb)

一点总结

  • 电脑上和手机上点击分享后复制的内容,其实是不一样的,电脑上复制的不是像手机上的短链接,而是长链接,但是无伤大雅,都可以使用这种方式,去获取到符合要求的url。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW在高校电力电子实验中的应用

概述:本文介绍了如何利用LabVIEW优化高校电力电子实验,通过图形化编程实现参数调节、实时数据监控与存储,并与Simulink联动,提高实验效率和数据处理能力。 需求背景高校实验室在进行电机拖动和电力电子实验时,通常使用…

MongoDB CRUD操作:插入文档

MongoDB CRUD操作:插入文档 文章目录 MongoDB CRUD操作:插入文档使用MongoDB Atlas UI插入文档插入单个文档插入多个文档插入行为自动创建集合_id字段原子性写确认 在MongoDB中插入文档的集中方式: 使用编程语言提供的驱动程序,在…

Table表格组件不请求接口,实现表格里某条数据的本地编辑功能(Vue3+ArcoDesign)

【背景】 在 Vue3 ArcoDesign项目中,使用ArcoDesign-Table表格组件不请求接口,实现表格里某条数据的本地编辑功能。最后统一通过接口发送数据。 【步骤】 1. 在表格每条数据列后添加一个“编辑”按钮,点击该按钮弹出一个对话框&#xff0c…

flink 作业报日志类冲突的解决方案

文章目录 背景思考初步解决方案深入思考下终极解决方案总结 背景 实时作业在页面提交任务后,报NoSuchMethodException 方法,看了下是关于log4j的,首先是作业升级了很多依赖的版本,其次flink 也升级 到了1.19版本 思考 打的Jar有…

计算一个3x3矩阵对角线和其它两条线的元素之和

计算一个3x3矩阵对角线和其它两条线的元素之和 #include <stdio.h> int main () { int d0,b0,s,i,j; int a[3][3]{1,2,3,4,5,6,7,8,9}; for(i0,j2;i<3;i,j--) dda[i][i]a[i][j]; for(i0,j0;i<3;) {bba[i][j]a[i][j2]; ii2;} sdb; printf("d%d\nb%d\ns%d\n&qu…

远程继电器模块实现(nodemcu D1 + 继电器)

前言 接下来将实现一个远程继电器&#xff0c;实时远程控制和查询的开关状态。用 5v 直流电控制 220v 交流电。 硬件上&#xff1a; 使用 nodemcu D1 和 JQC-3FF-S-Z 继电器。 软件上&#xff1a; 使用 nodejs 作为服务端&#xff0c;和 html 作为客户端。 在开始之前在电脑…

数模混合芯片设计中的修调技术是什么?

一、修调目的 数模混合芯片需要修调技术主要是因为以下几个原因&#xff1a; 工艺偏差&#xff08;Process Variations&#xff09;&#xff1a; 半导体制造过程中存在不可避免的工艺偏差&#xff0c;如晶体管尺寸、阈值电压、电阻和电容值等&#xff0c;这些参数的实际值与…

2024年海南省三支一扶报名指南,照片要求

2024年海南省三支一扶报名指南&#xff0c;照片要求 一、考试时间安排&#xff1a; 报名时间&#xff1a;6月1日8:00至6月7日18:00 准考证打印时间&#xff1a;6月17日8:00 考试时间&#xff1a;6月22日 二、招聘人数 海南省计划招募390名高校毕业生

Golang | Leetcode Golang题解之第125题验证回文串

题目&#xff1a; 题解&#xff1a; func isPalindrome(s string) bool {s strings.ToLower(s)left, right : 0, len(s) - 1for left < right {for left < right && !isalnum(s[left]) {left}for left < right && !isalnum(s[right]) {right--}if l…

Golang | Leetcode Golang题解之第126题单词接龙II

题目&#xff1a; 题解&#xff1a; //bfsdfs(如果是双向bfs&#xff0c;效果会更好) func findLadders(beginWord string, endWord string, wordList []string) [][]string {//字典表&#xff08;将wordList中的单词放入hash表中&#xff0c;方便查找&#xff09;dict:make(m…

学习笔记——网络参考模型——TCP/IP模型(物理层)

一、TCP/IP模型-物理层 1、数据传输(交换)的形式 (1)电路交换 特点&#xff1a;通信双方独占通信链路。 优点&#xff1a;数据传输时延小&#xff0c;适用于实时通信&#xff1b;数据按序发送&#xff0c;不存在失序问题&#xff1b;适合模拟信号和数字信号传输。 缺点&am…

指纹采集技术

目录 1.概述 1.1 捺印油墨采集 1.2 现场指纹提取 1.3 在线指纹采集 2. 指纹采集器的关键技术指标 2.1 采集面积 2.2 分辨率 2.3 图像质量 2.4 耐用性 1.概述 最早的指纹采集技术是油墨法&#xff0c;至少已经有上百年的历史。1990年代出现了活体指纹采集器&#xff0c…

国内AI工具访问量第一的竟然是它?!不是Kimi,也不是文心一言

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

spoon基础使用-第一个转换文件

新建一个转换&#xff0c;文件->新建->转换&#xff0c;也可以直接ctralN新建。 从右边主对象树拖拽一个输入->表输入&#xff1b;输出->文本文档输出&#xff1b;也可以直接在搜索框搜素表输入、文本文档输出。 双击表输入新建一个数据库连接 确定后就可以在S…

AndroidStudio中debug.keystore的创建和配置使用

1.如果没有debug.keystore,可以按照下面方法创建 首先在C:\Users\Admin\.android路径下打开cmd窗口 之后输入命令:keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 输入两次密码(密码不可见,打码处随便填写没关系) 2.在build…

JavaScript拖拽API的简单使用

演示效果&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><st…

基于JSP的九宫格日志网站

你好呀&#xff0c;我是学长猫哥&#xff01;如果有需求可以文末加我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;浏览器/服务器&#xff08;B/S&#xff09;结构 系统展示 首页 管理员功能模块 用户功能模块 摘要 本…

2024年春季学期《算法分析与设计》练习13

问题 A: 菱形图案 [命题人 : admin] 时间限制 : 1.000 sec 内存限制 : 128 MB提交问题列表 解决: 1041提交量: 2744统计 题目描述 KiKi学习了循环&#xff0c;BoBo老师给他出了一系列打印图案的练习&#xff0c;该任务是打印用“*”组成的菱形图案。 输入 多组输入&…

[数据集][目标检测]脑肿瘤检测数据集VOC+YOLO格式9787张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;9787 标注数量(xml文件个数)&#xff1a;9787 标注数量(txt文件个数)&#xff1a;9787 标注…

基础—SQL—DQL(数据查询语言)聚合函数

一、引言 一般情况下&#xff0c;我们在进行分组查询的时候&#xff0c;一般配合着聚合函数来进行操作&#xff0c;所以先了解和学习聚合函数再学习和操作分组查询。 二、DQL—聚合函数 1、介绍 聚合函数指的是讲一列数据作为一个整体&#xff0c;进行纵向的计算。 2、常见…