python数据采集练习 根据指定av号下载bilibili视频(二)【正则表达式】

本文介绍如何使用正则表达式从复杂网页源码中精确提取所需信息,包括视频下载链接、标题和大小等内容。通过对比贪婪与非贪婪模式,演示re模块在Python中的应用。
部署运行你感兴趣的模型镜像

如果我们要在一大段文字中找到符合某格式的字符串,最方便的方法莫过于用正则表达式了

正则表达式:https://baike.baidu.com/item/正则表达式/1700215?fr=aladdin

 

我们需要获取一个网页内的信息,如视频下载链接,视频标题,视频大小等等等,而这些信息往往会以这种形式出现:

<script>window.__playinfo__={...}</script>
"dimension":....
title:.....

它们长度不定,位置不定,但具有一定的格式。我们可以用正则表达式将它们的信息完整的提取出来。

 

import re

data = re.findall("window.*?;/(fun/)",datas)

re是Python标准库,专门处理正则表达式,其中re.findall()差不多是最常用的一个函数,用来查找在一段数据中符合某模式的字符串片段并返回一个结果列表。

有关Python re 模块的详细教程可以在网上轻易找到,这里不再累述,这里只提一点:贪婪模式与非贪婪模式

re模块默认是贪婪的,即尽可能匹配到符合模式的最长的字符串,但是在网页源码中往往会出现多个类似于 <span>...</span>...<span>...</span>这样的结构,我想让它在出现第一个</span>时就结束匹配。这需要我们开启匹配的非贪婪模式。

假如有一段数据是

data = "test<lt></lt></lt>"

贪婪模式:

>>> re.findall("test.*</lt>",data)
['test<lt></lt></lt>']

非贪婪模式:

>>> re.findall("test.*?</lt>",data)
['test<lt></lt>']

?的作用是匹配前一个表达式0次或一次,或表示非贪婪,这点十分重要。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 提取 B 站视频 URL 中的 CID 的正则表达式方法 在 B 站视频 URL 中,CID 是视频的关键标识符之一。通常,CID 可以通过以下两种方式获取:从视频页面的源代码中提取或通过 API 请求获取。如果需要直接从 URL 或 HTML 源代码中提取 CID,则可以使用正则表达式来实现[^2]。 #### 正则表达式的构造 CID 通常出现在视频页面的 JavaScript 数据块中,或者可以通过特定的 URL 参数传递。例如,在 B 站视频页面的源代码中,CID 的格式可能类似于以下内容: ```html <video data-aid="123456" data-cid="789012" data-page="1"></video> ``` 为了提取 `data-cid` 属性中的值,可以使用以下正则表达式: ```python r'data-cid="(\d+)"' ``` 该正则表达式匹配 `data-cid` 属性,并捕获其值作为第一个分组[^1]。 #### 示例代码 以下是一个完整的 Python 代码示例,展示如何从 HTML 源代码中提取 CID: ```python import re def extract_cid_from_html(html_content): # 使用正则表达式匹配 data-cid 属性 match = re.search(r'data-cid="(\d+)"', html_content) if match: cid = match.group(1) # 获取捕获组中的 CID 值 return cid else: raise ValueError("无法找到 CID") # 示例 HTML 内容 html_content = ''' <video data-aid="123456" data-cid="789012" data-page="1"></video> ''' # 调用函数提取 CID try: cid = extract_cid_from_html(html_content) print(f"提取到的 CID: {cid}") except ValueError as e: print(e) ``` #### 处理 B 站视频 URL 如果需要从 B 站视频 URL 中提取 CID,则可以结合 API 请求和正则表达式。例如,B 站视频 URL 的结构通常为: ``` https://www.bilibili.com/video/av123456 ``` 可以通过以下步骤提取 CID: 1. 使用正则表达式从 URL 中提取 AID(视频 ID)。 2. 调用 B 站 API 获取与 AID 对应的 CID。 以下是提取 AID 并调用 API 获取 CID 的代码示例: ```python import re import requests def extract_aid_from_url(video_url): # 使用正则表达式匹配 av 后的数字部分 match = re.search(r"av(\d+)", video_url) if match: aid = match.group(1) # 获取捕获组中的 AID 值 return aid else: raise ValueError("无法找到 AID") def get_cid_from_aid(aid): # 调用 B 站 API 获取 CID api_url = f"https://api.bilibili.com/x/player/pagelist?aid={aid}" response = requests.get(api_url) if response.status_code == 200: data = response.json() if data["code"] == 0 and data["data"]: cid = data["data"][0]["cid"] # 获取第一个分页的 CID return cid raise ValueError("无法通过 API 获取 CID") # 示例视频 URL video_url = "https://www.bilibili.com/video/av123456" # 提取 AID 并获取 CID try: aid = extract_aid_from_url(video_url) cid = get_cid_from_aid(aid) print(f"提取到的 CID: {cid}") except ValueError as e: print(e) ``` #### 注意事项 - 如果视频 URL 使用的是 BV 编码(如 `BV1xx411c7mD`),需要先将其转换为 AID[^2]。 - 正则表达式的匹配规则可能因 B 站页面结构调整而失效,因此需要定期验证正则表达式的适用性[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值