1. 程式人生 > >Java生成sitemap網站地圖

Java生成sitemap網站地圖

列表 日期 names ons nginx 配置 project 發現 2.x XML

sitemap 是什麽?對應沒有接觸過網站 SEO 的同學可能不知道,這裏引用一下百度站長的一段解釋。

Sitemap(即站點地圖)就是您網站上各網頁的列表。創建並提交Sitemap有助於百度發現並了解您網站上的所有網頁。您還可以使用Sitemap提供有關您網站的其他信息,如上次更新日期、Sitemap文件的更新頻率等,供百度Spider參考

簡單來說,sitemap 就是搜索引擎爬蟲便於爬取到網站內的所有網頁。

SEO之初

之前特意通過 site 指令查詢過公司同行業網站的收錄情況,發現搜索引擎對於我司的網站收錄數量真的不是差了一星半點-.-,原因嘛,就是一直沒有專門的人做 SEO 優化工作。

前幾個月我倒是生成了網站的一部分 sitemap 提交到神馬搜索站長平臺,但是明明是按照官方文檔格式生成的,卻一直提示格式不對,也不知道什麽情況,也沒有官方反饋渠道,就不了了之了。最近公司新招了 SEO 專員,於是便有了定時生成 sitemap 文件的需求。這種生成的文件一般都是對外直接可以訪問的,可以通過 nginx 配置靜態資源文件來完成。

需求探討

sitemap 的格式一般是 XML 格式的,第一反應就是可以使用 DOM4J 來完成,但是做 SEO 的同事說了,因為 sitemap 文件的限制,同一個 sitemap 文件最多有 5 萬條 URL,超出 5 萬條,就應該放入到下一個 sitemap 文件當中去。通過 DOM4J 來做的話,還需要判斷條數感覺有點麻煩(懶),就上 gayhub 搜了一下相關的輪子 generate sitemap,找到了現成的輪子 sitemapgen4j

,項目的 README 中使用方法寫的比較完善,這裏不再多說。

為什麽文檔很完善的情況下,我要寫這篇博客呢?(10月第一篇,湊數的(逃~)

上文提到了,如果超出了 5 萬條需要寫入另外一個 sitemap 當中,這個功能 sitemapgen4j 已經替我們實現了,無需擔心。如果超出,生成的文件就像是這樣的:

- article1.xml
- article2.xml
- article3.xml
- article4.xml

這樣的話,在站長平臺這裏,如果新增了文件就要新增一條sitemap 網址記錄,很麻煩。

技術分享圖片

好在,搜索引擎考慮到了這種問題,有相應的解決方法。

技術分享圖片

我們把每次生成的 sitemap 文件的地址,添加到一個 sitemap 索引文件當中去,這樣,我們只需要向平臺提交一個 sitemap 索引文件的地址即可。

不多說,代碼見。

生成 sitemap 文件

首先引入 sitemapgen4j 依賴

<dependency>
    <groupId>com.github.dfabulich</groupId>
    <artifactId>sitemapgen4j</artifactId>
    <version>1.1.1</version>
</dependency>

編寫生成 sitemap 代碼

public void generateSitemap() {
    String tempPath = "/home/seo";
    //String tempPath = System.getProperty("java.io.tmpdir") + File.separator + "/seo/";
    File file = new File(tempPath);
    if (!file.exists()) {
        file.mkdirs();
    }
    String domain = "https://www.domain.com";
    try {
        WebSitemapGenerator g1 = WebSitemapGenerator.builder(domain, file)
                .fileNamePrefix("article").build();
        Date date = new Date();
        for (int i = 1; i < 21; i++) {
            WebSitemapUrl url = new WebSitemapUrl.Options(domain + "/article/" + i ).lastMod(date).build();
            g1.addUrl(url);
        }

        WebSitemapGenerator g2 = WebSitemapGenerator.builder(domain, file)
                .fileNamePrefix("issue").build();
        Date date2 = new Date();
        for (int i = 1; i < 21; i++) {
            WebSitemapUrl url = new WebSitemapUrl.Options(domain + "/issue/" + i ).lastMod(date2).build();
            g2.addUrl(url);
        }

        List<String> fileNames = new ArrayList<>();

        // 生成 sitemap 文件
        List<File> articleFiles = g1.write();
        articleFiles.forEach(e -> fileNames.add(e.getName()));
        List<File> issueFiles = g2.write();
        issueFiles.forEach(e -> fileNames.add(e.getName()));

        // 構造 sitemap_index 生成器
        W3CDateFormat dateFormat = new W3CDateFormat(W3CDateFormat.Pattern.DAY);
        SitemapIndexGenerator sitemapIndexGenerator = new SitemapIndexGenerator
                .Options(domain, new File(tempPath + "sitemap_index.xml"))
                .dateFormat(dateFormat)
                .autoValidate(true)
                .build();

        fileNames.forEach(e -> {
            try {
                // 組裝 sitemap 文件 URL 地址
                sitemapIndexGenerator.addUrl(tempPath + e);
            } catch (MalformedURLException e1) {
                e1.printStackTrace();
            }
        });

        // 生成 sitemap_index 文件
        sitemapIndexGenerator.write();

    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
}

通過 Nginx 提供給外部訪問

文件已經生成了,就需要對外提供訪問了,這裏使用 nginx 來實現,如果用 apache 也是可以的。

上文生成的文件我放在了 /home/seo 目錄下,文件有

- seo
    - article1.xml
    - article2.xml
    - article3.xml
    - article4.xml
    - sitemap_index.xml

現在修改 nginx 配置文件,這裏說明一下,因為 sitemap 生成一份就可以了,但是要通過域名能直接訪問到,所以需要在 nginx 跳轉一下到有 sitemap 文件的服務器。

存放 sitemap 文件的 nginx 配置如下

server {
    listen          8888;
    server_name     111.112.113.114;
    charset utf8;

    access_log logs/access.log  main;

    location / {
        alias /home/seo/;
        sendfile on;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
    }
}

根域名的 nginx 配置文件

server {
    listen          80;
    server_name     www.domain.com;
    charset utf8;

    access_log logs/access.log  main;

    location /seo/ {
        proxy_pass http://111.112.113.114:8888;
    }
    
    location / {
        proxy_pass http://homeServer;
    }
}

註意: 第一個 location塊 中的 proxy_pass 行尾有個 /

www.domain.com/seo/sitemap_index.xml
就會在 www.domain.com 這裏直接反代到 111.112.113.114 這臺服務器上了。

站長平臺只用提交這一個 URL www.domain.com/seo/sitemap_index.xml 即可。

有疑問?

歡迎來信,給我寫信

Java生成sitemap網站地圖