你在用 Vue 或 React 做单页应用(SPA),首页内容全靠 JS 动态塞进去,结果发现百度搜不到关键信息、监控脚本抓不到实时状态——不是代码写错了,很可能是爬虫根本没看到你渲染出来的 HTML。
普通爬虫:只认静态 HTML
像百度蜘蛛、早期 Python requests + BeautifulSoup 这类传统爬虫,本质就是发个 GET 请求,拿回服务器吐出的原始 HTML 字符串,然后解析。它不执行 JS,也不启动浏览器环境。如果你的页面源码里只有 <div id="app"></div>,而所有文字都靠 fetch() 拿数据再 innerHTML = ... 塞进去,那爬虫看到的就是空壳子。
能跑 JS 的爬虫:越来越常见
但别以为现在还全是“哑巴爬虫”。Googlebot 早就能执行基础 JS(虽有超时和资源限制),Selenium、Playwright、Puppeteer 写的定制爬虫也能完整模拟浏览器行为。比如你写一段:
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
await page.waitForSelector('.content');
const html = await page.content(); // 这时候拿到的是 JS 渲染后的 DOM这种爬虫确实能看到 JS 渲染后的内容,但代价是慢、耗资源、容易被反爬识别。
路由调优时怎么办?
在“路由调优”这个场景下,很多人会把前端路由(如 Vue Router 的 history 模式)和 SEO、监控、自动化测试混在一起考虑。比如你把设备状态页设成 /status/:id,但服务端没配 fallback,爬虫直接 404;或者用了懒加载 + 动态 import,首屏 JS 没跑完,关键节点就一直空着。
简单对策有三个:
① 服务端渲染(SSR)或静态站点生成(SSG),让 HTML 在返回前就带好内容;
② 配置服务端 fallback,比如 Nginx 把所有前端路由都指向 index.html,再交由前端路由接管;
③ 关键数据接口做预加载,或在 <script type="application/ld+json"> 里埋结构化数据,方便搜索引擎理解。
别光盯着“能不能看到”,更要看“谁在看、怎么看、看多久”。监控脚本用 Puppeteer 是为了准,SEO 优化用 SSR 是为了快,而路由器配置写错一行,可能让两者全扑空。