You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python爬虫遇HTTPError 403 Forbidden,添加请求头仍无效的解决办法

我之前爬某些反爬严格的网站时,也碰到过一模一样的糟心事!明明浏览器能正常打开页面,代码一跑就返回403,哪怕把浏览器的请求头全抄过去也没用。给你几个我亲测有效的排查方向和解决办法:

1. 检查请求头是否完整且精准

有时候浏览器的请求头里藏着很多容易被忽略的关键字段,比如:

  • Referer:告诉服务器你是从哪个页面跳转过来的,很多网站靠这个判断请求的合法性
  • Cookie:大部分网站会用Cookie识别用户会话,手动访问时浏览器已经保存了Cookie,代码里如果没带上就会被判定为异常请求
  • Accept-Encoding、Accept-Language这类看似不重要的字段,某些反爬机制也会校验

建议你用浏览器开发者工具(F12→Network)抓包,把所有请求头字段一字不差复制到代码里,别漏任何一个。另外,有些网站的Cookie需要先访问首页获取,再带着Cookie请求目标页面,你可以用requests.Session来维持会话:

import requests

session = requests.Session()
# 先访问网站首页,获取并保存Cookie
session.get('目标网站首页URL', headers=你的完整请求头)
# 再用同一个session请求目标页面
response = session.get('目标页面URL', headers=你的完整请求头)
2. 模拟真实浏览器的行为逻辑
  • 控制请求频率:手动访问时你会有间隔,但代码请求速度太快容易被检测到。可以加随机延迟:
    import random
    time.sleep(random.uniform(1, 3))  # 每次请求后随机等待1-3秒
    
  • 处理动态渲染:如果目标页面是JS动态加载的,纯HTTP请求工具(比如requests)无法执行JS,不仅拿不到内容还可能触发反爬。这时候可以用selenium或playwright模拟真实浏览器渲染:
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.add_argument('user-agent=你的浏览器UA')
    driver = webdriver.Chrome(options=options)
    driver.get('目标页面URL')
    # 获取渲染后的页面源码
    html = driver.page_source
    driver.quit()
    
3. 排查隐藏的反爬机制
  • 检查请求参数:对比浏览器请求和代码请求的URL参数,有些网站会对参数做加密校验,比如签名、时间戳之类的,参数不对就会返回403
  • IP封禁:如果你的IP被网站拉黑了,换个代理IP试试:
    proxies = {
        'http': 'http://代理IP:端口',
        'https': 'https://代理IP:端口'
    }
    response = requests.get('目标URL', headers=headers, proxies=proxies)
    
4. 验证请求头格式是否正确

你代码里的Accept字段写的是"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image...",这里看起来内容被截断了!要确保每个请求头字段的值和浏览器里的完全一致,不要有多余的空格、换行或者截断。

内容的提问来源于stack exchange,提问作者cydia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:53:25