Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 356|回复: 0

[Java基础知识]基于JAVA语言提取网站内部URL的算法

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-1 22:08:35 | 显示全部楼层 |阅读模式
    摘 要:对于一个网站的信息检索或者是拓扑结构研究,首要的问题就是提取整个网站内部的URL。本文给出了一种实用有效的提取网站内部URL的方法。
        关键词:URL, 遍历, java 一、引言      20世纪末是万维网开始膨胀的时期,它的发展速度是十分惊人的。据统计,万维网已经连通了世界上几乎所有的国家,并且万维网正在急速发展。目前,万维网已经成为世界上最大的信息源,成为全球范围内科研、教育、商业和社会、新闻、学校和专业机构介绍、图书及娱乐等信息的集大成者。近年来对万维网的研究的两大热点是网络搜索引擎的研究和网络拓扑结构的研究。对于网络信息挖掘的首先要面对的问题就是如何提取出网站内部的URL,只有获得了网站的所有URL才可以网站的全部内容。基于此本文给出了一种实用有效的提取网站内部URL的方法。  
      
      
      
      二、Java基础    java语言方便灵活,是现在开发网络程序的主要语言。本文采用了Java语言来开发。在Java的提供的java.util.*和 java.net.* 工具包中提供了大量简单易用的API。此外,在网络上还有大量的开放源码。

    HTMLParser v 1.3是一套优秀的开放源代码的提供HTML文件分析的工具包。它可以提供快速的、实事的文本分析的功能。HTMLParser最大的成功之处是它设计简单、速度快、应用方便。可以从http://htmlparser.sourceforge.net下载此工具包和了解其用法。

    对于HTMLParser 工具包我们需要修改其中的htmlparser.java文件使其适用中文的html文件分析。htmlparser.java文件中具体实现细节就不再介绍。这里主要是把protected static final String DEFAULT_CHARSET = "ISO-8859-1";修改成protected static final String DEFAULT_CHARSET = "gb2312";因为采用默认的字符集"ISO-8859-1"对含有中文的html文件进行分析的时候就会出现乱码。必须进行new String(str.getBytes("ISO-8859-1"),"GB2312")的转换工作。
    对于修改好的htmlparser工具包,需要重新压缩成.jar文件,放到jdk的工作环境中。 三、具体设计     首先新建一个静态全局Vector变量L,在算法的递归调用中往L中不断添加新发现的URL。公式(1)是一个遍历网站内部URL的数学表达式。

    S=T(ui) (1)
    s.t. ui O(ui)
    ui Ui-1 i=1,2…m

    其中T(u)是遍历一个站点的所有URL的函数,为了保证该遍历方法收敛这里我给出了两个限制条件,ui为一网站中的URL,O(ui)是判断ui是否为该网站内部的URL。
    算法是:
    1) 定义全局静态变量public static Vector svecLink;
    2) 开始搜索网站W的主URL;
    3) 解析出第一页面的所有URL;
    4) 剔除无效的URL和非本站点的URL同时记录所获的URL的个数为a;
    5) 把URL添加到svecLink中;
    6) 从svecLink中取出最后a个URL分别递归调用此函数


    为了能保证遍历的收敛,程序必须对URL进行严格限制。下面是一些具体实现:
    1) 定义的全局变量
    public final int DEEP=3; //遍历的深度
    public static Vector svecLink, svecOutlink; //存放内部URL和外部URL
    public static String hostName; //主机名称
    public static boolean bl; //判断标志
    private String location;
    private Parser parser; //对超文本进行分析

    2) 获取主机名称GetHostName()函数
    通过该函数来判断所得URL是否是本网站的URL,如果不是就不需要添加svecLink中如果是并且以前没有提取过就添加到svecLink中。
    public String GetHostName(String hostname)
    {
    URL aurl;
    String ss=" ";
    try
    {
    aurl=new URL(hostname);
    ss=aurl.getHost();
    }
    catch(MalformedURLException e)
    {
    e.printStackTrace();
    }
    return ss;
    }

    3) 递归遍历方法
    由于网站中URL之间的连接构成了图,所以对图的遍历这里采用深度优先的方法。
    public void extractLinks(String loc) throws ParserException {
    System.out.println("Parsing "+loc+" for links...");

    Vector vecTemp=new Vector();
    try {
    this.parser = new Parser(loc); //原理见HTMLParser
    parser.registerScanners();
    bl=true;
    }
    catch (ParserException e) {
    bl=false;
    e.printStackTrace();
    }

    String ss,str1;
    URL wwwurl;
    boolean byes;

    int a=0;
    b++;
    Node [] links = parser.extractAllNodesThatAre(LinkTag.class); //获取一个页面中//所有的URL
    for (int i = 0;i < links.length;i++) {
    if(bl)
    {
    byes=true;
    System.out.println("Total url is "+links.length+"This page has url "+i);
    LinkTag linkTag = (LinkTag)links;
    str1=linkTag.getLink();
    if(str1.equals("")) continue;
    if(str1.charAt(str1.length()-1)=="/"
    ||str1.charAt(str1.length()-1)=="\")
    str1=str1.substring(0,str1.length()-1);
    if(!svecLink.contains(str1))
    {
    try
    {
    wwwurl=new URL(str1);
    wwwurl.getContent();
    }
    catch(MalformedURLException e)
    {
    byes=false;
    }
    catch(IOException e)
    {
    byes=false;
    }
    if(GetHostName(str1).equals(hostName) && byes)
    {
    a++;
    tID++;
    svecLink.add(str1);
    vecTemp.add(str1);
    System.out.println("the url is "+str1);
    }
    else
    {

    svecOutlink.add(str1);
    }
    }
    }
    }

    String strNew;
    if(a>0&&b<=DEEP)
    {

    for(int i=0;i<vecTemp.size();i++)
    {
    strNew=(String)vecTemp.get(i);
    System.out.println("this is "+strNew);
    extractLinks(strNew); //递归调用
    }
    }

    }  四、结论    本文介绍给出了一种提取网站内部URL的实现方法,本文的方法对网络机器人的研究和WEB文本挖掘提供了方便的工具。在程序的实现中还有许多实际的困难,需要在实验中不断完善和改进。
                                      (作者:董小虎 熊征峰 杨晓玲 )
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-21 20:34 , Processed in 0.375824 second(s), 51 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表