【发布时间】:2012-02-10 06:44:46
【问题描述】:
我对在显示网页时改善用户体验的Facebook's BigPipe 技术非常感兴趣。缺点是它严重基于 Javascript,而且对搜索引擎一点也不友好。
在我自己的网站上开发类似技术时,我将其设计为可以很容易地在服务器端禁用它以提供更多标准页面,而无需启用 BigPipe。现在,我正在寻找一种使其对爬虫友好的方法。
简单的方法是将非 BigPipe 内容提供给搜索引擎爬虫/机器人,并将流水线内容提供给其他人。这不应被视为伪装:内容完全相同,布局相同(在执行 BigPipe 的 javascript 之后)。唯一改变它的交付方式,使其对爬虫更友好。但 Google 会认为这是合法的吗?
第二种方法是使用另一个 Javascript 来解决这个问题。在第一个请求中,发送非 BigPipe 页面,其中包含一些将保存一些 cookie 的 Javascript。在后续请求中,仅在提供 cookie 时才发送 BigPipe 内容。非常第一个页面加载不会被优化,但另一个会。看起来是个不错的解决方案,但我不太喜欢将 cookie 相乘。
-
第三种方式是流式传输 BigPipe 内容,而不是像 Facebook 那样使用 HTML cmets,而是使用
<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>这看起来很棒,简单,爬虫友好和用户友好。但这对我来说似乎有点hackish,并且在 IE 7/8 中不起作用,因为
noscript标记的内容在 DOM 中被忽略了。这将涉及这些浏览器的一些肮脏的特殊情况。
然后,我更仔细地研究了 Facebook 的工作。似乎他们也在做同样的事情。页面在我的浏览器中进行了优化,但不在 Google 的缓存中。我试图清除所有浏览器缓存和 cookie,并再次请求该页面。无论如何,我一直通过 BigPipe 获取内容。他们没有使用任何基于 cookie 的技术。
那么,问题很简单:Facebook 是如何做到这一点的?第一种方法会被视为伪装,还是因为它是 Facebook 而只对 Facebook 有效?还是我错过了什么?
谢谢。
【问题讨论】:
-
我只是想问你一个问题:你是如何实现“我设计的它可以很容易地被禁用”的?
-
非常简单:当我不想启用 BigPipe 时,页面内容会内联呈现,而不是在页面生成结束时被延迟。我创建的模板标签只有两种不同的行为。
-
所以您只需执行类似
if ($enabled && !$not_closed_html) { echo "</div></div></div></body>"; echo bigPipe($html); } elseif ($enabled) { echo bigPipe($html) }的操作?
标签: javascript seo cloaking