如何在Google Colab(安卓平板)将网页PDF批量上传至AWS S3存储桶
批量上传网页PDF到AWS S3的可行方案
方案一:直接在Google Colab中完成(适合新手,无需Lambda)
你已经能在Colab中抓取PDF链接,直接扩展代码完成上传是最便捷的方式,步骤如下:
1. 安装AWS SDK(boto3)
在Colab单元格中执行:
pip install boto3
2. 配置AWS凭证
Colab提供安全的凭证存储方式,避免硬编码:
- 点击左侧菜单栏的🔑 Secrets 选项
- 点击 Add new secret,分别添加:
- 名称:
AWS_ACCESS_KEY_ID,值填你的AWS访问密钥ID - 名称:
AWS_SECRET_ACCESS_KEY,值填你的AWS秘密访问密钥
- 名称:
在代码中加载凭证并初始化S3客户端:
from google.colab import userdata import boto3 s3 = boto3.client( 's3', aws_access_key_id=userdata.get('AWS_ACCESS_KEY_ID'), aws_secret_access_key=userdata.get('AWS_SECRET_ACCESS_KEY') )
3. 修改代码实现下载+上传逻辑
替换原打印链接的代码,直接通过字节流上传PDF到S3,无需本地存储:
import requests import bs4 from google.colab import userdata import boto3 # 初始化S3客户端 s3 = boto3.client( 's3', aws_access_key_id=userdata.get('AWS_ACCESS_KEY_ID'), aws_secret_access_key=userdata.get('AWS_SECRET_ACCESS_KEY') ) DOMAIN = "https://www.conab.gov.br" URL = "https://www.conab.gov.br/info-agro/analises-do-mercado-agropecuario-e-extrativista/analises-do-mercado/historico-de-conjunturas-de-cafe" filetype ='download' BUCKET_NAME = "你的S3存储桶名称" # 替换为你的实际桶名 def get_soup(url): return bs4.BeautifulSoup(requests.get(url).text, 'html.parser') for link in get_soup(URL).find_all('a'): pdf_link = link.get('href') if filetype in pdf_link: pdf_file_url = DOMAIN + pdf_link # 从URL提取文件名 filename = pdf_file_url.split('/')[-1] print(f"处理文件: {filename}") # 下载PDF字节流 response = requests.get(pdf_file_url, stream=True) response.raise_for_status() # 捕获请求错误 # 上传到S3 s3.upload_fileobj( response.raw, BUCKET_NAME, filename # 可自定义S3中的路径,比如"cafe-reports/" + filename ) print(f"{filename} 已成功上传到S3")
关键注意事项
- 确保你的AWS IAM用户拥有
s3:PutObject权限,且权限策略已关联到该用户 - 若遇权限错误,检查IAM策略是否允许访问目标存储桶
方案二:修复Lambda的bs4层问题(若坚持使用Lambda)
之前添加bs4层报错,多因打包方式错误,正确步骤如下:
1. 正确打包依赖层
在Colab或本地创建依赖目录并打包:
mkdir python pip install bs4 requests -t python/ cd python zip -r bs4-requests-layer.zip .
注意:zip包根目录需直接包含bs4、requests等文件夹,不能嵌套。
2. 创建Lambda层并关联函数
- 登录AWS控制台,进入Lambda层管理页面,创建新层,上传上述zip包,选择与Lambda函数一致的Python运行时版本(如Python 3.10)
- 在目标Lambda函数的"层"配置中添加该层
Lambda函数示例代码
import requests import bs4 import boto3 s3 = boto3.client('s3') DOMAIN = "https://www.conab.gov.br" URL = "https://www.conab.gov.br/info-agro/analises-do-mercado-agropecuario-e-extrativista/analises-do-mercado/historico-de-conjunturas-de-cafe" filetype ='download' BUCKET_NAME = "你的S3存储桶名称" def lambda_handler(event, context): def get_soup(url): return bs4.BeautifulSoup(requests.get(url).text, 'html.parser') for link in get_soup(URL).find_all('a'): pdf_link = link.get('href') if filetype in pdf_link: pdf_file_url = DOMAIN + pdf_link filename = pdf_file_url.split('/')[-1] response = requests.get(pdf_file_url, stream=True) response.raise_for_status() s3.upload_fileobj( response.raw, BUCKET_NAME, filename ) return {"statusCode": 200, "body": "PDF批量上传完成"}
Lambda注意事项
- 确保Lambda执行角色拥有
s3:PutObject权限 - Lambda默认最大执行时间为15分钟,若PDF数量过多需确认总耗时不超限
内容的提问来源于stack exchange,提问作者thi.sampai
相关产品推荐
相关产品推荐

