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

可能大家看到过有些网站有以下功能(如图所示)

360截图20121123000007632

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

后来想了想,有没有这样的网站,把所有的网站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的源代码,找出要提取的内容的特征

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

/**
	 * 从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分钟。

以上方法可以大大减轻录入网站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,也可以自己通过正则表达式等方法实现一个提取顶级域名、二级域名的类,从而完成任务。

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

转载于:https://my.oschina.net/lidonghao/blog/91183

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,我们可以使用URL类和URLConnection类来根据URL接口获取文件名称和类型。 首先,我们需要创建一个URL对象,将URL字符串作为参数传递给它的构造函数。然后,我们可以通过调用URL对象的openConnection()方法创建一个URLConnection对象。 接下来,我们可以调用URLConnection对象的getContentType()方法获取文件的类型。这个方法会返回一个表示文件类型的字符串,比如"text/html"表示HTML文件。我们可以根据需要进行进一步的处理和判断。 另外,我们也可以通过调用URLConnection对象的getHeaderFields()方法获取响应头中的字段信息。其中,文件名称通常存储在Content-Disposition字段中。我们可以通过对该字段进行解析和处理,获取到文件的原始名称。 下面是一段示例代码,演示了如何根据URL接口获取文件名称和类型的过程: ``` import java.io.IOException; import java.net.URL; import java.net.URLConnection; public class FileNameAndType { public static void main(String[] args) { String urlString = "https://example.com/example.pdf"; try { URL url = new URL(urlString); URLConnection connection = url.openConnection(); String contentType = connection.getContentType(); System.out.println("文件类型: " + contentType); String contentDisposition = connection.getHeaderField("Content-Disposition"); if (contentDisposition != null && contentDisposition.contains("filename=")) { String fileName = contentDisposition .substring(contentDisposition.indexOf("filename=") + 9) .replace("\"", ""); System.out.println("文件名称: " + fileName); } } catch (IOException e) { e.printStackTrace(); } } } ``` 请注意,在使用这段代码时,我们需要将"urlString"变量替换为实际的URL接口。同时,也需要处理可能出现的异常情况,比如网络连接失败等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值