电脑港
白蓝主题五 · 清爽阅读
首页  > 软件应用

爬虫能看到JS渲染的HTML吗?别被页面“假象”骗了

打开一个电商网站,商品列表明明在浏览器里刷得飞快,可你用 requests 抓下来却只看到空空的 <div id="list"></div> —— 这不是爬虫出问题,是 JS 在后台悄悄把内容“画”出来的。

普通爬虫:只认静态HTML

像 Python 的 requests、curl 或早期的采集工具,本质就是发个 HTTP 请求,拿回服务器返回的原始 HTML 字符串。它不装浏览器,不执行 JS,也不解析 DOM 动态变化。哪怕页面里写了 document.getElementById('list').innerHTML = '<li>iPhone 15</li>',它也当没看见。

那怎么才能抓到JS渲染后的内容?

两种主流路子:

① 换成能跑JS的工具:比如 Puppeteer(Node.js)、Playwright、或者 Selenium 驱动真实浏览器。它们会加载完整页面,等 JS 执行完、DOM 渲染好,再把最终 HTML 拿出来。
举个 Playwright 小例子:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.goto('https://example-shop.com')
    page.wait_for_timeout(2000)  # 等JS加载数据
    html = page.content()  # 拿到渲染后的HTML
    print(html)
    browser.close()

② 绕过前端,直击数据源头:按 F12 打开开发者工具,切到 Network → XHR / Fetch,刷新页面,看看哪些请求返回的是 JSON 数据(比如 /api/products?page=1)。这类接口往往才是真实数据源,比硬啃渲染页更稳、更快、更省资源。

顺手提醒一句

有些网站加了反爬保护,比如 Puppeteer 默认会被识别为自动化工具。这时候得加上启动参数伪装成真人浏览器,或者换用无头 Chrome 的 stealth 插件。不然刚点开页面,弹出个“检测到异常访问”,那就白忙活了。

说到底,爬虫能不能看到 JS 渲染内容,不取决于“想不想”,而取决于“用不用浏览器环境”。别光盯着页面长啥样,多翻翻 Network 和 Elements 面板——那里藏着真正的答案。