首页   >   代码编程   >   JAVA开发

java利用dom4j生成网站的sitemap.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");
    }

}

看一下效果:

java利用dom4j生成网站的sitemap.xml文件

QQ群Ⅰ: 686430774 (已满)

QQ群Ⅱ: 718410762 (已满)

QQ群Ⅲ: 638620451 (已满)

QQ群Ⅳ: 474195684

如果文章有帮到你,可以考虑请博主喝杯咖啡!

分享到:

欢迎分享本文,转载请注明出处!

作者:不忘初心

发布时间:2019-06-03

永久地址:https://www.jiweichengzhu.com/article/8b91f92180c041f991a03994327cec30

评论