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

我知道手机号码归属地的判断是根据前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)(

]+>[\\s]*]+>[\\s]*卡号归属地[\\s]*[\\s]*]+>([^[\\s]*)"; //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"));

}

}

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

java 手机号码归属地_Java获取手机号码归属地相关推荐

  1. java 获取手机归属地_java 获取手机归属地

    java 获取手机归属地 [2021-01-30 20:46:44]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/( ...

  2. php根据手机号区分地址,PHP判断手机号码归属地、获取手机号码归属地

    PHP判断手机号码归属地.获取手机号码归属地: /** * 判断手机号码归属地 * @param string $phone * @param array $regions 省 * return bo ...

  3. java 获取秒数_Java获取精确到秒的时间戳(转)

    1.时间戳简介: 时间戳的定义:通常是一个字符序列,唯一地标识某一刻的时间.数字时间戳技术是数字签名技术一种变种的应用.是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01 ...

  4. java手机号分割_java 获取手机号归属地

    所需pom依赖: com.googlecode.libphonenumber libphonenumber 8.0.0 com.googlecode.libphonenumber geocoder 2 ...

  5. java 文件md5校验_Java 获取 文件md5校验码

    讯雷下载的核心思想是校验文件的md5值,两个文件若md5相同则为同一文件. 当得到用户下载某个文件的请求后它根据数据库中保留的文件md5比对出拥有此文件的url, 将用户请求挂接到此url上并仿造一个 ...

  6. java calendar字符串显示_Java获取当前时间年月日、时间格式化打印、字符串转日期...

    package com.sysc.simple; import java.text.ParseException; import java.text.SimpleDateFormat; import ...

  7. java src 文件路径_java获取src下文件路径和获取webRoot下文件路径

    获取src下的fileurl.properties文件路径 this.getClass().getResource("/fileurl.properties").getPath() ...

  8. java 扫描所有子类_java获取全部子类或接口的全部实现

    在JAVA中,获取一个类的全部父类是比较简单的,只需要通过反射(Class的getSuperclass()方法)即可.然而,如果想获得一个类的所有子类,或者获得实现某一个接口的所有实现类,相对比较麻烦 ...

  9. java 取随机正整数_Java获取随机数

    Java 获取随机数 import java.util.Random; public class randomDemo { public static void main(String[]args){ ...

  10. java kafka 拉取_java获取kafka consumer lag

    maven依赖 org.apache.kafka kafka-clients 0.10.1.0 注意:kafka-clients版本需要0.10.1.0以上,因为调用了新增接口endOffsets; ...

最新文章

  1. 【C++】【二】动态数组-Dynamic_linklist
  2. win10恢复经典开始菜单_小编教你电脑如何升级win10
  3. linux/unix inode的一个面试问题及一些概念
  4. Linux开机启动顺序
  5. android getwindow 在fragment不能使用,Android Fragment 布局使用 fitsSystemWindows = true 无效解决方案...
  6. 数据结构(四)串的动态数组存储
  7. ckedit 3.0 配置(一)
  8. error C2143: syntax error : missing ';' before '}'
  9. C++函数返回局部变量
  10. java编程方向_java网络编程方向具体该怎么去学
  11. [Translation]Silverlight 4-MVVM with Commanding and WCF RIA Services
  12. PHP图片验证码制作(上)
  13. R语言ETL工程系列:R语言基础设置
  14. python静态检查工具哪个好用_介绍几款 Python 类型检查工具
  15. 苹果手机java设置_苹果java文件怎么打开?苹果手机安装JAVA程序的方法
  16. 关闭文件和打印机共享服务器,网络发现自动关闭、无法启用文件和打印共享的解决办法...
  17. linux系统怎么改待机时间,LINUX操作系统——易用程度/待机时间/连接功能_手机_手机其它OS-中关村在线...
  18. 当文件夹访问被拒绝,需要权限来执行此操作怎么办?
  19. 如何打印网上的文章资料,网上文章怎么打印
  20. 算算职场薪水账 到手3000元税前工资约3760元

热门文章

  1. rs232接口_RS232串口通信:接口定义、标准接法详细说明,一看就懂了
  2. linux 内网文件传输工具_局域网内文件传输工具 | nitroshare
  3. 服务器机房动环监控系统,IDC动环监控系统
  4. 云忧cms搭建在宝塔nginx服务器,登录报错
  5. 网络靶场攻防综合实验
  6. 华为手机计算机不能用,华为手机无法连接电脑(手机助手)怎么办,连接不上...
  7. 一个前端如何画各种特效或图案
  8. MATLAB与STK互联17:卫星对象操作(8)—地面站可见性计算并获取数据
  9. 勒索病毒:解密工具整理
  10. WordPress中文插件 Erphpdown vip会员+推广提成+收费下载/查看内容+前端个人中心 银联/支付宝/微信支付/财付通/贝宝paypal[更新至v9.6.1]