前言
我们知道,sitemap可以用来通知搜索引擎的爬虫们当前网站上可抓取的网址,因此许多站长们会在网站底部提供一个sitemap.xml文件的访问网址。在SEO中以百度为例,推送给百度网站链接的方式有自动提交,手动提交等。许多站长会利用自动提交来实现,因为这样做比较方便快捷。但是对于一些非技术的站长来说,自动提交的改版操作会比较困难,而且自动提交跟手动提交两者结合也可以起到更好的效果。下面阿流就来讲解一下如何利用代码来将当前生成的sitemap文件里的网址提取出来,然后达成手动提交的目的。
代码讲解
因为这只是一个demo级的例子,而且是针对代码部落当前网站生成的sitemap格式,因此只能是作为一个参考,具体还需要你根据你当前xml数据格式来进行调整。利用的技术是Java的DOM(Document Object Model)解析,它具有如下特点:
优点:
1. 允许应用程序对数据和结构做出更改。
2. 访问是双向的,可以在任何时候再树中上、下导航获取、操作任意部分的数据。
缺点:
1. 解析XML文档的需要加载整个文档来构造层次结构,消耗内存资源大。
应用范围:
由于他的遍历能力,DOM解析器常应用于XML文档需要频繁改变的服务中。
Java使用步骤:
1. 创建一个DocumentBuilderFactory对象。
2. 创建一个DocumentBuilder对象。
3. 通过DocumentBuilder的parse方法加载XML到当前工程目录下。
4. 通过getElementsByTagName方法获取所有XML所有节点的集合。
5. 遍历所有节点。
6. 通过item方法获取某个节点的属性。
7. 通过getNodeName和getNodeValue方法获取属性名和属性值。
8. 通过getChildNodes方法获取子节点,并遍历所有子节点。
9. 通过getNodeName和getTextContent方法获取子节点名称和子节点值。
代码
代码部落当前sitemap.xml数据格式为:
http://daimabuluo.com
2018-09-14T14:24:10+00:00
daily
1.0
http://daimabuluo.com/software/scarce/201.html
2018-09-14T20:21:15+00:00
monthly
0.6
1
2
3
4
5
6
7
8
9
10
11
12
http://daimabuluo.com
2018-09-14T14:24:10+00:00
daily
1.0
http://daimabuluo.com/software/scarce/201.html
2018-09-14T20:21:15+00:00
monthly
0.6
解析代码如下:
Java
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public class DOMResolver {
public static void main(String[] args) {
//1.创建一个DocumentBuilderFactory对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
//2.创建一个DocumentBuilder对象
DocumentBuilder db = dbf.newDocumentBuilder();
//3.通过DocumentBuilder的parse方法加载books.xml到当前工程目录下
Document document = db.parse("sitemaps/sitemap.xml");
//4.获取所有book所有节点的集合
NodeList urlList = document.getElementsByTagName("url");
//通过NodeList的getLength()方法获取 urlList的长度
int urlCnt = urlList.getLength();
System.out.println("总的链接数:" + urlCnt);
int groupIndex = 0;
for (int i = 0; i < urlCnt; i++) {
//5.通过item方法获取一个book节点,bookList索引值从0开始
Node url = urlList.item(i);
NodeList childNodes = url.getChildNodes();
//11.遍历childNodes获取每隔节点的节点名和节点值
for (int k = 0; k < childNodes.getLength(); k++) {
//判断节点名,取出站点url的数据
String nodeName = childNodes.item(k).getTextContent().trim();
if ("loc".equals(childNodes.item(k).getNodeName()) && nodeName.endsWith("html")) {
String resUrl = nodeName;
//14.获取element类型节点的节点值
if (nodeName.startsWith("http://") && !nodeName.contains("www")) {
nodeName = nodeName.substring(7, nodeName.length());
resUrl = "http://www.";
resUrl = resUrl.concat(nodeName);
}
System.out.println(resUrl);
groupIndex++;
}
//因为百度一次只能提交20个链接,因此以20个链接为1组
if (groupIndex == 20) {
System.out.println("\n\n===================" + groupIndex + "============================\n");
groupIndex = 0;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
importorg.w3c.dom.Document;
importorg.w3c.dom.Node;
importorg.w3c.dom.NodeList;
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
publicclassDOMResolver{
publicstaticvoidmain(String[]args){
//1.创建一个DocumentBuilderFactory对象
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
try{
//2.创建一个DocumentBuilder对象
DocumentBuilderdb=dbf.newDocumentBuilder();
//3.通过DocumentBuilder的parse方法加载books.xml到当前工程目录下
Documentdocument=db.parse("sitemaps/sitemap.xml");
//4.获取所有book所有节点的集合
NodeListurlList=document.getElementsByTagName("url");
//通过NodeList的getLength()方法获取 urlList的长度
inturlCnt=urlList.getLength();
System.out.println("总的链接数:"+urlCnt);
intgroupIndex=0;
for(inti=0;i
//5.通过item方法获取一个book节点,bookList索引值从0开始
Nodeurl=urlList.item(i);
NodeListchildNodes=url.getChildNodes();
//11.遍历childNodes获取每隔节点的节点名和节点值
for(intk=0;k
//判断节点名,取出站点url的数据
StringnodeName=childNodes.item(k).getTextContent().trim();
if("loc".equals(childNodes.item(k).getNodeName())&&nodeName.endsWith("html")){
StringresUrl=nodeName;
//14.获取element类型节点的节点值
if(nodeName.startsWith("http://")&&!nodeName.contains("www")){
nodeName=nodeName.substring(7,nodeName.length());
resUrl="http://www.";
resUrl=resUrl.concat(nodeName);
}
System.out.println(resUrl);
groupIndex++;
}
//因为百度一次只能提交20个链接,因此以20个链接为1组
if(groupIndex==20){
System.out.println("\n\n==================="+groupIndex+"============================\n");
groupIndex=0;
}
}
}
}catch(Exceptione){
e.printStackTrace();
}
}
}