长期以来站长们选择使用JavaScript来实现网页的动态行为这样做的原因是多种多样的如加快页面的响应速度降低网站流量隐藏链接或 者嵌入广告等由于早期的搜索引擎没有相应的处理能力导致在索引这类网页上往往出现问题可能无法收录有价值的资源也可能出现作弊
引入JavaScript解析的目的正是为了解决上述两方面的问题其结果也就是使搜索引擎可以更为清晰的了解用户实际打开该网页时看到的效果 比如有些网站会将用户评论评分等信息从网页HTML中抽离利用JavaScript甚至AJAX等方法在页面被打开的时候动态显示出来早期的搜索引 擎此时能处理到的页面内容就是缺失的由此会进一步影响对该页面索引价值的判断
要引入JavaScript解析需要考虑本身的设计与实现解析速度和对系统其它方面影响等因素本文通过一些典型的案例来分析如何设计并实现一套网页JavaScript解析系统并简要介绍这样的系统对于搜索引擎其它部分的作用和影响
一发现页面链接
一般来说页面链接都是以HTML中的A标签形式存在链接URL标记在href属性中但实际存在着一些网站会选择更为“动态”的方式较为常见的方式有两种一种是动态写入或调整A标签另一种是在用户点击的时候触发事件改变默认的链接打开方式
动态写入或调整链接标签
抽象的说网页要实现这样的效果乃至后文描述的其它效果与把大象放入冰箱极为类似分为三步找到要写入/修改的目标(找到大象)准备好要写入/修改的内容(打开冰箱门)执行写入/修改(把它放进去)
这三步操作映射到JavaScript上就是先后调用三组标准的浏览器功能函数页面元素定位数据准备以及页面修改那么JavaScript解析的工作就是同样提供出这样的函数随着被站长的JavaScript代码调用自然的发现相应的内容和行为
分析至此所需实现的函数也就基本确定了其中较为简单的包括
documentgetElementById // 定位
documentgetElementsByTagName // 定位
documentgetElementsByClassName // 定位
node[firstChild/nextSibling/previousSibling/parentNode] // 定位
document[createElement/createTextNode] // 创建链接
node[appendChild/insertBefore/innerHTML=?] // 写入内容
elementgetAttribute elementsetAttribute // 设置属性
elementhref =? // 设置属性
至于要写入的内容可能是以数组等形式保存在JavaScript种也可能是使用AJAX动态加载前者属于JavaScript语言的内置功能此处不再复述后者是一个单独的话题会在后文专门讨论
点击时触发事件改变默认的链接打开方式
页面这样做的原因不一有的是为了隐藏链接有的是为了实现弹出窗口有的则是为了程序拼接URL还有的是做检查看是否应该打开链接等等但所有这些原因都对应着同样的实现方法添加click事件
添加click事件的方法有三种
将A标签的href属性设置为“javascript:func(…)”的形式
设置A标签的onclick属性设置为onclick=”js_code” 的形式
调用事件绑定函数如my_link_nodeaddEventListener(click func false)
支持这三种方法本身是较为简单的需要注意的地方在于如何触发这样的click事件以及如何在触发之后截获目的URL
对于触发事件而言首先需要收集到所有可能的click事件而后再依次触发但对于每一个要触发的click而言实际触发之前必须先检查其是否还存在这是由于在其之前的click事件很可能已经把当前这个click删除掉了
要做到截获URL首先要实现相关的页面跳转函数既locationhref = ?windowopen等而后通过设置一系列标志将本次点击和页面跳转关连起来如此也就得到了目标URL
二动态页面内容
页面动态内容是一种提升页面加载速度增强网站技术灵活性的手段可以将那些会改变的内容(如评论评分等)抽离使页面分为静态和动态两部分静态内容可以使用缓存等方法加快页面显示速度降低网站流量动态内容则有格式简单好生成的优势同时也能节省流量
另一方面动态内容也是加载广告和内容作弊的重要方法最常见的就是写入iframe这对于早期搜索引擎而言有极大的隐蔽性
在技术层次上动态页面内容所需要的工作与上一节“动态写入或调整A标签”在很大程度上是相同的这里需要增加的是经典的“documentwrite”方法
该方法是最早的JavaScript功能之一用于向页面直接写入一段HTML代码至今仍在广泛使用对于该方法早期的搜索引擎都有所支持但 方法基本限于字符匹配仅能支持最直接的写入一个JavaScript字符串的方式对于稍微复杂的文本拼接显得无能为力但对于JavaScript解 析而言这段代码终究是要符合语言规范的因此就能做到完整支持处理文本拼接条件判断和混淆代码等各种情况
这里还需要讨论的一点是嵌套的documentwrite也就是通过documentwrite写入一个SCRIPT标签该标签内部是另一 段documentwrite这类问题在跳转作弊页面中屡见不鲜对其支持就不只需要JavaScript解析还需要HTML解析器能够支持处理嵌 套的HTML写入功能这里就不加以分析了
通过上述方法无论是网页的主体信息还是广告或其它辅助信息都会被暴露出来从而更好的理解站长意图
三网页跳转
网页跳转在有些情况下是达到页面效果的必要选择但同样会用于作弊在技术上多以下面两种方式出现
直接调用页面跳转函数
针对搜索引擎的UAreferer等调用页面跳转函数
这里要实现识别最核心的就是实现页面跳转函数location对象由于这是技术上唯一的JavaScript跳转函数所以无论页面的JavaScript如何撰写如何混淆最终都会调用该函数因此尽管不同页面的跳转代码看上去五花八门但识别出来却是简单的
四关于AJAX
AJAX是极为常见的网页技术根本上说就是在网页显示期间动态的从互联网上获取一段数据(可能是HTML也可能是其它)经过处理后加以显示
对于该技术根本的工作并不在于XMLHttpRequest对象的实现而是在于对搜索引擎爬虫架构的影响众所周知爬虫抓取页面遍历其链 接再依次抓取的形式设计的其工作主要集中在调度和控制抓取压力上抓取器本身较为简单通常不具备抓取后即时执行JavaScript并抓取AJAX 数据的能力因此需要技术升级方可支持AJAX
对抓取器的分析超出了本文的范围有兴趣的读者可以查看其它相关文献
总结
通过前面的案例分析我们总结出了实现JavaScript解析所需要的基本工作此外再增加一定的基础性建设就能构成一套较为完整的系统了这里我们再次整理一下将其分为三个部分
在HTML解析器中嵌入JavaScript语言引擎语言引擎可以选择VSpiderMonkey等成熟的开源方案
实现所需的功能函数具体可参考WC的相关HTML和DOM规范
作为一个直接推论需要收录所谓的js文件这是JavaScript解析所需要“解析”的源代码
本文中介绍的功能仅是一部分较为常见的JavaScript功能要让搜素引擎真正看到实际的页面还需要进一步实现其它需要的功能此外还需要配合对HTMLCSS图片等资源的支持
最后对于希望使用JavaScript的站长来说本文给出如下建议
不要使用过于复杂的JavaScript技术这不利于搜索引擎的收录
不要阻止对js文件的收录否则会限制JavaScript解析的能力
合理的划分站点的静态部分和动态部分
by Lileding