You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

随机生成YouTube视频URL未找到有效视频,递归超限如何解决?

问题:随机生成YouTube视频ID查找有效视频时触发递归上限

我尝试通过生成随机ID来查找YouTube随机视频。思路是构造包含随机视频ID的链接,然后检查页面HTML:若视频存在,页面中会有15-20个左右的视频ID;若URL无效,仅会有5-6个视频ID。

代码如下:

import urllib.request
import re
import random
import string

def random_url():
    #There is random 11 digit after v=
    url_base = "https://www.youtube.com/watch?v="

    for _ in range(11):
        url_base += (random.choice(string.ascii_letters + string.digits))

    #valid videos has at least 10 video id on the html. 
    #Thats how code i check it is valid video or not
    html = urllib.request.urlopen(url_base)
    video_ids = re.findall(r"watch\?v=(\S{11})", html.read().decode())
    
    if len(video_ids) < 10:
        print(url_base)
        return random_url()
    else:
        print(video_ids)
        print(url_base)
        print("done")


random_url()

测试时有效性检测逻辑可行,但还未找到有效视频就触发了递归上限,请问该如何解决?


解决方案
  • 替换递归为循环:Python默认递归深度限制是1000,连续无效尝试很容易触发上限。改用while循环可以无限尝试直到找到有效视频,彻底规避递归深度问题。优化后的代码示例:
import urllib.request
import re
import random
import string

def random_url():
    url_template = "https://www.youtube.com/watch?v={}"
    while True:
        # 直接生成11位随机视频ID
        video_id = ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(11))
        target_url = url_template.format(video_id)
        
        try:
            # 发起请求并解析页面
            html = urllib.request.urlopen(target_url)
            video_ids = re.findall(r"watch\?v=(\S{11})", html.read().decode())
            
            if len(video_ids) >= 10:
                print(video_ids)
                print(target_url)
                print("done")
                return target_url
            else:
                print(target_url)
        except Exception as e:
            # 捕获请求异常(比如网络错误、反爬拦截)并重试
            print(f"请求失败: {e}, 重试中...")

random_url()
  • 添加浏览器请求头:直接用urllib发起请求容易被YouTube识别为爬虫,返回403错误导致检测逻辑失效。可以添加User-Agent模拟浏览器请求:
# 在发起请求前添加这段代码
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
req = urllib.request.Request(target_url, headers=headers)
html = urllib.request.urlopen(req)
  • 添加请求延迟:频繁请求可能触发YouTube的反爬机制,导致IP被临时封禁。可以在每次失败尝试后添加1-2秒的延迟:
import time
# 在循环内的失败分支添加延迟
time.sleep(1)

内容的提问来源于stack exchange,提问作者ikaganacar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 07:38:12