`
berdy
  • 浏览: 513754 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用sitemapgen4j结合htmlParser生成网站的sitemap.xml

阅读更多
今天尝试写了小段代码来给别人的网站生成sitemap.xml文件。
在google code中找到sitemapgen4j 开源组件,专门针对生成对应google search engine 的sitemap.xml文件。

sitemapgen4j 组件的主页:http://code.google.com/p/sitemapgen4j/
上面包括组件的源代码和简易的使用教程,懂点英文的就动手了。

sitemapgen4j 组件主要是针对你提供的URL以及该URL对应的属性,生成sitemap中如下这段xml:
<url>
  <loc>http://www.google.com.hk</loc>
  <lastmod>2010-09-29</lastmod>
  <changefreq>weekly</changefreq>
  <priority>0.7</priority>
</url>

而一个网站的sitemap.xml文件中需要包括提供给搜索引擎收录的URL,那如何获取网站上的提供给SE
收录的URL呢,这个当然用到htmlParser了。关于这个组件,大家可以去google下,
包括功能介绍和教程;同时这个组件中用的几个设计模式都非常典型,学习设计模式的可以作为参考。

生成sitemap.xml的主要思路:
1、从网站首页开始使用htmlParser,才去广度优先策略对抓取网站上的URL
2、使用sitemapgen4j针对每一个URL设置对应的属性,并生成XML

具体代码如下:
a、扩展WebSitemapUrl,以便能在队列中方便控制
public interface CrawlUrl {

    boolean canCrawl();

    void disable();
}


import org.apache.commons.lang.StringUtils;

import com.redfin.sitemapgenerator.WebSitemapUrl;

public class ExtWebSiteMapUrl extends WebSitemapUrl implements CrawlUrl {

    public ExtWebSiteMapUrl(Options options) {
        super(options);
    }

    private boolean canCrawl = true;

    @Override
    public boolean canCrawl() {
        return canCrawl;
    }

    @Override
    public void disable() {
        canCrawl = false;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }

        if (obj instanceof ExtWebSiteMapUrl) {
            ExtWebSiteMapUrl url = (ExtWebSiteMapUrl) obj;
            return StringUtils.equals(url.getUrlStr(), getUrlStr());
        }

        return false;
    }

    public String getUrlStr() {
        return super.getUrl().toExternalForm();
    }

}


import java.io.File;
import java.net.MalformedURLException;
import java.util.Date;
import java.util.LinkedList;
import java.util.Queue;
import java.util.TimeZone;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeIterator;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

import com.redfin.sitemapgenerator.ChangeFreq;
import com.redfin.sitemapgenerator.W3CDateFormat;
import com.redfin.sitemapgenerator.WebSitemapGenerator;
import com.redfin.sitemapgenerator.WebSitemapUrl;

public class HtmlCrawler {

    private static NodeClassFilter LINK_FILTER = new NodeClassFilter(
            LinkTag.class);
    private static Parser parser = new Parser();
    private static File dir = new File("D:\\sitemaptest");
    private static String BASE_PREFIX = "http://www.xxxx.com";
    private static WebSitemapGenerator wsg = null;

    static {
        W3CDateFormat dateFormat = new W3CDateFormat(W3CDateFormat.Pattern.DAY);
        dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+8"));
        try {
            wsg = WebSitemapGenerator.builder(BASE_PREFIX, dir).dateFormat(
                    dateFormat).build();
        } catch (MalformedURLException e) {
            System.out.println("the start url [" + BASE_PREFIX
                    + "] is malformed");
        }
    }

    public static void main(String[] args) throws ParserException,
            MalformedURLException {

        ExtWebSiteMapUrl startUrl = new ExtWebSiteMapUrl(
                new WebSitemapUrl.Options("http://www.xxxx.com").lastMod(
                        new Date()).priority(0.9).changeFreq(ChangeFreq.WEEKLY));

        Queue<ExtWebSiteMapUrl> queue = new LinkedList<ExtWebSiteMapUrl>();
        queue.add(startUrl);

        crawl(queue, wsg);

        System.out.println("done");
    }

    /** *//**
     * 检测是否为同一个域下的url
     * 
     * @param url
     * @param basePrefix
     * @return
     */
    public static boolean check(String url, String basePrefix) {
        return StringUtils.isNotBlank(url) ? url.startsWith(basePrefix) : false;
    }

    /** *//**
     * 使用队列循环抓取页面上的URL
     * 
     * @param queue
     * @param wsg
     */
    public static void crawl(Queue<ExtWebSiteMapUrl> queue,
            WebSitemapGenerator wsg) {
        if (CollectionUtils.isEmpty(queue)) {
            return;
        }

        Queue<ExtWebSiteMapUrl> crawled = new LinkedList<ExtWebSiteMapUrl>();

        do {
            ExtWebSiteMapUrl url = queue.poll();
            crawled.add(url);

            if (url != null && url.canCrawl()) {
                try {
                    parser.setURL(url.getUrl().toExternalForm());
                    NodeList list = parser.parse(LINK_FILTER);
                    for (NodeIterator iter = list.elements(); iter
                            .hasMoreNodes();) {
                        String link = ((LinkTag) iter.nextNode()).getLink();
                        ExtWebSiteMapUrl newUrl = null;
                        try {
                            newUrl = new ExtWebSiteMapUrl(
                                    new WebSitemapUrl.Options(link).lastMod(
                                            new Date()).priority(0.7)
                                            .changeFreq(ChangeFreq.WEEKLY));
                        } catch (MalformedURLException e) {
                            System.out.println("the url [" + link
                                    + "] is malformed");
                            continue;
                        }
                        if (check(link, BASE_PREFIX) && !queue.contains(newUrl)
                                && !crawled.contains(newUrl)) {
                            queue.add(newUrl);
                            wsg.addUrl(newUrl);
                        }
                    }
                } catch (ParserException e) {
                    System.out.println("can not parser the url : "
                            + url.getUrl());
                } finally {
                    url.disable();
                }
            }
        } while (queue.size() > 0);

        wsg.write();
    }
}


分享到:
评论

相关推荐

    htmlparser

    META-INF/maven/org.htmlparser/htmlparser/pom.xml org.htmlparser.Parser.class org.htmlparser.PrototypicalNodeFactory.class org.htmlparser.beans.BeanyBaby.class org.htmlparser.beans.FilterBean.class org...

    htmlparser1_6.jar

    7. **与其他库的集成**:HTMLParser可以轻松地与Java集合框架、XPath、DOM以及其他Java库结合使用,扩展其功能,如XML处理或数据分析。 在实际使用中,开发者通常会通过以下步骤使用HTMLParser: 1. **导入库**:...

    htmlparser-1.6p.jar

    "htmlparser-1.6p.jar"是该库的特定版本,用于在Java环境中集成和使用。 HTMLParser的核心功能包括: 1. **标签和属性处理**:它可以识别并解析HTML文档中的各种标签,如`&lt;html&gt;`, `&lt;head&gt;`, `&lt;body&gt;`等,同时处理...

    htmlparser.jar文件

    在描述中提到的“org.htmlparser.Node”和其他的.class文件,这些都是HTMLParser库的核心组成部分。`org.htmlparser.Node` 是HTMLParser中的一个关键接口,它代表HTML文档中的一个节点,可以是元素(Element)、注释...

    HTML Parser

    org.htmlparser.Tag org.htmlparser.Node org.htmlparser.Text org.htmlparser.Parser org.htmlparser.Remark org.htmlparser.tags.Div org.htmlparser.Attribute org.htmlparser.tags.Html org.htmlparser.tags....

    Winista.HtmlParser(含帮助手册)

    Winista.HtmlParser可能采用了基于DOM(文档对象模型)或SAX(简单API for XML)的解析策略。DOM解析会构建一个完整的HTML结构树,而SAX则是事件驱动的,逐行解析,适用于大文件。 2. **API接口**: Winista....

    Winista.Htmlparser.Net 源码 +Demo

    `HtmlParser2003`可能是一个早期版本的源代码,而`AnalyzeHtml`和`WebParser`则可能是演示如何使用HtmlParser的项目。 1. **AnalyzeHtml**:这个项目可能展示了如何分析HTML文档,通过调用HtmlParser的API来提取...

    htmlparser1_6.rar

    HTMLParser1.6是该库的一个稳定版本,包含`htmlparser1.6.jar`和`htmlparser1.6_src.jar`两个文件,前者是编译好的可直接使用的类库,后者则是源代码包,方便用户查阅和定制。 在HTMLParser1.6中,主要包含以下几个...

    Winista.Htmlparser.Net 解析Html 的.net类库

    HtmlParser.Net是来源于Java的一个用来解析html的组件,主要用于改造或提取html。它能够高速解析html,是非常好的一个html解析和分析... 这个是.Net版本包括源代码和帮助文档。 版本:HTMLParser.Net - Community 1.8

    java解析html工具htmlparser的jar包及api文档

    API文档是使用HTMLParser的关键,它详尽地解释了库中每个类、方法和接口的用途。通过API文档,开发者可以了解如何初始化解析器,如何遍历HTML元素,以及如何处理各种HTML标签。例如,HTMLParser库可能会提供如`...

    python之htmlParser入门教程分享.docx

    ### Python之htmlParser入门教程详解 #### 一、HTMLParser模块简介 HTMLParser模块是Python标准库中的一个重要组成部分,主要用于解析HTML文档。该模块提供的`HTMLParser`类可以帮助开发者轻松地解析HTML或XHTML...

    HTMLParser 使用举例

    HTMLParser 使用举例 HTMLParser 是一个开源的类库,用于解析 Web 页面。它有两种主要使用方式:extraction 和 transformation。前者用于从网页中萃取出需要的内容,后者用于把 Web 页面中的内容转换为需要的格式。...

    c#版htmlparser htmlparser.dll htmlparser源代码

    `htmlparser.dll`是这个库的动态链接库文件,它包含了编译好的类和方法,可以直接在C#项目中引用以使用HTMLParser的功能。在C#项目中,我们可以通过添加对dll的引用来调用库中的方法,比如解析HTML字符串、查找特定...

    htmlparser2.1.jar

    7. **与其他库的集成**:HTMLParser2.1可以方便地与其它Java库如Jsoup、Apache HttpClient等结合使用,共同构建更强大的网络爬虫系统。例如,可以先用HTMLParser解析HTML,然后利用Jsoup进行更精细的数据提取。 8. ...

    htmlparser.jar.rar

    这个压缩包"htmlparser.jar.rar"包含了与HTMLParser相关的几个组件,但遗憾的是,它并没有提供源代码或文档,这可能会对理解和使用这个库造成一定的困难。让我们详细了解一下这些文件及其可能的作用。 1. **log4j-...

    HTMLParser使用详解.doc

    在实际应用中,HTMLParser 可以与各种访问者模式(如 `TextExtractingVisitor`)结合,实现更复杂的数据提取和处理任务。同时,用户也可以自定义访问者类来实现特定的需求,比如提取特定标签内的文本、查找链接、...

    htmlParser.jar包

    在实际应用中,HTMLParser通常与其他技术结合使用,例如与网络请求库(如Apache HttpClient或OkHttp)配合,从远程服务器获取HTML内容;或者与数据存储库(如MySQL、MongoDB)集成,将解析后的数据保存到数据库中。...

    htmlParser2.0.jar

    尽管该库在最近四年里没有更新记录,但其稳定性和可靠性得到了时间的验证,2011年4月24日的最后提交表明了它在那个时期仍被维护和优化。 HTMLParser2.0的核心功能包括: 1. **HTML标签解析**:HTMLParser2.0能识别...

    htmlparser.jar.zip

    HTMLParser支持DOM(Document Object Model)解析方式,允许用户通过节点遍历来访问整个HTML结构,也可以使用SAX(Simple API for XML)事件驱动模型,当遇到特定元素时触发回调函数。 网页分析中,HTMLParser有助...

    htmlparser2.0_dll+htmlparserAPI

    `HTMLParser-2[1].0-API.CHM`文件是HTMLParser2.0的API参考手册,它包含了详细的API文档,为开发者提供了如何使用这个库的指南。通过这个手册,开发者可以学习如何创建解析器实例,设置解析选项,注册事件处理器,...

Global site tag (gtag.js) - Google Analytics