如何使用Python获取Twitch特定频道的全部剪辑链接?
获取Twitch特定频道的剪辑链接
首先,你的现有代码有两个核心问题:一是爬取的是英雄联盟游戏分类的剪辑页面,而非特定频道的;二是抓取了页面上所有<a>标签,包含大量导航、侧边栏等无关链接。我们一步步来修改:
一、静态爬取第一页剪辑(快速实现)
先把目标URL换成特定频道的剪辑页面,比如你要爬取riotgames频道的话,URL是https://www.twitch.tv/riotgames/clips。然后筛选出仅属于剪辑的链接——Twitch的剪辑相对路径都是以/clip/开头的,我们可以据此过滤:
from bs4 import BeautifulSoup from urllib.request import Request, urlopen # 替换为你要爬取的频道名 CHANNEL_NAME = "riotgames" req = Request(f"https://www.twitch.tv/{CHANNEL_NAME}/clips") # 加上User-Agent避免被反爬拦截 req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36') html_page = urlopen(req) soup = BeautifulSoup(html_page, "html.parser") clip_links = [] for link in soup.findAll('a'): href = link.get('href') # 筛选仅剪辑的链接,并拼接完整URL if href and href.startswith('/clip/'): full_link = f"https://www.twitch.tv{href}" clip_links.append(full_link) # 去重(页面可能有重复的剪辑链接) unique_clips = list(set(clip_links)) for clip in unique_clips: print(clip)
注意:这种方法只能获取页面初始加载的第一页剪辑,因为Twitch的剪辑是滚动动态加载的,往下翻页才会加载更多内容。
二、获取所有剪辑(稳定方案:使用Twitch API)
如果要获取频道的所有剪辑,官方API是最可靠的选择(不会被反爬,还能批量获取分页内容)。步骤如下:
- 先去Twitch开发者控制台申请一个
Client ID(免费,注册账号即可创建应用)。 - 使用API先获取目标频道的
broadcaster_id(因为API需要用ID而非频道名)。 - 调用
clips端点分页获取所有剪辑。
示例代码:
import requests # 替换为你的Client ID CLIENT_ID = "your_client_id_here" CHANNEL_NAME = "riotgames" # 第一步:获取频道的broadcaster_id headers = {"Client-ID": CLIENT_ID, "Accept": "application/vnd.twitchtv.v5+json"} user_url = f"https://api.twitch.tv/kraken/users?login={CHANNEL_NAME}" user_response = requests.get(user_url, headers=headers) broadcaster_id = user_response.json()["users"][0]["_id"] # 第二步:分页获取所有剪辑 clip_links = [] cursor = None while True: clips_url = f"https://api.twitch.tv/kraken/clips/broadcaster/{broadcaster_id}" params = {"limit": 100} if cursor: params["cursor"] = cursor clips_response = requests.get(clips_url, headers=headers, params=params) clips_data = clips_response.json() # 提取剪辑链接 for clip in clips_data["clips"]: clip_links.append(clip["url"]) # 检查是否还有下一页 cursor = clips_data.get("_cursor") if not cursor: break print(f"共获取到 {len(clip_links)} 条剪辑链接") for clip in clip_links: print(clip)
关键提示
- 静态爬取适合快速测试,但容易被Twitch的反爬机制拦截,且只能拿到第一页内容。
- API方案更稳定,支持批量获取所有历史剪辑,但需要申请Client ID,遵守Twitch的API调用限制。
内容的提问来源于stack exchange,提问作者Odd-Harald Myhren
相关产品推荐
相关产品推荐

