Java生成sitemap網站地圖
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
為什麽文檔很完善的情況下,我要寫這篇博客呢?(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網站地圖