我对Facebook's BigPipe技术很有兴趣,该技术可改善显示网页时的用户体验。不利之处在于,这很大程度上是基于Javascript的,完全不友好于搜索引擎。

在我自己的网站上开发类似技术时,我对其进行了设计,以便可以在不启用BigPipe的情况下很容易地在服务器端将其禁用以提供更多标准页面。现在,我正在寻找一种使它对爬虫友好的方法。

  • 最简单的方法是将非BigPipe内容提供给搜索引擎抓取工具/漫游器,然后将管道内容提供给其余内容。这不应被视为伪装:内容完全相同,布局相同(在执行BigPipe的javascript之后)。唯一改变它的交付方式,使其对爬虫更友好的东西。但是Google会认为这是合法的吗?
  • 第二种方法是使用另一个Javascript解决此问题。在第一个请求上,发送非BigPipe页面,其中包含一些Javascript,它将保存一些cookie。在后续请求中,仅在显示cookie时发送BigPipe内容。拳头页面加载不会被优化,但其他会优化。看起来是一个很好的解决方案,但我真的不喜欢乘以cookie。
  • 第三种方法是不像Facebook那样使用HTML注释来流BigPipe内容,而是使用<noscript>标签。这会使小页面看起来像:
    <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中不起作用,因为DOM中忽略了noscript标记的内容。对于这些浏览器,这将涉及一些肮脏的特殊情况。

  • 然后,我更加仔细地研究了Facebook的功能。好像他们在做同样的事情。页面在我的浏览器中进行了优化,但不在Google的缓存中。我试图清除所有浏览器缓存和cookie,然后再次请求该页面。无论如何,我一直通过BigPipe获取内容。他们没有使用任何基于cookie的技术。

    然后,问题很简单:Facebook如何做到这一点?第一种方法会被视为伪装吗,还是因为它是Facebook而仅对Facebook有效?还是我想念其他东西?

    谢谢。

    最佳答案

    简单的答案是,Facebook区分搜索机器人并为其提供不同的内容。可以通过用户代理(正如我想您所暗示的那样),也可以通过查找IP地址以查看其是否与Google地址范围相匹配。

    全静态版本是我的首选,因为它还允许您优化速度,这是Google(可能还有其他)在索引中包含的内容。

    07-24 09:15