要让Baiduspider确认动态页面的可见内容,核心不是“看页面能不能打开”,而是确认在不执行复杂交互、不依赖用户登录或点击的情况下,返回的HTML中已经包含你希望被抓取到的正文。如果正文只能靠JavaScript运行后才出现,Baiduspider可能看不到,也可能看到的是空壳。判断方法应以服务端返回的原始响应为准,而不是浏览器里最终渲染出来的画面。
假设有一个商品详情页,地址形式为 /product?id=123,页面打开后能看到价格、库存和描述。前端用JavaScript请求接口,再把数据插入页面。你在浏览器里看一切正常,但在服务器返回的HTML里,正文位置只有“加载中”。这种情况下,Baiduspider抓取到的可见内容很可能只是“加载中”,而不是商品信息。
要确认,可以按下面步骤执行:
curl -A "Baiduspider" "https://example.com/product?id=123",把返回内容保存下来。判断结果很直接:原始HTML中能找到正文,才有较大把握被当作可见内容处理;原始HTML中没有,就不能仅凭浏览器显示正常来判断Baiduspider一定能看到。
动态页面的“可见”至少有三个层次,确认时要分开:
常见错误是只检查用户可见,就认为抓取可见。另一个错误是只看到HTTP状态码为200,就认为正文一定被识别。状态码正常只说明请求成功,不说明内容已经出现在HTML中。若页面返回200但正文为空,或者正文被放在接口响应里,仍需要继续核查。
可以按以下检查项逐项确认:
curl 或开发者工具的Network面板查看第一个HTML文档响应,而不是看XHR接口响应。如果原始HTML中没有正文,可以考虑服务端渲染、预渲染或静态化,让关键内容在首次响应中就出现。若使用预渲染,要确认返回给Baiduspider的版本与用户版本内容一致,不要用隐藏文字或仅对爬虫展示的内容,这容易引发一致性问题。
Baiduspider的行为不代表其他搜索引擎完全一样。对百度有效的抓取表现,不保证在别的搜索引擎同样成立;反过来也一样。动态页面确认可见内容时,应针对目标搜索引擎分别查看其抓取说明和实际请求结果。若页面同时面向多个搜索引擎,最好让核心内容在初始HTML中稳定出现,减少对脚本渲染的依赖。
下一步,挑一个最重要的动态页面,保存Baiduspider User-Agent下的原始HTML,搜索正文关键词。如果找不到,就把它改为服务端输出或预渲染输出,再重复同样的检查。