您的位置:首页 > 编程语言 > Java开发

Java获取手机号码归属地

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

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



Java代码


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(" ", " ");

}

}





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"));

}



}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: