可能你们看到过有些网站有如下功能(如图所示) java
这里显示的文章的来源网站,并非URL,并且网站的名称。事实上,这个网站名称是根据这篇文章的URL推断出来的,即给你一个网页的URL,找出这个URL对应的网站名。举例说,URL为http://www.sina.com.cn/ ,那么网站名即是“新浪”。为了实现这个功能,到网上查了不少资料,没有发现好的解决方法,只好用一种比较笨的方法来解决。思路是在数据库建一张表,记录URL和网站名的映射关系,这样就能够直接根据URL查找到对应的网站名了。这种方法是最直接的,但创建这样一张表,须要手工录入足够多的网站URL和网站名,显然不是一项轻松的工做。 web
后来想了想,有没有这样的网站,把全部的网站URL和网站名都列出来,这样我只须要写一个简单的程序,从这个网站里提取信息,保存到数据库就好了,省下了不少功夫。在百度里搜索一下,竟然真的找到这种类型的网站:http://top.chinaz.com/list.aspx,这个网站列出了中国排名前5213位的网站URL及网站名,如图所示: 正则表达式
只要把这些排名网站的信息提取出来,就能够向数据库插件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,也能够本身经过正则表达式等方法实现一个提取顶级域名、二级域名的类,从而完成任务。
注:菜鸟一个,博客内容写得很肤浅,只是用于记录工做学习中遇到的一些问题及解决方法,这些方法在别人看来可能不值一提,仅供参考。