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

使用相同URL时,Python requests.get()获取的HTML代码与Chrome审查元素不一致的问题

解决requests爬取内容与浏览器不一致的问题

这个问题我之前处理过好几次,核心原因基本都是页面内容是动态渲染或依赖前端状态切换——你在Chrome里看到的position板块,其实是页面加载后通过JavaScript响应用户交互(比如点击标签)动态加载/切换显示的,而requests.get()只会抓取页面初始加载的HTML,也就是默认展示的performance板块内容。下面给你几个可行的解决方案:

1. 检查并携带必要的请求头或Cookie

有些网站会用Cookie、请求头参数来记录当前激活的标签页状态,虽然URL看起来没变,但浏览器切换标签时可能悄悄更新了这些信息。你可以这么排查:

  • 打开Chrome开发者工具(按F12),切换到「Network」标签;
  • 点击页面上的position板块,观察Network面板里的请求变化,重点看有没有新增的Cookie(比如active_tab=position)或者请求头字段;
  • requests.get()里带上这些参数,示例代码:
    import requests
    
    # 模拟浏览器的User-Agent,避免被识别为爬虫
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
    }
    # 替换成你查到的实际Cookie键值对
    cookies = {
        'active_tab': 'position'
    }
    
    response = requests.get(你的目标URL, headers=headers, cookies=cookies)
    

2. 直接调用动态加载的API接口

很多网站的标签页内容是通过AJAX请求单独获取的,不会刷新整个页面。这种情况下,直接调用API效率更高:

  • 在Chrome Network标签里,切换到「XHR/Fetch」分类;
  • 点击position板块后,找到加载该板块数据的API请求,复制它的URL、请求方法(GET/POST)和所需参数;
  • requests直接请求这个API,就能拿到纯净的position数据,示例:
    import requests
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
        # 如果需要其他请求头(比如Authorization),也一起带上
    }
    api_url = 'https://目标网站域名/api/position-data'  # 替换成实际API地址
    params = {
        'item_id': '12345',  # 替换成实际需要的参数
        'tab_type': 'position'
    }
    
    response = requests.get(api_url, params=params, headers=headers)
    position_data = response.json()  # 如果返回的是JSON格式,直接解析
    

3. 使用无头浏览器模拟真实交互

如果页面是复杂的单页应用(比如Vue、React开发的),JS渲染逻辑复杂,前面的方法不好用,可以用无头浏览器工具模拟真实浏览器的操作:

  • 推荐用playwright,它的API更简洁,示例代码:
    from playwright.sync_api import sync_playwright
    
    with sync_playwright() as p:
        # 启动无头浏览器(headless=True表示不显示浏览器窗口)
        browser = p.chromium.launch(headless=True)
        page = browser.new_page()
        page.goto(你的目标URL)
        # 点击position板块的标签,这里用文本选择器,你可以换成实际的CSS选择器
        page.click('text="Position"')
        # 等待position板块内容加载完成,替换成该板块的CSS选择器
        page.wait_for_selector('.position-section')
        # 获取渲染后的完整HTML
        rendered_html = page.content()
        browser.close()
    
  • 这个方法能完全模拟浏览器的渲染过程,拿到和你在Chrome审查元素里看到的一模一样的内容。

最后提醒一下:爬取数据前请遵守网站的robots.txt规则,不要频繁请求给服务器造成压力哦。

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

火山引擎 最新活动