作者PsMonkey (痞子军团团长)
看板Ajax
标题[翻译] 「让 AJAX 网页可以被网路爬虫读取」建议书
时间Mon Oct 12 23:58:00 2009
中文翻译来源:
http://pt2club.blogspot.com/2009/10/ajax.html
================
原文网址:
http://googlewebmastercentral.blogspot.com/
2009/10/proposal-for-making-ajax-crawlable.html
今天,我们很兴奋地提出「让以 AJAX 为基础的网站可以被网路爬虫读取」
的规格建议书。这将有益於网站管理者和使用者在制作丰富、互动的 AJAX 网站时,
可以让所有的搜寻引擎读取到想要被搜寻到的部份。
我们相信,这类的内容如果可以被网路爬虫读取以及被索引,将会让网路有长足的进步。
当 AJAX 网站受到使用者欢迎的同时,搜寻引擎并无法读取这些网站的内容。
我们的最新调查显示:有 70% 的网站在 form 或是其他地方使用了 JavaScript。
当然,大部分的 JavaScript 并不是 AJAX,
但是如果搜寻引擎可以处理、索引 AJAX 的内容,
开发者就可以在他们的网站上做出更多丰富的内容,而搜寻引擎依然找得到。
下面是这份建议书希望达到的目标:
→当网站成长时,所需要的变动是最小的
→使用者跟搜寻引擎看到的是相同的内容(无须 cloaking)
→搜寻引擎可以直接让使用者导向到 AJAX 的 URL
(而不一个静态复制网页)
→网站拥有者有方法可以验证他们的 AJAX 网站显示正常,
也因此网路爬虫可以读取所有的内容。
下面是我们初步建议书当中,搜寻引擎处理、索引 AJAX 内容的方式:
→把 stateful 的 AJAX 页面的 URL fragment 稍作修改:
无论何时,直接读取 stateful 的 AJAX 页面都会显示一样内容。
这些页面可以变成搜寻结果。我们想把像这样的 URL
「
http://example.com/page?query#state」 加上一个 token 成这样
「
http://example.com/page?query#[FRAGMENTTOKEN]state」以作识别。
在检视网路上的 URL 之後,我们建议使用惊叹号「!」。
在搜寻结果当中显示的 URL 会像这样
「
http://example.com/page?query#!state」。
→使用 headless 浏览器,让你的 web server 有一个 HTML 的 snapshot。
headless 浏览器用来读取 AJAX 页面,然後最终浏览器的结果产生 HTML。
只有特别标记的 URL 才传给 headless 浏览器处理。
在 server 端作这件事情时,网站拥有者可以控制 HTML 的产生,
也就可以轻松地验证所有的 JavaScript 是否正常执行。
HtmlUnit —open source、没有 GUI 的 Java 程式—
就是一个 headless 浏览器的例子。
→允许搜寻引擎的爬虫去读取有对 state 作 escape 的 URL
URL fragment 并不会随着 request 送到 server 去,
所以需要稍微变更 URL 以读取该页面。同时,
这也会让 server 启用 headless 浏览器去产生 HTML
而不是传回有 JavaScript 的页面。
此外,既有的 URL—使用者看到的那些—则会用平常的方式处理,
不会启用 headless 浏览器。我们建议 escape state 资讯,
然後把它加到 query parameter 当中,变成一个 token。
用上头的例子,URL 可能会长这样:
「
http://example.com/page?query&[QUERYTOKEN]=state」。
依照我们对现在网路上 URL 的分析结果,
我们建议用「_escaped_fragment_」来作为 token。
建议的 URL 会变成:
「
http://example.com/page?query&_escaped_fragment_=state」
→在搜寻结果当中,显示原来的 URL
为了改善使用者经验,这会让使用者直接连回 AJAX 页面。
搜寻结果当中显示原始的 URL
(如前面的例子:
http://example.com/page?query#!state)就可以做到。
搜寻引擎可以检查被 Googlebot 索引的文字,
是否跟使用者看到的一样(或是子集)。
总结来说,如果一个 stateful 的 URL,
例如:「
http://example.com/dictionary.html#AJAX」,
同时给使用者或网路爬虫使用的 URL 会变成
「
http://example.com/dictionary.html#!AJAX」,
而可以被爬虫爬的 URL 会变成
「
http://example.com/dictionary.html?_escaped_fragment_=AJAX」,
但使用者存取还是用「
http://example.com/dictionary.html#!AJAX」
--
侃侃长论鲜窒碍 首页:
http://www.psmonkey.idv.tw
众目睽睽无心颤 Blog:
http://ps-think.blogspot.com
茕居少聊常人事
杀头容易告白难 欢迎参观 Java 版(@ptt.cc) \囧/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.20.165.96
1F:推 SMUGEN:糟糕 需要这个东西但这篇却看不太懂 只好先给推~~~ 10/13 00:18
2F:推 tomin:看不懂 是同一页要能处理三类URLs 且输出都要相同? 10/13 00:29
3F:→ TonyQ:简单来说 , 原本的ajax 操作时要加锚点标示目前状态. 10/13 07:58
4F:→ TonyQ:这是identify , 用来识别当前页面的究竟是哪一页 , 10/13 07:58
5F:→ TonyQ:其次是要有可以只用这个锚点资讯 , 就产出完整html的page 10/13 07:59
6F:→ TonyQ:简单来讲只是变成两道工 , 跟之前摆a / 里面放可连至完整页 10/13 07:59
7F:→ TonyQ:但是onclick return false 做 ajax处理的方案有异曲同工之妙 10/13 08:00
8F:推 tomin:唔 就是要做成picasa web那样? #xxxx可以连到某照片? 10/13 08:02
9F:→ adxis:会让人觉得controller又得做在server端了? 10/13 16:47
10F:推 Peruheru:example.com的网站,用火狐连都会显示很好笑的结果XDD 10/20 19:33