首页 > 解决方案 > 如何使用 python 请求从 Cloudfront 下载

问题描述

尝试使用 python 从云端下载文件时出现 403 错误。我的代码如下所示:

import requests
import shutil


headers = {
    'authority': 'd2mgevdyeotxc9.cloudfront.net',
    'origin': 'https://www.djcity.com',
    'upgrade-insecure-requests': '0',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-user': '?1',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
    'sec-fetch-site': 'cross-site',
    'referer': 'https://www.djcity.com/digital/team-salut-wagon----67677.htm',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'en-AU,en-GB;q=0.9,en-US;q=0.8,en;q=0.7',
}

url = 'https://d2mgevdyeotxc9.cloudfront.net/6/7/6/7/7/zohujeaftuoduhba.mp3?response-content-disposition=attachment%3bfilename%3d%22Team%2520Salut%2520-%2520Wagon%2520%28Intro%29.mp3%22%3bfilename%2a%3dUTF-8%27%27Team%2520Salut%2520-%2520Wagon%2520%28Intro%29.mp3&Expires=1570451804&Signature=RPS7J02WY~eHDGYQHHSel9v~bpRolXl~WfgZjO21BrFhLuQQGkBSKkViD~-~K9DGPxmK0yj6-3zVrjrj1nLDMTelKQcbGk8tqyTBgbyI8NGMI9neR~wdtydKedxFp0a3YRHoM03boPFqwKKnKl5PcVxle1tCoXODydUq6Uj-iFxfYfpj10V0oJCa1Kv6SqWrrh1AGnW9CZOSPTlokjWzH6QS7DzBPN-0JacZDkLtG7wnnpcAT9Woj6h3YkdqMlfPpugxauUMXPxFg9sao-IG0BI4SyLeKCzZbJAqwAJruDoVZ1lKOwzgruDkCNPYERfpUytiOMdnbboL9lro4rvymg__&Key-Pair-Id=APKAJLJPFMSLJDIGQDHA'
with requests.get(url, stream=True) as r:
    with open('track1.mp3', 'wb') as f:
        shutil.copyfileobj(r.raw, f)

我得到以下响应标头:

'Content-Type': 'text/html', 
'Content-Length': '228',
'Connection': 'keep-alive', 
'Date': 'Thu, 03 Oct 2019 19:00:44 GMT',
'Last-Modified': 'Mon, 25 Sep 2017 19:02:17 GMT', 
'ETag': '53954bb03f2f3597aa5025deb69ca9b4', 
'Accept-Ranges': 'bytes',
'Server': 'AmazonS3', 
'X-Cache': 'Error from cloudfront', 
'Via': '1.1 934dd0fb722aa582f1b4a3cdae35b12d.cloudfront.net (CloudFront)', 
'X-Amz-Cf-Pop': 'SIN2-C1',
'X-Amz-Cf-Id': '4irBaWV9o-9_kQN0bNHFJydrIiuZxtVLZ36Oc5vDXX1AE76iTAbDww=='

例如,成功的响应标头如下所示:

'accept-ranges': 'bytes',

'content-disposition': 'attachment;filename="Carisma%20-%20Sample.mp3";filename*=UTF-8''Carisma%20-%20Sample.mp3',
'content-length': '7805066',
'content-type': 'audio/mpeg',
'date': 'Tue, 08 Oct 2019 00:01:06 GMT',
'etag': '83244899c9910bcf0f10f5065293b709',
'last-modified': 'Thu, 03 Oct 2019 01:03:52 GMT',
'server': 'AmazonS3',
'status': '200',
'via': '1.1 a84eb604396158af577c875ac569048a.cloudfront.net (CloudFront)',
'x-amz-cf-id': 'one65QPSUx5IB0_JMtinKzLles7vSchJXSz7ddx9auSPmbtqJ0Doug==',
'x-amz-cf-pop': 'SIN2-C1',
'x-cache': 'Miss from cloudfront'

我不确定为什么它不工作,因为分析网络表明我已经发送了所有必需的标头。我怎样才能让这些请求工作?

响应内容似乎正在发生重定向:b'<html><head><meta http-equiv="refresh" content="0;URL=http://www.djcity.com/digital/record-pool.aspx?m=3"><script>window.location.replace("http://www.djcity.com/digital/record-pool.aspx?m=3");</script></head><body></body></html>'

标签: pythonamazon-web-servicespython-requestsamazon-cloudfront

解决方案


推荐阅读