java中实现 sitemap.xml实现思路

来源:互联网 发布:手机淘宝怎么领积分 编辑:程序博客网 时间:2024/04/19 14:04

在网站运营尤其是SEO过程中,SiteMap的作用是不容忽视的。先来看一下SiteMap的协议及规范。

Google SiteMap Protocol是Google推出的一种站点地图协议,此协议文件在早期的Robots.txt文件协议基础上升级而成。在Google网站管理员工具中指出“加入了Google SiteMap文件的网站将更有利于Google网页爬行机器人的爬行索引,这样将提高索引网站内容的效率和准确度”。SiteMap文件协议应用了简单的XML格式,一共用到6个标签,其中关键标签包括链接地址、更新时间、更新频率和索引优先权。
Google SiteMap文件生成后格式如下:
<urlset xmlns=”http://www.google.com/schemas/sitemap/0.84″;>
<url>
<loc>http://ecvip.org<;/loc>
<lastmod>2005-06-03</lastmod>
<changefreq>always</changefreq>
<priority>1.0</priority>
</url>
</urlset>
以上六个标签的作用分别为:
changefreq:页面内容更新频率:分always、hourly、daily、weekly、monthly、yearly几种;
lastmod:页面最后修改时间:Googlebot会判断下次是否会再次索引;
loc:页面永久链接地址:具体的链接地址;
priority:相对于其他页面的优先权:在0.0—1.0之间;
url:相对于前4个标签的父标签:Webmaster希望展示在SiteMap文件中的每一个链接都要用和包含;
urlset:相对于前5个标签的父标签:定义此xml文件的命名空间,相当于网页文件中的标签一样的作用。
由于本人近段时间带领一批人在完成大型电子商务网站项目,而该项目是由J2EE架构完成,于是就考虑到是否可以让Java代码自助每天生成电子商务网站的Sitemap文件。按照这种想法,于是就开始构思,摆在我面前一下出现三个问题:1,获取网站所有链接。 2,生成XML文件 3,定时调用
后两种问题如果做过Java程序的人,应该比较好解决。而如何获取网站所有链接,好像以前没有做过这一块,而这种思路应该跟现在的爬虫技术有点想像,于是在网上找到nutch框架。这个框架其实以前就听说过,还比较有名。于是发现网络上有朋友研究他其中源代码,其中有一篇文章对第一个问题可以明显解决。于是所有代码架构选定,由httpclient+nekohtml+jdom+spring构成。在这里截取部分获取网站链接代码
private static void getText(StringBuffer sb, Node node) {
if (node.getNodeType() == Node.TEXT_NODE) {
sb.append(node.getNodeValue());//取得结点值,即开始与结束标签之间的信息
}
NodeList children = node.getChildNodes();
if (children != null) {
int len = children.getLength();
for (int i = 0; i <>
getText(sb, children.item(0));//递归遍历DOM树
}
}
}
private void getOutlinks(URL base, Map outlinks, Node node, int level) {
if (node.getNodeType() == Node.ELEMENT_NODE) {
if (“a”.equalsIgnoreCase(node.getNodeName())) {
StringBuffer linkText = new StringBuffer();
getText(linkText, node);
NamedNodeMap attrs = node.getAttributes();
String target = null;
for (int i = 0; i <>
if (“href”.equalsIgnoreCase(attrs.item(0).getNodeName())) {
target = attrs.item(0).getNodeValue();//在DOM树中,属性是一个结点。
break;
}
}
if (target != null)
try {
URL url = new URL(base, target);
if (StringUtil.contains(url.toString(), siteUrl)) {
String urlLink=urlParamDecoder(url.toString());
if (level == 1) {
outlinks.put(url.toString(), new OutLink(urlLink,
new Date(), “daily”, “0.9″, linkText.toString().trim(), level));
} else {
outlinks.put(url.toString(), new OutLink(urlLink,
new Date(), “daily”, “0.8″, linkText.toString().trim(), level));
}
}
} catch (MalformedURLException e) {
logger.error(e);
}
}
}
NodeList children = node.getChildNodes();
if (children != null) {
int len = children.getLength();
for (int i = 0; i <>
getOutlinks(base, outlinks, children.item(i), level);//递归遍历DOM树
}
}
}
private Map getHttpNode(String url, int level) {
//初始化
Map siteMap = new HashMap();
if (StringUtil.containsNone(url, siteUrl)) {
return siteMap;
}
HttpClient client = new HttpClient();
//创建文件片段对象
DocumentFragment node = new HTMLDocumentImpl().createDocumentFragment();
url = urlParamEncoder(url);
if (proxyHost != null) {
client.getHostConfiguration().setProxy(proxyHost, proxyPort);
}
client.getHttpConnectionManager().getParams().setConnectionTimeout(connectionTimeout);
client.getHttpConnectionManager().getParams().setSoTimeout(soTimeout);
GetMethod method = new GetMethod(url);
method.addRequestHeader(“Content-Type”, “text/html; charset=utf-8″);
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler());
try {
int statusCode = client.executeMethod(method);
if (statusCode != HttpStatus.SC_OK) {
throw new HttpException(“HttpStatusCode : ” + statusCode);
}
InputStream inputStream = method.getResponseBodyAsStream();
parser.setProperty(“http://cyberneko.org/html/properties/default-encoding”, “UTF-8″);
parser.setFeature(
“http://cyberneko.org/html/features/scanner/script/strip-comment-delims“, true);
parser.parse(new InputSource(inputStream), node);
getOutlinks(new URL(url), siteMap, node, level);
} catch (SAXException se) {
logger.error(se);
} catch (HttpException he) {
logger.error(he);
} catch (IOException ie) {
logger.error(ie);
} catch (Exception e) {
logger.error(e);
} finally {
// 释放连接
method.releaseConnection();
}
//返回结果
return siteMap;
}
其中在编写代码过程中,需要解决的问题有,网站如果有中文参数时,由于httpclient会报url参数错误,因此需要利用URLEncoder.encode加处理。同时利用jdom在生成xml文件时,由于jdom生成带有命名空间xml时,要把所有元素都带上命名空间参数。
最后就是将生成xml文件放在网站根目录下建立一个目录叫sitemapxml。然后向几大知名的搜索引擎提交Sitemap文件啦。
  • Google

    向Google提交网站地图Sitemap: 通过下面的网址管理提交;
    http://www.google.com/webmasters/tools/
    使用Google账号登陆后,验证您的网站,然后就可以再“sitemap”页面提交了
    需要提交的您网站的sitemap地址为
    http://$url/sitemapxml/sitemap.xml
  • 雅虎中国

    向雅虎中国提交网站地图Sitemap,通过下面的网址管理提交
    http://sitemap.cn.yahoo.com/mysites
  • 向MSN提交网站地图Sitemap,用URL直接提交:

    http://api.moreover.com/ping?u=http%3A//$url/sitemapxml/sitemap.xml
  • 向ASK提交网站地图Sitemap,直接提交

    http://submissions.ask.com/ping?sitemap=http%3A//$url/sitemapxml/sitemap.xml
  • 向百度Baidu提交网站地图Sitemap,没办法,现在百度不支持Sitemap。

    但可通过http://www.baidu.com/search/url_submit.html%E6%9D%A5%E6%8F%90%E4%BA%A4%E4%BD%A0%E7%9A%84%E7%BD%91%E5%9D%80。
    百度会自行搜索,通过robots.txt爬行你的sitemap,更新速度很快。
    在你的网站robots.txt文件中添加:
    sitemap:http://$url/sitemapxml/sitemap.xml
    http://$url/sitemap/index.html
    (如果没有robots.txt文件,请在网站根目录下添加robots.txt文件)
    当然最后,如果你利用XSLT可以结合xml文件,生成html形式的网站地图。
  • 0 0