littleseal 发表于 前天 10:40

想请教下想爬取ytb数据,但是显示访问超时

想请教下,我用 ytbv3 官方 API 爬取数据时出现访问超时,已开启quanju代理,且环境测试脚本运行正常。请问有朋友能指导下如何解决吗?


爬取脚本
from googleapiclient.discovery import build
import pandas as pd
from datetime import datetime
import os

# -------------------------
# 1. 配置参数
# -------------------------
API_KEY = aaaaaaaaaaaa# 替换成你的 YouTube Data API Key
PLAYLIST_ID = "aaaaaaaaaaaa"# 替换成目标播放列表ID
OUTPUT_FILE = "youtube_playlist_stats.xlsx"

# -------------------------
# 2. 初始化 YouTube API
# -------------------------
youtube = build("youtube", "v3", developerKey=API_KEY)

# -------------------------
# 3. 获取播放列表中的视频ID
# -------------------------
video_ids = []
next_page_token = None

while True:
    playlist_request = youtube.playlistItems().list(
      part="contentDetails",
      playlistId=PLAYLIST_ID,
      maxResults=50,
      pageToken=next_page_token
    )
    playlist_response = playlist_request.execute()

    for item in playlist_response["items"]:
      video_ids.append(item["contentDetails"]["videoId"])

    next_page_token = playlist_response.get("nextPageToken")
    if not next_page_token:
      break

print(f"📋 播放列表共找到 {len(video_ids)} 个视频")

# -------------------------
# 4. 获取视频统计数据
# -------------------------
all_data = []
crawl_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

for i in range(0, len(video_ids), 50):
    batch = video_ids
    video_request = youtube.videos().list(
      part="statistics,snippet",
      id=",".join(batch)
    )
    video_response = video_request.execute()

    for item in video_response["items"]:
      stats = item["statistics"]
      snippet = item["snippet"]

      all_data.append({
            "抓取时间": crawl_time,
            "视频标题": snippet["title"],
            "视频ID": item["id"],
            "播放量": int(stats.get("viewCount", 0)),
            "点赞数": int(stats.get("likeCount", 0)),
            "评论数": int(stats.get("commentCount", 0))
      })

# -------------------------
# 5. 保存到 Excel
# -------------------------
df_new = pd.DataFrame(all_data)

if os.path.exists(OUTPUT_FILE):
    df_old = pd.read_excel(OUTPUT_FILE)
    df_all = pd.concat(, ignore_index=True)
else:
    df_all = df_new

df_all.to_excel(OUTPUT_FILE, index=False)

print(f"✅ 数据已保存到 {OUTPUT_FILE}")








环境测试脚本a
import requests

try:
    # 访问 YouTube Data API 测试 URL
    r = requests.get("通过自己的apikey获取某个ytb视频的链接,目前还没有权限发链接", timeout=10)
    print(r.status_code, r.text[:200])
except Exception as e:
    print("访问失败:", e)

FishC 发表于 前天 10:42

您好!看到您在使用 YouTube Data API v3 时遇到访问超时问题,虽然已开启全局代理且环境测试正常,但爬取脚本仍超时。我来帮您分析一下可能的原因和解决方案。

首先,您的爬取脚本中有几处代码错误需要修复,这些错误可能导致请求无法正常发送。以下是修正后的代码关键部分:


# 初始化 video_ids 为空列表
video_ids = []

# 获取播放列表中的视频ID
next_page_token = None
while True:
    playlist_request = youtube.playlistItems().list(
      part="contentDetails",
      playlistId=PLAYLIST_ID,
      maxResults=50,
      pageToken=next_page_token
    )
    playlist_response = playlist_request.execute()
   
    # 正确提取 items
    items = playlist_response.get('items', [])
    for item in items:
      video_id = item['contentDetails']['videoId']
      video_ids.append(video_id)# 添加视频ID到列表
   
    next_page_token = playlist_response.get('nextPageToken')
    if not next_page_token:
      break

print(f"找到 {len(video_ids)} 个视频")

# 获取视频统计数据
all_data = []
crawl_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

# 分批处理视频ID,每批50个
for i in range(0, len(video_ids), 50):
    batch = video_ids# 正确切片
    video_request = youtube.videos().list(
      part="statistics,snippet",
      id=",".join(batch)
    )
    video_response = video_request.execute()
    items = video_response.get('items', [])
   
    for item in items:
      stats = item.get('statistics', {})
      snippet = item.get('snippet', {})
      all_data.append({
            "抓取时间": crawl_time,
            "视频标题": snippet.get('title', 'N/A'),
            "视频ID": item.get('id', 'N/A'),
            "播放量": int(stats.get("viewCount", 0)),
            "点赞数": int(stats.get("likeCount", 0)),
            "评论数": int(stats.get("commentCount", 0))
      })

# 保存到Excel(修正concat部分)
if os.path.exists(OUTPUT_FILE):
    df_old = pd.read_excel(OUTPUT_FILE)
    df_all = pd.concat(, ignore_index=True)# 添加缺失参数
else:
    df_all = df_new
df_all.to_excel(OUTPUT_FILE, index=False)


### 解决超时问题的建议:
1. 代理设置问题:虽然您开启了全局代理,但 googleapiclient 可能不会自动使用系统代理。建议在代码中显式设置代理。例如,使用 requests 库的会话对象来配置代理,然后传递给 build 函数。示例:
   
   import requests
   from googleapiclient.discovery import build
   from googleapiclient.http import HttpRequest

   # 创建带代理的 HTTP 对象
   proxies = {
       "http": "http://your-proxy-address:port",# 替换为您的代理地址和端口
       "https": "http://your-proxy-address:port"
   }
   session = requests.Session()
   session.proxies = proxies
   http = HttpRequest(session=session)

   # 初始化 YouTube API 时传入 http 对象
   youtube = build("youtube", "v3", developerKey=API_KEY, http=http)
   
   注意:将 your-proxy-address:port 替换为实际代理信息。

2. 添加超时和重试机制:API 请求可能因网络波动超时,建议在请求中添加超时参数和重试逻辑。例如:
   
   from tenacity import retry, stop_after_attempt, wait_exponential

   @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
   def make_request(request):
       return request.execute()
   
   # 在调用 request.execute() 的地方使用 make_request(playlist_request)
   
   首先安装 tenacity 库: pip install tenacity。

3. 检查 API 配额和限制:确保您的 API key 没有超过每日配额或速率限制。您可以在 Google Cloud Console 中查看使用情况。

4. 网络测试:运行环境测试脚本时,确认使用的是相同代理设置。如果测试脚本正常,但主脚本超时,可能是代码逻辑或代理未生效导致。

如果问题依旧,请检查代理稳定性或尝试更换代理节点。希望这能帮到您!如果还有其他问题,欢迎继续问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 想请教下想爬取ytb数据,但是显示访问超时