昨日微博上发了一条关于Google收录js以及Ajax,Flash内容的短信,有几位朋友颇感兴趣,于是在这里略微详细的做一些说明。
首先看这篇文章的前提是假设读者已经对搜索引擎的收录原理有所了解。一些基本的内容在我的书中已有比较详细的描述。
不妨这里我们简单回顾一下比较通用和常见的收录过程(其中部分细节已略去,保留一些比较关键的步骤。我们只看过程,不讨论特殊的行为及其是否合理):
- 提交你的网站,或你的网站被搜索引擎关注到(通过其他网站外链等方式)。
- 开始分析你的robots.txt文件(如果存在),确定哪些内容需要过滤,哪些内容可以直接关注。
- 默认情况下从默认首页(或指定网页)开始爬行,请求过程相当于从浏览器打开并获取第一个文本信息(成功为200),一般情况下不会刻意再去请求你的js和css等关联内容。
- 如果碰到302和301跳转,则对跳转后的页面执行第3步。当然一般对跳转次数都会有限制,特别是死循环(昨天发现Google的一些功能在中文状态下也有页面会出现这个情况)。不支持30x跳转的搜索引擎是很少的。
- 获取到内容后,对title,keywork,description,h1,nav等重要内容进行识别并收录,同时应对编码问题(此处略去一万字),然后将网页保存到搜索引擎上(假设没有违规和作弊的情况)。于此同时,爬行机器人会分析网页中的链接(一般为<a>标签中的href属性,当然<a>内容</a>中的“内容”也会被作为一个轻量级的关键字考量)。如果碰到40x及50x的网页,通常不会被正式收录,并跳过进行下一个。
- 对于分析到的链接,判断是否在本站范围内,如果是,回到第3条继续爬行。
言归正传。
对于Google是否真的能够收录js及ajax中的内容,是开始于Google推出的网页缩略图,无意间发现我的某个网站通过ajax获取到的信息居然被正常地显示在缩略图中(而且是通过json返回之后再处理的)。于是对此发生了兴趣。
于是做出了如下假设及实验(有部分试验从数月前已经开始,所有试验内容尚未结束,但已经可以得出一些初步的结论,可待进一步验证):
- 假设:Google可以爬行js中的内容(这是执行ajax的一个前提)。
试验:直接放了一段包含完整url的ajax过程上去(同时使用xmlhttp直接访问以及使用jQuery.get()两种方式),且此url在整个网站(网络)中只在此处出现。
结果:该url(对应的网页)被收录。
结论:1) Google爬行的内容除了中联及标签及<body>中的html,已经涉及到或者至少没有回避<script>标签中的js。2)通过这个试验无法确定Google是真的可以执行(或分析)js,还是只是使用正则等一系列手段强制获取js中的url。 - 假设:Google可以执行部分简单的js内容。
试验:将上述试验代码中的url拆分(比如将"http://www.senpar.com/Home.xhtml?id=123&add=1"拆分为"http://www.senpar.com/Home.xhtml?id=123“ + ”&add=1",甚至将结果封装,比如"http://www.senpar.com/Home.xhtml?id=123“+getAddParams()),这样不影响js中字符串的结果,但是会打破正则和一系列判断的规范,对于无法执行js的机器人,最多只能收录前半段字符串,或者连整个带加号的过程一起收录进去(注:如单独http://www.senpar.com/Home.xhtml?id=123
结果:查询收录情况并利用Google Webmaster跟踪后发现,Google认为http://www.senpar.com/Home.xhtml?id=123为404无法找到,并没有收录实际的url。
结论:1) Google机器人无法执行和解析真正的js内容,我们所看到的从js中抓录的页面,只是从简单的规则中提取出来,并试图访问。2)既然无法执行js,ajax访问几乎成为不可能。 3)缩略图中关于ajax载入的效果,可能由专门的线程负责,可执行js或调用ajax中的内容,相当于使用浏览器核心生成一个页面(这个在技术上也已经不是难题)。仔细观察发现,这个效果图的效果,还挺像Chrome中的效果(可以通过一系列hack方法测试)。 - 假设:Google对于Flash内容也可以收录。
试验:(这个试验很久之前就做了,只是这次加入了js的对照)分别放置2段Flash内容(分别包含一段唯一的文字,以及分别一个唯一链接),其中一段由js载入,另外一段使用<object>代码载入。
结果:2种方法载入的Flash均无法在Google缩略图中显示(显示成白色区域或替代成未安装Flash插件状态),但是Flash中的文本内容均被收录。
结论:1) 生成缩略图的浏览器核心(或故意)没有安装Flash插件。 2) 根据swf文件的url,Flash可以被单独抓录并分析。
推论:如果js引入Flash的方式,将swf文件地址拆分,可能也无法被收录。原理同2中的ajax地址。 - 假设:Google对Silverlight可以收录。
试验:放置一个Silverlight(通过object载入,此处先不对js判断),设置未安装Silverlight状态的特殊图片。
结果:缩略图显示了未安装Silverlight状态的图片。Silverlight中内容未被收录。
结论:1) 生成缩略图的浏览器核心没有安装Silverlight插件 2) Google爬行机器人无法识别Silverlight的xap压缩包(其实要实现解压并爬行其中的xmal文件不难,过程和爬行flash是类似的)。
目前完成的有这4个,还有一些有待确定的结果出现。欢迎大家补充。
从上面的结论中,我们也可以有一些小小的启发,比如: 当有些链接你希望被大量关注和收录,但是不想显示在页面中(或者很希望使用ajax异步载入)——也不想用display:none的方法引发作弊的风险抑或iframe这么尴尬的做法——你可以使用js,并保证url在一个完整的字符串中。反之,你可以很好规避某些url被收录的风险——当然你可也可以选择robots.txt的disallow等。另外如果你的来源以Google为主,那么对于简单的Flash导航之类的不用那么惧怕了,留个心眼就行了。
写此文旨在能够更准确地把握搜索机器人的一些较为隐秘的行为,帮助大家更好地实施SEO。如果本文有任何疏漏或错误,欢迎补充和指出:)
QQ:498977166
http://szw.cnblogs.com/
研究、探讨.NET开发
转载请注明出处和作者,谢谢!
Senparc官方教程《微信开发深度解析:微信公众号、小程序高效开发秘籍》,耗时2年精心打造的微信开发权威教程,点击这里,购买正版!