littlesealno 2025-09-08 10:49 采纳率: 0%
浏览 5

我用 ytbv3 官方 API 爬取数据时出现访问超时,已开启quanju代理,且环境测试脚本运行正常,如何解决?

想请教下,我用 ytbv3 官方 API 爬取单个视频数据时访问超时,已开全局代理,环境测试脚本也正常。代码是 AI 写的,不知道怎么改,有朋友能指导下吗?(自己的apikey在代码段中码掉了)

想实现这样的效果

img


(图片如有侵删)

运行脚本

from googleapiclient.discovery import build

# -------------------------
# 1. 配置参数
# -------------------------
API_KEY = "xxxxxxxx"         # 替换成你自己的 YouTube Data API Key
VIDEO_ID = "xxxxxxxx"
# -------------------------
# 2. 初始化 YouTube API 客户端
# -------------------------
youtube = build("youtube", "v3", developerKey=API_KEY)

# -------------------------
# 3. 获取视频信息
# -------------------------
request = youtube.videos().list(
    part="snippet,statistics",   # 获取视频标题、播放量、点赞数、评论数
    id=VIDEO_ID
)

response = request.execute()      # 执行 API 请求

# -------------------------
# 4. 打印抓取结果
# -------------------------
if response["items"]:
    video = response["items"][0]
    stats = video["statistics"]
    snippet = video["snippet"]

    print(f"视频标题: {snippet['title']}")
    print(f"视频ID: {video['id']}")
    print(f"播放量: {stats.get('viewCount', 0)}")
    print(f"点赞数: {stats.get('likeCount', 0)}")
    print(f"评论数: {stats.get('commentCount', 0)}")
else:
    print("未找到视频或 Video ID 错误")

环境测试脚本

import requests

try:
    # 访问 YouTube Data API 测试 URL
    r = requests.get("https://www.googleapis.com/youtube/v3/videos?part=snippet&id=aaaaaaaa&key=aaaaaa", timeout=10)
    print(r.status_code, r.text[:200])
except Exception as e:
    print("访问失败:", e)

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-09-08 11:03
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    你遇到的问题是使用 YouTube Data API v3 (ytbv3) 爬取数据时出现访问超时,即使你已经开启了全局代理,并且环境测试脚本(使用 requests)运行正常。这说明问题可能出在以下几个方面:


    ✅ 问题分析

    1. API 请求方式不同

      • 你用的是 googleapiclient.discovery.build() 进行 API 调用,而测试脚本使用的是 requests.get()
      • googleapiclient 默认没有使用代理配置,因此即使你设置了全局代理,它也可能不生效
    2. 网络限制或速率限制

      • YouTube API 对请求频率有限制,如果你的 IP 被封或请求过快,可能会被拒绝或超时。
      • 如果你的 API Key 是免费的,可能有每日请求配额限制。
    3. 代码未正确设置代理

      • 即使你开了全局代理,googleapiclient 不会自动使用这些代理,需要手动配置。

    ✅ 解决方案

    一、为 googleapiclient 配置代理

    你需要在初始化 build() 时,手动指定代理服务器,而不是依赖全局代理。可以使用 requests 库作为底层 HTTP 客户端来实现。

    修改后的代码如下:

    from googleapiclient.discovery import build
    from googleapiclient.http import HttpRequest
    import requests
    
    # -------------------------
    # 1. 配置参数
    # -------------------------
    API_KEY = "xxxxxxxx"         # 替换成你自己的 YouTube Data API Key
    VIDEO_ID = "xxxxxxxx"
    
    # -------------------------
    # 2. 自定义 HTTP 请求类,支持代理
    # -------------------------
    class ProxyHttpRequest(HttpRequest):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self._http = requests.Session()
            self._http.proxies = {
                "http": "http://127.0.0.1:1080",  # 代理地址
                "https": "http://127.0.0.1:1080"
            }
    
    # -------------------------
    # 3. 初始化 YouTube API 客户端,使用自定义 HTTP 请求
    # -------------------------
    youtube = build("youtube", "v3", developerKey=API_KEY, requestBuilder=ProxyHttpRequest)
    
    # -------------------------
    # 4. 获取视频信息
    # -------------------------
    request = youtube.videos().list(
        part="snippet,statistics",
        id=VIDEO_ID
    )
    
    response = request.execute()
    
    # -------------------------
    # 5. 打印抓取结果
    # -------------------------
    if response["items"]:
        video = response["items"][0]
        stats = video["statistics"]
        snippet = video["snippet"]
    
        print(f"视频标题: {snippet['title']}")
        print(f"视频ID: {video['id']}")
        print(f"播放量: {stats.get('viewCount', 0)}")
        print(f"点赞数: {stats.get('likeCount', 0)}")
        print(f"评论数: {stats.get('commentCount', 0)}")
    else:
        print("未找到视频或 Video ID 错误")
    

    二、检查 API Key 是否有效

    • 确保 API Key 正确无误:你可以通过以下 URL 测试:

      https://www.googleapis.com/youtube/v3/videos?part=snippet&id=aaaaaaaa&key=YOUR_API_KEY
      
      • 若返回错误(如 403 Forbidden),可能是 API Key 无效或未启用 YouTube Data API。
    • 确认已启用 YouTube Data API v3

      • 登录 Google Cloud Console
      • 选择对应的项目
      • 进入 APIs & Services > Library
      • 搜索并启用 YouTube Data API v3

    三、设置合理的请求间隔

    • YouTube API 有请求频率限制,建议每秒请求不超过 1 次。
    • 可以在代码中加入 time.sleep(1) 来防止触发限流机制。
    import time
    
    # 在请求前添加延时
    time.sleep(1)
    

    四、处理异常和超时

    在调用 execute() 前加入异常处理,避免程序崩溃:

    try:
        response = request.execute()
    except Exception as e:
        print("API 请求失败:", e)
    

    ✅ 总结

    | 问题 | 解决方法 | |------|----------| | 全局代理未生效 | 使用 requests 作为底层 HTTP 客户端,并手动设置代理 | | API Key 无效 | 检查 API Key 是否启用并正确配置 | | 请求超时 | 添加请求间隔、设置合理超时时间、增加异常捕获 | | 频率限制 | 控制请求频率,避免触发限流 |


    ✅ 推荐工具/库

    • requests: 更灵活的 HTTP 请求库,适合调试 API
    • pytube / youtube-dl: 如果你需要下载视频或获取更多元数据
    • tenacity: 用于重试失败的 API 请求(可选)

    如有其他问题,比如如何解析 JSON 数据、如何保存到文件等,也可以继续问我!

    评论

报告相同问题?

问题事件

  • 创建了问题 9月8日