让你的Ajax应用被Google抓取

让你的Ajax应用被Google抓取

今天一大早看到消息说Google可以抓取Ajax应用的内容了,并且Google也给出了使你的Ajax站可被抓取要做的一些事情。如果你看得懂英文就跳过下面的翻译,直接访问:http://code.google.com/intl/zh-CN/web/ajaxcrawling/docs/getting-started.html

Google爬虫怎么爬我就不管了,要让你的Ajax站可被Google爬虫抓取,你需要做以下几个事情:

1,告诉爬虫你的站点支持Ajax内容的抓取

如果你的URL里有带“#”(所谓的锚点或URL hash),那么这个hash段必须以感叹号(“!”)开头。例如你的URL是这样的:

www.example.com/ajax.html#mystate
那么现在你要将它改成:
www.example.com/ajax.html#!mystate
这样,只要你的站点支持HTML快照,那么这样的URL就是可Ajax抓取的。

2,设置您的服务器来处理包含的_escaped_fragment_的URL请求

假设您想让www.example.com/index.html#!mystate被收录。那么你要给爬虫提供一份这个URL地址的HTML快照,使爬虫能够看到内容。服务器怎么知道什么时候返回HTML快照而不是常规的页面呢?答案是:爬虫在请求URL的时候,会将URL:www.example.com/ajax.html#!mystate临时改成www.example.com/ajax.html?_escaped_fragment_=mystate

你也许想知道为什么要这么做。有两个重要原因:

  • hash段不会作为http请求的一部分被发送到服务器。换句话说,爬虫要通过某种方式告诉你的服务器请求的是www.example.com/ajax.html#!mystate的内容而不是www.example.com/ajax.html
  • 另一方面,你的服务器要知道该返回的是HTML快照,而不是普通的页面。记住:所谓的HTML快照就是在JavaScript执行后所有显示在页面上的内容。最终服务器要返回给爬虫的是www.example.com/ajax.html#!mystate的内容

注意:在转换过程中,爬虫会将hash段中的某些字符编码。要检索原来的(hash)片段,你需要对所有的%XX 字符进行解码。(如,%26变成&,%20变成空格,%23变成#,%25变成%等等)

现在你有了原始地址并且知道爬虫需要请求什么内容了,你需要生成一份HTML快照。要怎么做呢?下面是几种方法:

  • 如果很大一部分内容都是通过JavaScript生成的,你可以使用无head浏览器如 HtmlUnit来得到HTML快照,或者你可以用其他的如crawljax和watij.com
  • 如果很多内容是通过服务器端技术(php或asp.net)生成的,你可以用现成的代码代替JavaScript生成静态页面
  • 现在的做法是创建一些离线的静态页面。例如,很多应用都是从数据库读取内容到浏览器渲染。其实你可以为每个Ajax URL创建单独的页面

最好是把各种HTML快照机制都尝试一遍。确保无head浏览器能正确的你的应用的内容是很重要的。当然你肯定想知道爬虫看到了什么,是么?你可以写一个小的测试程序来看输出的内容,或者你可以用工具来看,如: Fetch as Googlebot

注意:在测试的时候要使用_escaped_fragment_语法,因为这是Googlebot真正向服务器请求的地址。也就是说,使用www.example.com/ajax.html?_escaped_fragment_=mystate而不是www.example.com/ajax.html#!mystate

总结一下,你需要让服务器做下面的事情:

  • www.example.com/ajax.html?_escaped_fragment_=mystate的请求映射为www.example.com/ajax.html#!mystate
  • (hash)令牌是解码的。最简单的方法是使用标准的URL解码。在java程序中你可以这样写:
    mydecodedfragment = URLDecoder.decode(myencodedfragment, “UTF-8”);
  • 返回一个HTML快照,最好在页面上有页面的链接,_escaped_fragment_ URL对终端用户为不可用(记住:_escaped_fragment_ URL只对爬虫有用)。所有的请求都不要包含_escaped_fragment_,不然服务器会返回前面说的那些内容。

3,没有hash段的页面处理

有的页面是没有hash段的。比如你的首页是www.example.com而不是www.example.com#!home。对于这样的页面,我们有另一个处理方式。那就是在你页面HTML的head里加入
<meta name=”fragment” content=”!”>
如果你在www.example.com页面加入了<meta name=”fragment” content=”!”>,爬虫会临时地将页面映射为www.example.com?_escaped_fragment_= 并向服务器发出请求。服务器就相应的返回www.example.com的HTML快照。请注意,使用这个标签有一个重要的限制:唯一有效的内容是“!”,换句话说,这个meta标签只有这个格式:<meta name=”fragment” content=”!”>,表示一个无hash段的,通过Ajax获取内容的页面。

4,更新您的Sitemap加入新的Ajax URL地址

爬虫使用Sitemap来发现可抓取的内容。您的Sitemap包含了您要显示在搜索结果中的URL,通常是http://example.com/ajax.html#!foo=123,不要在你的Sitemap中包含http://example.com/ajax.html?_escaped_fragment_=foo=123 这样的地址。Googlebot 不会抓取包含_escaped_fragment_的页面。入口地址(没有包含hash段的地址,如:http://example.com/)的写法按正常写法,页面的处理参考第三点。

5,可选的,却很重要的,测试你的应用的可抓取性:用“Fetch as Googlebot”查看爬虫看到的内容

Google提供了一个可以查看爬虫看到的内容的工具:“Fetch as Googlebot”。你可以用这个工具来查看你的操作是否正确并确认Googlebot是否能抓取到你想让用户看到的内容。记得在测试的时候使用包含_escaped_fragment_的URL,因为这是Googlebot真正请求的地址。

Google ajax收录实战参考:http://coding.smashingmagazine.com/2011/09/27/searchable-dynamic-content-with-ajax-crawling/

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *