使用相同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




