如何用Python从url.bin获取图片?解决403 AccessDenied问题
解决请求url.bin返回403 AccessDenied的问题
我用Python的requests库请求指定URL(url.bin)下载图片时返回403状态码,代码如下:
import requests # URL of the avatar image avatar_url = "url.bin" # Custom headers headers = { "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36", "Accept": "*/*", } # Send a GET request to the avatar URL with headers response = requests.get(avatar_url, headers=headers, stream=True) print(f"Content-Type: {response.headers.get('Content-Type')}") # Check if the request was successful if response.status_code == 200: # Save the image to a file with open("avatar_VGA23498.bin", "wb") as file: file.write(response.content) print("Avatar downloaded successfully.") else: print(f"Failed to download avatar. Status code: {response.status_code}")
直接访问该URL时,页面返回错误:
<Error> <script/> <Code>AccessDenied</Code> <Message>Access Denied</Message> <RequestId>96KTSVWPQR3YZHJW</RequestId> <HostId>WbjxwXXuo92OUkd+0VP8Pg1rvm6vFWg1s7ciyyxlfr/O4S62Q77yCHJzRb1YnJlIqvlpkP+LduV2wQBUxsDsOQ== </HostId> </Error>
可行的解决步骤
1. 补充完整请求头字段
很多云存储或CDN服务会校验多个请求头字段,仅User-Agent和Accept可能不够。你可以在浏览器中打开开发者工具(F12),找到该资源的合法请求,复制全部Request Headers,替换到代码中:
headers = { "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36", "Accept": "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9", "Referer": "https://example.com/", # 替换为图片所在的页面URL "Connection": "keep-alive", "Sec-Fetch-Dest": "image", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-site" }
2. 携带登录Cookie(如果需要)
如果该资源需要登录权限才能访问,把浏览器中登录后的Cookie字符串复制到请求头里:
headers["Cookie"] = "your_cookie_string_here"
3. 验证URL有效性与权限
- 该URL可能是临时签名链接,已经过期,需要重新获取有效的签名地址。
- 检查是否存在IP白名单限制,若有,可尝试使用对应白名单内的IP或合规代理访问。
- 确认自身是否拥有该资源的访问权限,比如是否属于指定用户组。
4. 使用Session保持会话一致性
部分网站会校验会话状态,用requests.Session()发起请求可以维持会话信息:
import requests session = requests.Session() session.headers.update(headers) response = session.get(avatar_url, stream=True) # 后续保存文件的逻辑不变
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

