最近在学习数据库的相关知识,准备建立数据库。先要有大量的数据,用C#获取全部号段的手机号码的归属地信息,
获取的数据字段包括 省份 城市 运营商信息,对于数据分析、号码归属地查询等非常有帮助。后期可以和城市区号等相关信息关联,建立更全面的数据库。
我国手机号码由11位组成,其中,前3位网络识别号,第4-7位为地区编码,第8-11位为用户号码
1、
三大运营商最新号段
移动号段:
134 135 136 137 138 139 147 148 150 151 152 157 158 159 172 178 182 183 184 187 188 198
联通号段:
130 131 132 145 146 155 156 166 167 171 175 176 185 186
电信号段:
133 149 153 173 174 177 180 181 189 191 199
虚拟运营商:
170
2、免费查询地址
淘宝网((精确到省份)
API地址:
http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=手机号码(前七位可)
百度(精确到地市)
API地址:http://mobsec-dianhua.baidu.com/dianhua_api/open/location?tel=手机号码(前七位可)
我查询了比较多的资料,好用的就这两个API端口,
最主要的是免费,而且不限制访问次数,要知道我们查询所有号段的全部地区编码,全部的组合有40多万条
3、思路:拼接网址字符串,解析返回的数据,得到信息,由于还没全学会直接写入数据库,就先写出到txt文档,字段与字段用逗号分隔,用excel打开,方便导入数据库。
废话不多说上代码
访问网址解析json信息的方法
void calcultate(string ID)//ID是手机号
{
try
{
string ur1 = @"http://mobsec-dianhua.baidu.com/dianhua_api/open/location?tel=" + ID;
WebClient client = new WebClient();
client.Encoding = Encoding.UTF8;
string data = client.DownloadString(ur1);
string data3 = data.Substring(23, data.Length - 96);
Root rt = (Root)JsonConvert.DeserializeObject<Root>(data3);
Phone p = new Phone();
p.Pprovince = rt.detail.province;
p.Ptype = rt.detail.type;
p.Poperator = rt.location.Remove(0, rt.location.Length - 2);
p.Pcity = rt.location.Substring(rt.detail.province.Length, rt.location.Length - rt.detail.province.Length - 2);
p.state = ID.Substring(3, 4);
phones.Add(p);
}
catch
{
invalidNum.Add(ID);//无效号段也要保存下来
Console.WriteLine(ID + "号段无效");
}
//Console.WriteLine(rt.location +" "+ rt.detail.province+" "+rt.detail.type);
}
WebClient client = new WebClient();
client.Encoding = Encoding.UTF8;
string data = client.DownloadString(ur1);//data就是返回的字符串
这个地方我用的是百度API端口,因为精确到城市
我们先看一下百度API返回的结果
是JSON格式的
JSON官网的解释
http://www.json.org/json-zh.html
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
JSON建构于两种结构:
“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
JSON具有以下这些形式:
对象是一个无序的“‘名称/值’对”集合。一个对象以 {左括号 开始, }右括号 结束。每个“名称”后跟一个 :冒号 ;“‘名称/值’ 对”之间使用 ,逗号 分隔。
大概意思就是 { } 中间的是一个对象,[ ] 中间的是数组
然后来看我们这个数据
{"response":{"1586262":{"detail":{"area":[{"city":"苏州"}],"province":"江苏","type":"domestic","operator":"移动"},"location":"江苏苏州移动"}},"responseHeader":{"status":200,"time":1566550363938,"version":"1.1.0"}}
格式化一下,我滴个乖乖,
JSON嵌套JSON,
更要命的是有一对键是纯数字…………
对于初学json的我好难,上网查了很多方法,都不行,我只学会了解析一层json
只需要拿到的"city",“province”,"operator"这三个值就大功告成,只不过不会解析,正则表达式还不熟悉…………
看TaobaoAPI返回的就仁慈多了,可惜不够精确
注意一下解析json要添加这些引用,Newtonsoft.Json好像用的多一些,可以从NUGET管理包下载
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
或者//using LitJson;
下面来解析
我是实在搞不定这种多层嵌套又有纯数字的,所以就把源字符串截取了一下,只保留核心的字符串
用到这句代码
string data3 = data.Substring(23, data.Length - 96);
结果如下图,就好办多了
用于解析json的类,定义的名字一定要和json中的一致
class Root
{
public address detail{ get; set; }
public string location{ get; set; }
}
public class address
{
public string province{ get; set; }
public string type{ get; set; }
}
存放信息的类
public class Phone
{
public string Pprovince;
public string Pcity;
public string Poperator;
public string Ptype;
public string state;
}
Console.WriteLine("运行中……………………");
List<Phone> phones = new List<Phone>();
List<string> invalidNum= new List<string>();
string[] section = new string[] {"134","135","136","137","138","139","147","148","150","151","152","157","158","159","172","178","182","183","184","187","188","198",
"130","131","132","145","146","155","156","166","167","171","175","176","185","186",
"133","149","153","173","174","177","180","181","189","191","199",
"170" };
int id;
string Id;
for (int i = 0; i < 48; i++)
{
Console.WriteLine(section[i].ToString() + "网络段开始…………");
DateTime t1 = DateTime.Now;
phones.Clear();
for (int j = 0; j <9999; j++)
{
id = j + 10000;
Id = section[i] + id.ToString().Remove(0, 1);
calcultate(Id);
}
StreamWriter writer = new StreamWriter(section[i].ToString() + "区段" + "txtfile.txt");
foreach (var item in phones)
{
writer.WriteLine(section[i].ToString ()+"," +item.state+","+ item.Pprovince + "," + item.Pcity + "," + item.Ptype + "," + item.Poperator);
}
writer.Flush();
writer.Close();
DateTime t2 = DateTime.Now;
Console.WriteLine(section[i].ToString() + "区段完成,用时" + (t2 - t1));
}
StreamWriter writer1 = new StreamWriter("无效区段48" + "Invalidfile.txt");
foreach (var item in invalidNum)
{
writer1.WriteLine(item);
}
writer1.Flush();
writer1.Close();
运行即可
同时无效的字段通过其他的API进行查询,更新数据