您现在的位置是:网站首页 > 代码编程 > JAVA开发JAVA开发
【原】java利用dom4j生成网站的sitemap.xml文件
不忘初心 2019-06-03 围观() 评论() 点赞() 【JAVA开发】
简介:如何让搜索引擎来抓取自己的网站,这个有很多种方式,可以主动推送,可以自动推送,也可以利用sitemap文件来诱导蜘蛛,sitemap文件又分为好几种后缀的写法,最简单的就是txt格式,直接一行行的url放在上面就行了,而高级一点儿的可以使用xml格式(推荐使用这种)。
如何让搜索引擎来抓取自己的网站,这个有很多种方式,可以主动推送,可以自动推送,也可以利用sitemap文件来诱导蜘蛛,sitemap文件又分为好几种后缀的写法,最简单的就是txt格式,直接一行行的url放在上面就行了,而高级一点儿的可以使用xml格式(推荐使用这种)。
百度官方推荐的格式如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- XML文件需以utf-8编码-->
<urlset>
<!--必填标签-->
<url>
<!--必填标签,这是具体某一个链接的定义入口,每一条数据都要用<url>和</url>包含在里面,这是必须的 -->
<loc>http://www.yoursite.com/yoursite.html</loc>
<!--必填,URL链接地址,长度不得超过256字节-->
<lastmod>2009-12-14</lastmod>
<!--可以不提交该标签,用来指定该链接的最后更新时间-->
<changefreq>daily</changefreq>
<!--可以不提交该标签,用这个标签告诉此链接可能会出现的更新频率 -->
<priority>0.8</priority>
<!--可以不提交该标签,用来指定此链接相对于其他链接的优先权比值,此值定于0.0-1.0之间-->
</url>
<url>
<loc>http://www.yoursite.com/yoursite2.html</loc>
<lastmod>2010-05-01</lastmod>
<changefreq>daily</changefreq>
<priority>0.8</priority>
</url>
</urlset>
作为一个懂java开发的站长来说,可以利用dom4j来定时生成sitemap.xml文件,以方便蜘蛛来抓取,直接分享一下我的代码:
package com.wolffy.jwcz.task;
import com.wolffy.core.common.Constants;
import com.wolffy.core.enums.Common;
import com.wolffy.jwcz.entity.Article;
import com.wolffy.jwcz.enums.ArticleStatus;
import com.wolffy.jwcz.query.ArticleQuery;
import com.wolffy.jwcz.service.ArticleService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
* 定时生成sitemap.xml文件,在每天发布新的文章之后,就重新生成xml文件
* Created by SongFei on 2019/5/1.
*/
@Slf4j
@Component
public class SitemapTask {
@Autowired
private ArticleService articleService;
/**
* 生成sitemap配置,方便搜索引擎抓取
*/
@Scheduled(cron = "0 35 22 * * ?")
// @Scheduled(cron = "0 0/1 * * * ?")
public void execute() {
log.info("定时任务{}开始执行", "SitemapTask");
try {
String path = getClass().getClassLoader().getResource("/").toString();
// log.info("生成sitemap文件的目录: {}", path);
// 目录格式:file:/Users/felix/workspace2/jiweichengzhu/jwcz.v2.0/target/jwcz/WEB-INF/classes/,所以需要从5开始截取
String realpath = path.substring(5, path.indexOf("WEB-INF"));
// 这里统一设置为当前时间,诱导蜘蛛过来抓取
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String lastModify = sdf.format(new Date());
// 文档流
Document document = DocumentHelper.createDocument();
// 根节点
// Element root = document.addElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9");
// root.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
// root.addAttribute("xsi:schemaLocation", "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd");
// 按照百度官方的文档,好像不用写这么麻烦
Element root = document.addElement("urlset");
// 首页
Element indexElement = root.addElement("url");
indexElement.addElement("loc").addText(Constants.DOMAIN);
indexElement.addElement("lastmod").addText(lastModify);
indexElement.addElement("changefreq").addText("always");
indexElement.addElement("priority").addText("1.0");
// 文章页,暂时1000条,如果真的达到了1000篇原创的时候,估计网站早就起飞了
ArticleQuery query = new ArticleQuery(Constants.DEFAULT_PAGE_NUMBER, 1000);
query.setStatus(ArticleStatus.RELEASED.getCode());
query.setHidden(Common.NO.getCode());
query.setSidx("release_time");
query.setSord("desc");
List<Article> articles = articleService.getIndexAndListFirstPageArticles(query);
for (Article article : articles) {
Element articleElement = root.addElement("url");
articleElement.addElement("loc").addText(Constants.DOMAIN + "/article/" + article.getUid());
articleElement.addElement("lastmod").addText(lastModify);
articleElement.addElement("changefreq").addText("daily");
articleElement.addElement("priority").addText("0.8");
}
// dom4j文件输出流
OutputFormat format = new OutputFormat();
// 文件编码
format.setEncoding("UTF-8");
// 设置换行
format.setNewlines(true);
// 生成缩进
format.setIndent(true);
// 使用4个空格进行缩进, 可以兼容文本编辑器
format.setIndent(" ");
// 初始化file文件
File file = new File(realpath.replaceAll("%20", " ") + "sitemap.xml");
// 创建文件缓冲区
FileWriter fileWriter = new FileWriter(file);
// 准备写入xml文件
XMLWriter xmlWriter = new XMLWriter(fileWriter, format);
// 写入文件
xmlWriter.write(document);
// 关闭IO流
fileWriter.close();
xmlWriter.close();
} catch (IOException e) {
log.error("Sitemap生成失败:{}", ExceptionUtils.getStackTrace(e));
}
log.info("定时任务{}执行完毕", "SitemapTask");
}
}
看一下效果:
看完文章,有任何疑问,请加入群聊一起交流!!!
很赞哦! ()
相关文章
标签云
猜你喜欢
- IntelliJ IDEA 2019.2已经可以利用补丁永久破解激活了
- IntelliJ IDEA 2019.3利用补丁永久破解激活教程
- IntelliJ IDEA高版本最灵活的永久破解激活方法(含插件激活,时长你说了算)
- Jetbrains全家桶基于ja-netfilter的最新破解激活详细图文教程
- IntelliJ IDEA 2022.1永久破解激活教程(亲测可用,持续更新)
- 分享几个正版 IntelliJ IDEA 激活码(破解码、注册码),亲测可用,持续更新
- ja-netfilter到底需不需要mymap,2021.3.2版本激活失效?
- 如何激活idea2022.1及以上版本中的插件(亲测可用)
- 【史上最全】IntelliJ IDEA最新2022.1版本安装和激活视频教学(含插件)
- IntelliJ IDEA 2022.2 版本最新2099年永久激活方法,亲测可用,也可以开启新UI了。
站点信息
- 网站程序:spring + freemarker
- 主题模板:《今夕何夕》
- 文章统计:篇文章
- 标签管理:标签云
- 微信公众号:扫描二维码,关注我们