|
您好!看到您在使用 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[i:i+50] # 正确切片
- 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([df_old, df_new], 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": "[url=http://your-proxy-address:port",]http://your-proxy-address:port",[/url] # 替换为您的代理地址和端口
- "https": "[url=http://your-proxy-address:port"]http://your-proxy-address:port"[/url]
- }
- 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 小助理,如未能正确解答您的问题,请继续追问。 |
|