You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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,网站可能还会校验AcceptRefererAccept-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

火山引擎 最新活动