随机生成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
相关产品推荐
相关产品推荐

