根据URL找出网站名称的“土”方法

可能你们看到过有些网站有如下功能(如图所示) java

360截图20121123000007632

这里显示的文章的来源网站,并非URL,并且网站的名称。事实上,这个网站名称是根据这篇文章的URL推断出来的,即给你一个网页的URL,找出这个URL对应的网站名。举例说,URL为http://www.sina.com.cn/ ,那么网站名即是“新浪”。为了实现这个功能,到网上查了不少资料,没有发现好的解决方法,只好用一种比较笨的方法来解决。思路是在数据库建一张表,记录URL和网站名的映射关系,这样就能够直接根据URL查找到对应的网站名了。这种方法是最直接的,但创建这样一张表,须要手工录入足够多的网站URL和网站名,显然不是一项轻松的工做。 web

后来想了想,有没有这样的网站,把全部的网站URL和网站名都列出来,这样我只须要写一个简单的程序,从这个网站里提取信息,保存到数据库就好了,省下了不少功夫。在百度里搜索一下,竟然真的找到这种类型的网站:http://top.chinaz.com/list.aspx,这个网站列出了中国排名前5213位的网站URL及网站名,如图所示: 正则表达式

360截图20121122230941814

只要把这些排名网站的信息提取出来,就能够向数据库插件5000多个网站的URL及网站名。jsoup这个开源项目能够很方便地提取网页内容,下面用jsoup提取网站URL及名称。 数据库

1.先到jsoup的官方网下载最新版的JAR包:http://jsoup.org/ 学习

2.jsoup的官网有很详细的教程,这里便不介绍其用法了 网站

3.查看http://top.chinaz.com/list.aspx的源代码,找出要提取的内容的特征 url

4.根据特征提取网站URL及名称,代码以下: spa

/**
	 * 从http://top.chinaz.com/提取排名前5000多位的网站URL及网站名
	 * @return
	 */
	public Map<String,String> getRealmNameFromChinaz(){
		//用于保存网站URL和网站名
		Map<String,String> map=new HashMap<String,String>();
		Document doc=null;
		try {
			//总共有522页
			for(int i=1;i<=522;i++){
				//每一页的连接是有规律的,http://top.chinaz.com/list.aspx?p=第几页
				doc = Jsoup.connect("http://top.chinaz.com/list.aspx?p="+i).get();
				//提取网站名和URL
				Elements elements=doc.select("div.info a");
				for(Element element:elements){
					String name=element.text();//网站名
					String url=element.nextElementSibling().text();//网站URL
					map.put(url, name);//保存到map中
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return map;
	}

这样就能够获取5000多个网站的URL和网站名了,而后再把这些结果保存到数据库,供查询使用。抓取并保存到数据库,整个过程大概须要3分钟。 .net

以上方法能够大大减轻录入网站URL和网站名的工做,若是须要从其余网站抓取相似的信息,也能够采用这种方法。固然,互联网上的网站不可胜数,想把全部的网站URL和网站名都收录是不大可能的,咱们只要收录大部分的主流网站(也就是排名靠前的网站)就好了,剩下的一些网站能够采用手工录入的方式,保存到数据中。 插件

把网站的URL和网站名保存到数据库只是第一部分工做,第二部分工做要作的是根据URL查询名称。大多时候,咱们拿到的URL并非www.oschina.net这样的连接,并且相似http://www.oschina.net/project,这时候须要咱们对URL进行处理,提取原始URL中的域名(即www.oschina.net)。这也不是一件很容易的事,由于网站的域名可能有多级,如http://justjavac.iteye.com/blog/1727586,要把这个网址转为www.iteye.com,要费必定功夫。目前提取顶级域名的开源项目有libtld,也能够本身经过正则表达式等方法实现一个提取顶级域名、二级域名的类,从而完成任务。

注:菜鸟一个,博客内容写得很肤浅,只是用于记录工做学习中遇到的一些问题及解决方法,这些方法在别人看来可能不值一提,仅供参考。

相关文章
相关标签/搜索