当你有一个像 yourtube.com/channel/xyz 或 youtube.com/user/xyz 这样的网址时,请求YouTube频道或用户信息是相当容易的,因为你可以从网址中删除用户名/频道ID。但是,我在将 https://youtube.com/c/xyz 等 url 关联到任何类型的资源时遇到问题。
它似乎不是用户,也不是频道?
在HTML中,有一种叫做规范链接元素的东西。这是您放在页面上的元素,该页面是另一个页面的副本,并且该元素指向该内容的规范或"主"副本。
如果您查看 https://youtube.com/c/Rsmuk1 来源并搜索"规范",则会找到指向主频道页面的元素。
<link rel="canonical" href="https://www.youtube.com/channel/UCMi7-BZZX9x8CAhE-5juNyw">
因此,您可以通过以您选择的语言请求页面,然后解析该元素来检索长 URL。下面是 Python 3 中使用 BeautifulSoup
和 requests
from bs4 import BeautifulSoup
import requests
document = requests.get('https://www.youtube.com/channel/UCMi7-BZZX9x8CAhE-5juNyw')
soup = BeautifulSoup(document.content, "lxml")
links = soup.findAll('link', rel='canonical')
for link in links:
print(link['href'])
# Prints: https://www.youtube.com/channel/UCMi7-BZZX9x8CAhE-5juNyw
好的。事实证明,这是一个自定义网址,您可以从YouTube手动请求。它与用户名或频道 ID 没有连接。
目前也没有办法使用 API 从自定义网址获取信息,因此您需要请求网址并在元标记中查找实际的 channelID。这是一个PHP脚本来做到这一点。希望有帮助。
Youtube 更改了 HTML 代码并删除了链接 rel="canonical",因此 Jacob Tomlinson 的解决方案不再有效。
现在,您需要从源代码中的任何其他位置获取ChannelID,例如:
<meta itemprop="channelId" content="UCMi7-BZZX9x8CAhE-5juNyw">
.PHP:
preg_match_all('#<meta itemprop="channelId" content="([^"]+)"#is', $html, $channel_id);