1.什麼是sitemapgen4j
是一個用於在Java中生成XML網站地圖的庫,比如生成網站的sitemap,如果超出了 5 萬條需要寫入另外一個 sitemap 當中,這個功能 sitemapgen4j 已經替我們實現了,無需擔心。
sitemap
站點地圖是網站管理員向搜索引擎告知其網站上可用於抓取的頁面的一種簡單方法。 站點地圖最簡單的形式是一個 XML 檔案,其中列出了站點的 URL 以及有關每個 URL 的附加後設資料(上次更新時間、通常更改的頻率以及相對於站點中其他 URL 的重要性) )以便搜索引擎能夠更智慧地抓取網站。
網路爬蟲通常透過網站內的連結和其他網站發現頁面。 站點地圖補充了此資料,以允許支援站點地圖的爬網程式拾取站點地圖中的所有 URL,並使用關聯的後設資料瞭解這些 URL。 使用 Sitemap 協議並不能保證網頁被搜索引擎收錄,但可以為網路爬蟲提供提示,以更好地爬行您的網站。
Sitemap 0.90 根據 Attribution-ShareAlike Creative Commons License 的條款提供,並得到廣泛採用,包括 Google、Yahoo! 和 Microsoft 的支援。Sitemap 是網站管理員向搜索引擎通知其網站上可用頁面的一種簡單方法 用於爬行。 站點地圖最簡單的形式是一個 XML 檔案,其中列出了站點的 URL 以及有關每個 URL 的附加後設資料(上次更新時間、通常更改的頻率以及相對於站點中其他 URL 的重要性) )以便搜索引擎能夠更智慧地抓取網站。
2.程式碼工程
實驗目的:生成網站地圖
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springboot-demo</artifactId> <groupId>com.et</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>sitemap</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.github.dfabulich</groupId> <artifactId>sitemapgen4j</artifactId> <version>1.1.1</version> </dependency> </dependencies> </project>
application.yml
server: port: 8088
job
package com.et.sitemap.job; import com.redfin.sitemapgenerator.SitemapIndexGenerator; import com.redfin.sitemapgenerator.W3CDateFormat; import com.redfin.sitemapgenerator.WebSitemapGenerator; import com.redfin.sitemapgenerator.WebSitemapUrl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.io.File; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @author liuhaihua * @version 1.0 * @ClassName SiteMapJob * @Description todo * @date 2024年04月25日 17:44 */ @Component public class SiteMapJob { private Logger log = LoggerFactory.getLogger(getClass()); //@Scheduled(cron = "0 0 0 * * ?") @Scheduled(initialDelay = 1000,fixedRate = 10000) public void generateSitemap() { log.info("start generate sitemap"); String tempPath = "D://tmp/"; File file = new File(tempPath); if (!file.exists()) { file.mkdirs(); } String domain = "http://www.liuhaihua.cn"; try { WebSitemapGenerator g1 = WebSitemapGenerator.builder(domain, file) .fileNamePrefix("article").build(); Date date = new Date(); for (int i = 1; i < 160000; i++) { WebSitemapUrl url = new WebSitemapUrl.Options(domain + "/article/" + i).lastMod(date).build(); g1.addUrl(url); } WebSitemapGenerator g2 = WebSitemapGenerator.builder(domain, file) .fileNamePrefix("tag").build(); Date date2 = new Date(); for (int i = 1; i < 21; i++) { WebSitemapUrl url = new WebSitemapUrl.Options(domain + "/tag/" + i).lastMod(date2).build(); g2.addUrl(url); } WebSitemapGenerator g3 = WebSitemapGenerator.builder(domain, file) .fileNamePrefix("type").build(); Date date3 = new Date(); for (int i = 1; i < 21; i++) { WebSitemapUrl url = new WebSitemapUrl.Options(domain + "/type/" + i).lastMod(date3).build(); g3.addUrl(url); } List<String> fileNames = new ArrayList<>(); // 生成 sitemap 檔案 List<File> articleFiles = g1.write(); articleFiles.forEach(e -> fileNames.add(e.getName())); List<File> tagFiles = g2.write(); tagFiles.forEach(e -> fileNames.add(e.getName())); List<File> typeFiles = g3.write(); typeFiles.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(domain + "/" + e); } catch (MalformedURLException e1) { e1.printStackTrace(); } }); // 生成 sitemap_index 檔案 sitemapIndexGenerator.write(); log.info("end generate sitemap"); } catch (MalformedURLException e) { e.printStackTrace(); } } }
DemoApplication.java
package com.et.sitemap; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
以上只是一些關鍵程式碼,所有程式碼請參見下面程式碼倉庫
程式碼倉庫
https://github.com/Harries/springboot-demo
3.測試
啟動spring boot應用
檢視生成的檔案
4.參考引用
https://github.com/dfabulich/sitemapgen4j