Google Drive批量下载大量文件遇403限制,求高效解决方案
解决Google Drive批量下载403限制的高效方案
1. 使用Google Drive官方API(优先推荐)
Google Drive API的请求配额远高于普通浏览器下载,能大幅降低403错误的触发概率,同时支持批量操作和直接流处理(无需本地存储)。
操作步骤:
- 登录Google Cloud Console,创建新项目并启用Google Drive API
- 创建服务账号密钥,下载JSON格式的凭据文件
- 联系客户,将所有简历文件(或其所在文件夹)共享给服务账号对应的邮箱
- 编写脚本批量处理(以Python为例):
- 读取Excel中的简历链接,提取每个文件的
fileId(链接中d/后、/或?前的字符串) - 通过API获取文件流,直接上传至S3,跳过本地存储环节
- 读取Excel中的简历链接,提取每个文件的
示例代码片段:
from googleapiclient.discovery import build from google.oauth2 import service_account import boto3 import pandas as pd # 初始化Drive API客户端 SERVICE_ACCOUNT_KEY = 'your-service-account-key.json' SCOPES = ['https://www.googleapis.com/auth/drive.readonly'] creds = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_KEY, scopes=SCOPES) drive_service = build('drive', 'v3', credentials=creds) # 初始化S3客户端 s3 = boto3.client('s3') BUCKET_NAME = 'your-target-s3-bucket' # 读取Excel中的链接数据 df = pd.read_excel('employee-resumes.xlsx') for _, row in df.iterrows(): link = row['resume_link'] file_id = link.split('/d/')[1].split('/')[0] employee_name = row['employee_name'] # 假设Excel包含员工名字列 # 下载文件流 media_request = drive_service.files().get_media(fileId=file_id) file_content = media_request.execute() # 上传至S3 s3_key = f"resumes/{employee_name}.pdf" s3.put_object(Bucket=BUCKET_NAME, Key=s3_key, Body=file_content)
2. 优化普通下载的请求策略
如果暂时不想接入API,可通过调整下载逻辑绕过Google的限制:
- 转换为直接下载链接:将标准Drive链接(如
https://drive.google.com/file/d/FILE_ID/view)替换为https://drive.google.com/uc?export=download&id=FILE_ID,减少跳转环节的限制触发 - 添加随机请求间隔:每次下载后暂停1-3秒(用随机值,避免固定间隔被识别为机器人),代码中可使用
time.sleep(random.uniform(1, 3)) - 模拟浏览器请求:设置请求头的
User-Agent为常见浏览器标识,例如:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - 禁用并发下载:用单线程执行下载任务,避免同时发起多个请求触发配额限制
3. 利用Drive文件夹批量导出
如果客户配合,让其将所有简历文件整理到单个Google Drive文件夹并共享给你:
- 直接右键文件夹选择「下载」,Drive会自动打包为ZIP文件,一次性完成所有文件下载,不会触发单文件下载的配额限制
- 或使用
rclone工具同步:配置rclone连接Google Drive后,直接将文件夹同步到S3,无需本地存储:# 先通过rclone config配置Google Drive和S3连接 rclone sync gdrive:resume-collection s3:your-bucket/resumes
4. 自动重试与指数退避
无论采用哪种方案,都应添加自动重试逻辑,遇到403错误时按指数退避策略等待后重试(例如第一次等10秒,第二次20秒,最多重试5次),减少手动干预。
示例(使用Python的tenacity库):
from tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(5), wait=wait_exponential(multiplier=1, min=10, max=60)) def process_file(file_id, s3_key): media_request = drive_service.files().get_media(fileId=file_id) file_content = media_request.execute() s3.put_object(Bucket=BUCKET_NAME, Key=s3_key, Body=file_content)
内容的提问来源于stack exchange,提问作者Sohayb Saleh
相关产品推荐
相关产品推荐

