我正在ScrapingHub上部署一堆蜘蛛。蜘蛛本身正在工作。我想根据蜘蛛是在本地运行还是在ScrapingHub上更改供稿输出(如果它在本地运行,则输出到一个临时文件夹,如果它在ScrapingHub上运行,则输出到S3)。我的想法是,我可以使用环境变量作为两者之间的切换。但是,尝试从我使用ScrapingHub接口设置的settings.py
(在Scrapy项目中)打印环境变量会返回None
。我下面有一个代码片段,显示了我尝试做的事情。
奇怪的是,如果我仅将提要默认为S3(不基于env vars进行切换),则S3上传有效。 S3凭证也使用环境变量加载。尝试打印它们也会返回None
。但是,更改AWS密钥会导致上传失败,因此这些值会在某个时间点传递到Scrapy,也许不是在最初加载文件时出现。将环境变量设置为项目级别或蜘蛛级别不会更改任何内容。
我的问题是,在要部署在ScrapingHub上的Scrapy项目中使用环境变量的正确方法是什么?
# In settings.py
# Get the AWS credentials from the environment
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
# Print the credentials
print(AWS_ACCESS_KEY_ID) # Outputs None
print(AWS_SECRET_ACCESS_KEY) # Outputs None
FEED_URI = 's3://my-bucket/%(name)s/{}.json'.format(today.strftime('%Y-%m-%d'))
FEED_FORMAT = 'json'
编辑:
我发现一个support ticket on ScrapingHub出现了相同的问题。问题似乎与UI界面中的设置被覆盖的顺序有关。似乎没有关于此的任何文档。另外,scrapy:1.4
堆栈消除了S3问题。使用最新的scrapy:1.6
堆栈会导致出现此问题。仍然没有令人满意的解决方案。
答案 0 :(得分:0)
您可以在python中检查boto3库
示例代码
import boto3
# s3 region
sts_client = boto3.client('sts')
assumed_role_object = sts_client.assume_role(
RoleArn="Roleproperty",
RoleSessionName="SessionProperty"
)
#s3 cli credentials
credentials = assumed_role_object['Credentials']
aws_access_key_id=credentials['AccessKeyId']
aws_secret_access_key=credentials['SecretAccessKey']
aws_session_token=credentials['SessionToken']
参考
https://dluo.me/s3databoto3 https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html