如何用Python通过浏览器访问返回403状态的URL?

我现在有一个 img 的 url, 在客户端上访问这个 url 会直接 403 掉, 但是在 web 服务器上能正常访问这个 url

所以我要怎么做才能客户端浏览器通过 web 服务器去正常访问这个 url 呢?

PS:由于是个人玩耍用的服务器,资源有限,尽量不想在服务器上下载 img 再通过浏览器访问 web 服务器上的 img


如何用Python通过浏览器访问返回403状态的URL?
16 回复

请先查看 提问的智慧 http://doc.zengrong.net/smart-questions/cn.html

403 一看就是 forbidden,权限不足,为什么服务器能访问到客户端不能访问到,要么是要 aksk,要么是要别的身份验证。
家庭作业题,请自行 Google 答案。


遇到403错误,说明服务器识别出了你的请求是自动化脚本并拒绝了访问。要解决这个问题,你得让你的Python请求看起来更像一个真实的浏览器。核心是设置完整的请求头,特别是User-Agent,并管理好会话(cookies)。直接用requests库的Session对象是最佳实践。

下面是一个可以直接运行的示例代码。它会尝试访问一个示例URL(这里用了http://httpbin.org/headers来演示,实际使用时替换成你的目标URL),并打印出服务器看到的请求头,这能帮你确认伪装是否成功。

import requests

# 目标URL (请替换为实际需要访问的地址)
url = 'http://httpbin.org/headers'

# 创建一个会话对象,它会自动处理cookies,保持连接
session = requests.Session()

# 定义一组完整的浏览器请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'Accept-Encoding': 'gzip, deflate',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
}

# 将请求头更新到会话中
session.headers.update(headers)

try:
    # 发送GET请求
    response = session.get(url)
    # 打印状态码和响应内容(这里服务器会返回它接收到的请求头,用于验证)
    print(f"状态码: {response.status_code}")
    print("响应内容(服务器看到的请求头):")
    print(response.text)

except requests.exceptions.RequestException as e:
    print(f"请求发生错误: {e}")

关键点解释:

  1. Session对象:使用requests.Session()而不仅仅是requests.get(),可以保持跨请求的cookies和连接,行为更接近浏览器。
  2. 请求头User-Agent是最关键的,上面代码中的是一个常见的Chrome浏览器标识。其他如AcceptAccept-Language等也使请求更“逼真”。你可以通过浏览器开发者工具的Network面板,复制任意一个请求的Request Headers来获取最新、最全的头部信息。
  3. 结果验证:代码中使用的httpbin.org/headers会回显它收到的请求头,这是调试和验证你的伪装是否有效的绝佳工具。

如果加上完整请求头后仍然遇到403,那可能是网站采用了更复杂的反爬机制(如JavaScript验证、IP频率限制等),这时可能需要考虑使用selenium来模拟完整浏览器行为,或者检查是否有必要的Referer等特定头部缺失。

总结:用Session加完整请求头来模拟浏览器。

把服务器当做代理服务器

403 本来就是权限问题,所以要不然直接拿到权限,要不然只能服务器反代。

第一次在 V2EX 提问,我表达没清楚很抱歉…
403 是因为 user-agent 过滤掉了
我在 web 服务器上伪造 user-agent 是能够正常访问的
但是 js 好像是不能改 UA 的
所以我想问有没有什么其他的办法的

我找到思路了,多谢了!

盗链可不是个好习惯 :(

前端的话有个 hack 思路 所有图片都用 iframe 套

#5 找到思路说一下啊。。。

<meta name=“referrer” content=“never”>

选一个带 token 的 url,你看会不会被 403

请问这样的意义是什么?

不发送 referrer 就可以绕过 403 吗?

你得看图片源的 referrer 策略,如果是允许空的话,那么是可以的。不过这么做简直是杀敌一千自损八百,自己正常的业务也收不到 referrer 了

#12 我曾经尝试过用空 iframe 里再加载一个 iframe 的方式绕过限制 感觉会不会更好?

emmm,我只用在个人服务器,学习用的,正经的话我肯定不会这样干的,直接弄个自己的资源服务器

就是用代理服务器代理访问就好了,比如说 nginx,关键词 proxy_pass,proxy_set_header

回到顶部