GET请求返回403 Forbidden但浏览器可正常加载,尝试User-Agent仍未解决
嘿,我看你遇到了403 Forbidden的麻烦,换了各种User-Agent甚至用了fake user-agent库都没搞定对吧?这种情况很常见,目标网站的反爬机制肯定不止检查UA这一项,我给你几个方向试试:
先搞定Cookie的问题
很多网站会在你首次访问时设置必要的Cookie,后续请求如果不带这些Cookie直接被拦截。试试先访问网站的首页或者某个前置页面获取Cookie,再带着Cookie去请求目标数据页:with requests.Session() as c: # 先访问网站首页获取初始Cookie c.get('https://目标网站的首页URL') ua = UserAgent() headers = {'User-Agent': str(ua.chrome)} # 现在带着Session里的Cookie和UA请求目标页 page = c.get('你的目标数据URL', headers=headers)补充完整的请求头
除了User-Agent,网站可能还会校验Accept、Referer、Accept-Language这些常见请求头,模拟真实浏览器的请求头组合往往能解决问题:ua = UserAgent() headers = { 'User-Agent': str(ua.chrome), 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Referer': 'https://目标网站的首页URL', # 填你从哪个页面跳过来的 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1' } with requests.Session() as c: page = c.get('你的目标数据URL', headers=headers)警惕JS验证或浏览器指纹检测
如果网站用了更复杂的反爬,比如通过JavaScript生成验证参数(像__jsl_clearance这类),或者检测你是不是真实浏览器(比如有没有Canvas指纹、window对象),那单纯用requests就很难绕过了。这种时候建议用playwright或者selenium模拟真实浏览器环境:# 用playwright的例子,需要先安装:pip install playwright && playwright install from playwright.sync_api import sync_playwright with sync_playwright() as p: # 可以设置headless=True让浏览器后台运行 browser = p.chromium.launch(headless=False) page = browser.new_page() page.goto('你的目标数据URL') # 等待页面加载稳定,避免获取到不完整内容 page.wait_for_load_state('networkidle') html_content = page.content() print(html_content) browser.close()检查IP是否被封禁
如果你之前频繁请求过这个网站,你的IP可能已经被拉黑了,这时候换UA也没用。可以试试用代理IP来请求:proxies = { 'http': 'http://你的代理IP:端口', 'https': 'https://你的代理IP:端口' } with requests.Session() as c: ua = UserAgent() headers = {'User-Agent': str(ua.chrome)} page = c.get('你的目标数据URL', headers=headers, proxies=proxies)
最后提醒一句:爬取网站数据前一定要遵守网站的robots.txt协议,不要过度请求给服务器造成压力,避免法律风险哦。
内容的提问来源于stack exchange,提问作者Mathiasfc




