我认为您有问题,所以我将尝试解释这里发生的事情,包括背景和替代方案。因为这确实是我们大多数人不时偶然发现(或至少类似的东西)的一个非常重要的话题。
使用 AJAX 或更确切地说是异步增量页面更新(因为大多数页面实际上不使用 XML 而是 JSON),丰富了 Web 并提供了出色的用户体验。
然而,它也是有代价的。
主要问题是根本不支持 xmlhttpget 对象或 JavaScript 的客户端。
一开始,您必须提供向后兼容性。
这通常通过提供链接并捕获 onclick 事件并触发 AJAX 调用来完成,而不是重新加载页面(如果客户端支持它)。
今天几乎每个客户端都支持必要的功能。
所以今天的问题是搜索引擎。因为他们没有。好吧,这并不完全正确,因为他们部分这样做(尤其是谷歌),但出于其他目的。
谷歌评估某些 JavaScript 代码以防止 Blackhat SEO(例如,指向某处的链接,但 JavaScript 打开了一些完全不同的网页......或客户端不可见的 html 关键字代码,因为它们被 JavaScript 或相反的方式删除)。
但要保持简单,最好考虑一个非常基本的浏览器的搜索引擎爬虫,不支持 CSS 或 JS(CSS 也是如此,它的一方因特殊原因而被解析)。
因此,如果您的网站上有“AJAX 链接”,而 Webcrawler 不支持使用 JavaScript 跟踪它们,它们就不会被抓取。还是他们?
答案是 JavaScript 链接(比如 document.location 什么的)被跟踪。谷歌通常足够聪明,可以猜出目标。
但是没有进行ajax调用。很简单,因为它们返回部分内容,并且无法从中构造出有意义的整个页面,因为上下文是未知的,并且唯一的 URI 不代表内容的位置。
所以基本上有 3 种策略可以解决这个问题。
- 在链接上使用正常的 href 属性作为后备的 onclick 事件(imo 是最佳选择,因为它解决了客户和搜索引擎的问题)
- 通过您的站点地图提交内容网站,以便它们被编入索引,但与您的站点链接完全不同(通常页面会提供指向此 url 的永久链接,以便外部页面链接它们以获得 pagerank)
- ajax 爬取方案
这个想法是让您的 JavaScript xmlhttpget 请求与相应的 href 属性纠缠在一起,如下所示:
www.example.com/ajax.php#!key=value
所以链接看起来像:
<a href="http://www.example.com/ajax.php#!page=imprint" onclick="handleajax()">go to my imprint</a>
函数handleajax 可以评估document.location 变量以触发增量异步页面更新。它也可以传递一个 id 或 url 或其他任何东西。
然而,爬虫识别 ajax 爬取方案格式并自动获取 http://www.example.com/ajax.php.php?%23!page=imprint 而不是 http://www.example.com/ajax.php#!page=imprint
因此,您的查询字符串然后包含 html 片段,您可以从中判断哪些部分内容已被更新。
因此,您只需确保 http://www.example.com/ajax.php.php?%23!page=imprint 返回一个完整的网站,该网站在 xmlhttpget 更新完成后看起来就像用户应该看到的那样。
一个非常优雅的解决方案是将 a 对象本身传递给处理函数,然后该处理函数获取与爬虫使用 ajax 获取的相同 URL,但带有附加参数。然后,您的服务器端脚本将决定是交付整个页面还是仅交付部分内容。
这确实是一种非常有创意的方法,下面是我个人的公关分析:
专业人士:
- 部分更新的页面会收到一个唯一标识符,此时它们是语义网络中的完全合格资源
- 部分更新的网站会收到一个可由搜索引擎提供的唯一标识符
缺点:
- 它只是搜索引擎的后备解决方案,不适用于没有 JavaScript 的客户端
- 它为黑帽 SEO 提供了机会。因此,如果没有对内容进行适当的验证,Google 肯定不会完全采用该技术或将使用该技术的网页排名靠前。
结论:
只是带有后备遗留工作 href 属性的常用链接,但 onclick 处理程序是更好的方法,因为它们为旧浏览器提供功能。
-
ajax 抓取方案的主要优点是部分更新的网站获得唯一的 URI,您不必创建以某种方式作为可索引和可链接对应物的重复内容。
您可能会争辩说,ajax 抓取方案的实现更加一致且更易于实现。我认为这是您的应用程序设计的问题。