`
HotStrong
  • 浏览: 507423 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

HtmlParser解决查询IP所在城市问题

阅读更多

 

HtmlParser解决查询IP所在城市问题

 

 

1、技术目标

 

 

  • 分析IP所在城市
  • 掌握HtmlParser解析HTML内容

 

提示:本文提供HtmlParser帮助文档下载

 

2、问题描述

 

项目中要求按发送请求的用户IP分析出所在城市。完成该功能

可以自己维护一个IP数据库,该方式显然费时费力。目前网上有不少的

站点提供IP查询功能,可以使用这些站点的功能,通过HtmlParser分析

出来查询结果来实现的IP查询的需求

 

3、IP查询站点流程

 

以站点www.ip138.com为例,其IP数据库10天一更新,

 

3.1)在IP地址输入框中输入待查询的IP地址,如图:

 

 

3.2)点查询,进入查询结果页面,注意请求的URL以及参数,如图:

 

 

3.3)查询结果页面HTML代码部分,如图:

 

 

 

4、项目中导入HtmlParser库,文件如下:

 

htmllexer.jar

htmlparser.jar

 

提示:本文已提供下载

 

5、分析www.ip138.com站点的IP查询结果,代码如下:

 

 

package test;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.TableColumn;
import org.htmlparser.tags.TableRow;
import org.htmlparser.tags.TableTag;
import org.htmlparser.util.NodeList;

public class TestIP {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		try {
			
			String ip1 = "58.253.71.109";//茂名(广东)
			String ip2 = "112.125.35.205";//北京
			String ip3 = "192.168.60.100";//局域网
			String ip4 = "211.151.135.27";//北京
			String ip5 = "61.139.76.40";//成都
			String ip6 = "218.205.252.26";//四川省 移动
			String ip7 = "222.208.168.100";//眉山(四川)
			
			//HTML解析器
			Parser parser = new Parser();
			
			//设置IP查询请求的URL以及参数
			String path = "http://www.ip138.com/ips.asp?ip=" + ip7 + "&action=2";
			parser.setURL(path);
			parser.setEncoding("GB2312");
			
			//HTML节点过滤器
			NodeFilter tableFilter = new TagNameFilter("table");//提取table标签
			NodeList tables = parser.extractAllNodesThatMatch(tableFilter);
			
			if(tables.size() < 4){//表格没有4个(提示:IP查询结果页面有4个表格)
				return;//不处理
			}
			
			//获取第3个表格(含城市信息的表格是第3个)
			TableTag table = (TableTag)tables.elementAt(2);
			
			//获取第三行(包含城市信息的行)
			TableRow row3 = table.getRow(2);
			
			//获取第三行所有列
			TableColumn[] row3cols = row3.getColumns();
			
			//取第一列的解析器(含城市信息的列)
			Parser row3ColParser = Parser.createParser(row3cols[0].getStringText(), "utf-8");;
			
			//解析出li标签
			NodeFilter liFilter = new TagNameFilter("li");//提取li标签
			NodeList liTags = row3ColParser.extractAllNodesThatMatch(liFilter);
			
			//取出第一个li标签的值
			Node node = liTags.elementAt(0);
			String value = node.getFirstChild().getText();
			System.out.println(value);
			
			if(value.indexOf("局域网") != -1){
				System.out.println("局域网");
				return;
			}
			
			if(value.indexOf("市") == -1){//没有包含市
				return;
			}
			
			//解析出城市名
			String city = value.substring(value.indexOf(":") + 1, value.indexOf("市"));
			if(city.indexOf("省") != -1){
				city = city.substring(city.indexOf("省") + 1);
			}
			System.out.println(city);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}

 

 

 

4
1
分享到:
评论
4 楼 yuanq_20 2012-06-15  
推荐
yuanq_20 写道
这么做,不稳定啊!

建议考虑使用QQ显IP数据库,自己去实现~~
3 楼 yuanq_20 2012-06-15  
这么做,不稳定啊!
2 楼 luoyahu 2011-12-16  
不是有免费的IP库可以查询吗?定期升级一下IP库就好了。
htmlparser都没人维护了,还是用jsoup吧!
1 楼 kakaluyi 2011-12-15  
你的服务的稳定性加在别人服务稳定的基础,以后自己访问量起来后,别人封杀你的ip请求,风险太大,还不如自己维护呢。。。

相关推荐

Global site tag (gtag.js) - Google Analytics