想请教下想爬取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)
您好!看到您在使用 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]