`
guoyunsky
  • 浏览: 839668 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
3d3a22a0-f00f-3227-8d03-d2bbe672af75
Heritrix源码分析
浏览量:203307
Group-logo
SQL的MapReduce...
浏览量:0
社区版块
存档分类
最新评论

Java获取手机号码归属地

    博客分类:
  • java
阅读更多

      工作过程中抓取了很多手机号码,现需要获取他们的归属地。于是自己写了个工具类,这个工具类只是基本了实现该功能,没有考虑其他因素。

      我知道手机号码归属地的判断是根据前7位,一开始本想获取他们的规律,就是哪个号码段的手机是属于哪个地区,但发现自己无法获取。于是想到了有一些网站有这个功能,同时自己也写爬虫,于是利用爬虫的思路去完成这个功能。这里大概思路是通过HttpClient去模拟提交那些网站的查询功能,这里是www.ip138.com,然后通过正则表达式去解析HttpClient相应内容,从里面抽取出手机归属地。同时对要查询的手机进行一个验证,具体代码请看如下:

   

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
/**
 * 通过手机号码,获得该号码的归属地
 * 
 * @author Administrator
 *
 */
public class MobileFromUtil {
	//正则表达式,抽取手机归属地
	public static final String REGEX_GET_MOBILE=
		"(?is)(<tr[^>]+>[\\s]*<td[^>]+>[\\s]*卡号归属地[\\s]*</td>[\\s]*<td[^>]+>([^<]+)</td>[\\s]*</tr>)"; //2:from
	//正则表达式,审核要获取手机归属地的手机是否符合格式,可以只输入手机号码前7位
	public static final String REGEX_IS_MOBILE=
		"(?is)(^1[3|4|5|8][0-9]\\d{4,8}$)";
	
	/**
	 * 获得手机号码归属地
	 * 
	 * @param mobileNumber
	 * @return
	 * @throws Exception
	 */
	public static String getMobileFrom(String mobileNumber) throws Exception {
		if(!veriyMobile(mobileNumber)){
			throw new Exception("不是完整的11位手机号或者正确的手机号前七位");
		}
		HttpClient client=null;
		PostMethod method=null;
		NameValuePair mobileParameter=null;
		NameValuePair actionParameter=null;
		int httpStatusCode;
		
		String htmlSource=null;
		String result=null;
		
		
		try {
			client=new HttpClient();
			client.getHostConfiguration().setHost("www.ip138.com", 8080, "http");
			method=new PostMethod("/search.asp");
			mobileParameter=new NameValuePair("mobile",mobileNumber);
			actionParameter=new NameValuePair("action","mobile");
			method.setRequestBody(new NameValuePair[] { actionParameter,mobileParameter }); 
			//设置编码
			method.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "GB2312");
			
			client.executeMethod(method);
			httpStatusCode=method.getStatusLine().getStatusCode();
			if(httpStatusCode!=200){
				throw new Exception("网页内容获取异常!Http Status Code:"+httpStatusCode);
			}
			
			htmlSource=method.getResponseBodyAsString();
			if(htmlSource!=null&&!htmlSource.equals("")){
				result=parseMobileFrom(htmlSource);
			}
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			method.releaseConnection();
		}
		
		return result;
		
	}


	/**
	 * 从www.ip138.com返回的结果网页内容中获取手机号码归属地,结果为:省份 城市
	 * 
	 * @param htmlSource
	 * @return
	 */
	public static String parseMobileFrom(String htmlSource){
		Pattern p=null;
		Matcher m=null;
		String result=null;
		
		p=Pattern.compile(REGEX_GET_MOBILE);
		m=p.matcher(htmlSource);
		
		while(m.find()){
			if(m.start(2)>0){
				result=m.group(2);
				result=result.replaceAll("&nbsp;", " ");
			}
		}
		
		
		return result;
		
	}
	
	/**
	 * 验证手机号
	 * @param mobileNumber
	 * @return
	 */
	public static boolean veriyMobile(String mobileNumber){
		Pattern p=null;
		Matcher m=null;
		
		p=Pattern.compile(REGEX_IS_MOBILE);
		m=p.matcher(mobileNumber);
		
		return m.matches();
	}
	
	/**
	 * 测试
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		System.out.println(getMobileFrom("13888888888"));
	}

}

 

更多技术文章、感悟、分享、勾搭,请用微信扫描:

5
2
分享到:
评论
3 楼 jimmee 2014-03-25  
呵呵, 做爬虫的思路果然一样.

我也是想找规律, 这样不用调用外部的请求拿地址了, 但是一些手机号码, 如果是隐私的话, 调用外部接口有泄漏的风险.

实在没办法, 才调用外部接口查询吧.
2 楼 gyh_han 2012-02-20  
程序运行有问题呢,断点调试一下46行之后直接跳到67行,然后就是空指针异常,求解!
1 楼 crabboy 2010-05-12  
提供了不错的思路

相关推荐

Global site tag (gtag.js) - Google Analytics