要确认动态页面的可见内容,不能只看浏览器里显示了什么,而要看搜索引擎或用户实际请求时,服务器返回的HTML中是否包含目标文字。最直接的做法是:用“查看网页源代码”或命令行请求该URL,搜索目标内容;如果源代码里没有,只在浏览器里看得到,就说明它很可能是由JavaScript在客户端渲染出来的,需要进一步判断渲染层与抓取层是否一致。
动态页面的“可见”至少有三层含义,混在一起就会误判:
判断时要以“抓取端实际拿到什么”为准,而不是以自己浏览器为准。浏览器可能带着登录态、缓存、扩展插件,这些都会让页面看起来比抓取端更完整。
第一步,在浏览器中打开目标动态页面,右键选择“查看网页源代码”,不要用“检查”面板里的Elements,因为那里显示的是脚本执行后的DOM。在源代码中搜索一段你关心的文字,比如商品名、正文首句、列表项。如果搜不到,记录为“源码不含目标内容”。
第二步,用命令行模拟一次不带浏览器缓存的请求,例如:
curl -A "Mozilla/5.0" -s https://example.com/page > page.html
然后在本地的page.html里搜索目标文字。这一步能排除浏览器缓存和登录态的干扰。如果curl返回的内容与源码一致、都不含目标文字,基本可以判断内容依赖客户端渲染。
第三步,如果页面依赖接口返回数据,打开浏览器开发者工具的Network面板,刷新页面,找到返回目标内容的XHR或fetch请求。记录该接口的URL、请求方法、是否带参数、返回的是JSON还是HTML。若该接口被robots.txt屏蔽,或需要特定Cookie、Token才能返回数据,抓取端就可能拿不到内容。
收集到证据后,按以下顺序判断:
这里要区分“可能原因”和“已经定位的原因”。同一个现象可能有多种解释,比如页面空白既可能是脚本报错,也可能是接口超时,还可能是IP被限流。只有通过对比请求结果,才能把范围缩小到具体一项。
确认原因后,处理方式要对应具体环节:
处理后必须复查,而不是改完就结束。复查步骤与初次检查相同:重新用curl请求,确认源码中出现目标文字;再用浏览器查看源代码核对;最后在抓取端可用的调试工具中请求一次,确认返回内容一致。如果目标搜索引擎提供抓取测试或渲染测试,用它请求同一URL,观察返回的HTML是否包含目标内容。不同搜索引擎对JavaScript渲染的支持情况不同,须分别核查,不能用一个引擎的结果推断另一个。
下一步,挑一个你怀疑有问题的动态页面,按“查看源代码→curl请求→Network找接口→对比抓取端返回”的顺序走一遍,把每一步的结果记下来,再决定是改渲染方式还是改抓取配置。