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
相关产品推荐
相关产品推荐

