我对Facebook在显示网页时改善用户体验的 BigPipe技术非常感兴趣。缺点是它严重基于 Javascript,而且对搜索引擎一点也不友好。
在我自己的网站上开发类似技术时,我对其进行了设计,以便可以很容易地在服务器端禁用它以提供更多标准页面,而无需启用 BigPipe。现在,我正在寻找一种使它对爬虫友好的方法。
简单的方法是将非 BigPipe 内容提供给搜索引擎爬虫/机器人,并将流水线内容提供给其他人。这不应被视为伪装:内容完全相同,布局相同(在执行 BigPipe 的 javascript 之后)。唯一改变它的交付方式,使其对爬虫更友好。但谷歌会认为这是合法的吗?
第二种方法是使用另一个 Javascript 来解决这个问题。在第一个请求中,发送非 BigPipe 页面,其中包含一些将保存一些 cookie 的 Javascript。在后续请求中,仅在提供 cookie 时才发送 BigPipe 内容。非常第一个页面加载不会被优化,但另一个会。看起来是一个很好的解决方案,但我不太喜欢将 cookie 相乘。
第三种方式是流式传输 BigPipe 内容,而不是像 Facebook 那样使用 HTML 评论,而是使用
<noscript>
标签。这将使 pagelet 看起来像:<noscript id="pagelet_payload_foo">Some content to be indexed here</noscript> <script>onPageletArrive({id:'foo', [...]})</script>
而不是 Facebook 的方法:
<code id="pagelet_payload_foo"><!-- Some content to be indexed here --></code> <script>onPageletArrive({id:'foo', [...]})</script>
这看起来很棒,简单,爬虫友好和用户友好。但这对我来说似乎有点骇人听闻,并且在 IE 7/8 中不起作用,因为
noscript
标记的内容在 DOM 中被忽略了。这将涉及这些浏览器的一些肮脏的特殊情况。
然后,我更仔细地研究了 Facebook 所做的事情。似乎他们也在做同样的事情。页面在我的浏览器中进行了优化,但不在 Google 的缓存中。我试图清除所有浏览器缓存和 cookie,并再次请求该页面。无论如何,我一直通过 BigPipe 获取内容。他们没有使用任何基于 cookie 的技术。
那么,问题很简单:Facebook 是如何做到的?第一种方法会被视为伪装,还是因为它是 Facebook 而只对 Facebook 有效?还是我错过了其他东西?
谢谢。