ajax抓取网页内容(越来越+感叹号的解决方法放弃井号结构的url结构)
优采云 发布时间: 2021-12-21 01:09ajax抓取网页内容(越来越+感叹号的解决方法放弃井号结构的url结构)
越来越多的网站开始采用“单页应用”。
整个网站只有一个网页,使用ajax技术根据用户的输入加载不同的内容。
这种方式的优点是用户体验好,节省流量。缺点是ajax内容无法被搜索引擎抓取。例如,您有一个 网站。
http://www.51sjk.com/Upload/Articles/1/0/300/300557_20210728155542517.com
用户可以通过hash结构的url看到不同的内容。
http://www.51sjk.com/Upload/Articles/1/0/300/300557_20210728155542517.com#1 http://www.51sjk.com/Upload/Articles/1/0/300/300557_20210728155542517.com#2 http://www.51sjk.com/Upload/Articles/1/0/300/300557_20210728155542517.com#3
但是,搜索引擎只会抓取并忽略井号,因此它们无法索引内容。
为了解决这个问题,谷歌提出了“井号+感叹号”的结构。
http://www.51sjk.com/Upload/Articles/1/0/300/300557_20210728155542517.com#!1
当谷歌找到上述网址时,它会自动抓取另一个网址:
http://www.51sjk.com/Upload/Articles/1/0/300/300557_20210728155542517.com/?_escaped_fragment_=1
只要把ajax内容放到这个网址,google就会收录。但问题是“哈希+感叹号”非常丑陋和繁琐。Twitter曾经使用这种结构,它把
http://www.51sjk.com/Upload/Articles/1/0/300/300557_20210728155543049.jpg
改成
http://www.51sjk.com/Upload/Articles/1/0/300/300557_20210728155543064.jpg
结果,用户抱怨连连,只用了半年时间就废了。
那么,有没有什么办法可以让搜索引擎在保持更直观的URL的同时抓取ajax内容呢?
一直觉得没有办法,直到两天前看到话语创始人之一罗宾·沃德的解决方案,我才忍不住尖叫起来。
Discourse是一个严重依赖ajax的论坛程序,但它必须让google收录内容。它的解决方案是放弃hash结构,采用history api。
所谓history api,是指在不刷新页面的情况下,改变浏览器地址栏中显示的url(准确的说,就是改变网页的当前状态)。这是一个示例,您单击上面的按钮开始播放音乐。然后,点击下面的链接看看发生了什么?
地址栏的url变了,但音乐播放不中断!
history api的详细介绍超出了本文章的范围。简单来说,它的作用就是给浏览器的history对象添加一条记录。
window.history.pushstate(state object, title, url);
上面这行命令可以让地址栏中出现一个新的 URL。history对象的pushstate方法接受三个参数,new url为第三个参数,前两个参数可以为null。
window.history.pushstate(null, null, newurl);
目前主流浏览器都支持这种方式:chrome(26.0+)、firefox(20.0+)、ie(10.0+)、safari(5.1+),歌剧(12.1+)。
下面是robin ward的方法。
首先,将hash结构替换成history api,让每个hash符号变成一个正常路径的url,这样搜索引擎就会抓取每一个网页。
example.com/1 example.com/2 example.com/3
然后,定义一个javascript函数来处理ajax部分并根据URL抓取内容(假设使用jquery)。
function anchorclick(link) {
var linksplit = link.split('/').pop();
$.get('api/' + linksplit, function(data) {
$('#content').html(data);
});
}
然后定义鼠标的点击事件。
$('#container').on('click', 'a', function(e) {
window.history.pushstate(null, null, $(this).attr('href'));
anchorclick($(this).attr('href'));
e.preventdefault();
});
还要考虑用户点击浏览器的“前进/后退”按钮。这时候会触发history对象的popstate事件。
window.addeventlistener('popstate', function(e) {
anchorclick(location.pathname);
});
定义以上三段代码后,无需刷新页面即可显示正常路径url和ajax内容。
最后,设置服务器端。
因为没有使用 hashtag 结构,所以每个 URL 都是不同的请求。因此,服务器需要向所有这些请求返回具有以下结构的网页,以防止 404 错误。
... ...
如果你仔细看上面的代码,你会发现里面有一个 noscript 标签。这就是秘密。
我们将所有我们想要搜索引擎的内容放在了 noscript 标签中。在这种情况下,用户仍然可以在不刷新页面的情况下进行ajax操作,但是搜索引擎会收录每个页面的主要内容!