亲手撸码,爬取 手机号码归属地最新数据(201911)
某天,某部门负责人小姐姐:要在订单中识别收货人手机号码归属地,这样可以参考判断该客户是否为恶意下单。
搬砖君:可以,有两种方案;
一、网上买个API接口(需要RMB支持);
二、找个手机归属地库(免费,有可能不是最新);
小姐姐:申请RMB,估计领导不会签字,那就免费的吧。
搬砖君:好吧,(此时心中一万个。。。(你们懂的));
于是某度搜索 手机号码归属地最新数据库 排名第一的居然是园子里的高手,瞬间兴奋起来,
打开链接看到 github ,心想这下不要去撸码找数据了。结果翻遍每个文件夹只有查询方法,却没有库。
再往下看原来库是有 购买 链接,还有升级链接。看来这路走不通了。
再翻了下某度的其它搜索结果,要么不最新,要么收费,要么就是登录需要积分下载。
心想去找个API接口把他的数据撸出来就好了。 继续某度 手机号码归属地查询API接口 ,
经过测试,比对,找了4个可用而且可信度比较高的。
开始撸码【抱歉,数据源和数据入库 画面请各位小伙伴自行脑补】:
private static List<string> MobileList = new List<string>(); // 中途中断后, 已经存在的手机号段列表 using (SqlConnection conn = new SqlConnection(ConStr)) { if (MobileList.Count == 0) { string temp_sql = $"SELECT [Mobile] From [App_Mobile_20191113]"; using (SqlCommand command = new SqlCommand(temp_sql, conn)) { command.CommandType = System.Data.CommandType.Text; if (conn.State == ConnectionState.Closed) conn.Open(); using (SqlDataReader dreader = command.ExecuteReader()) { while (dreader.Read()) { MobileList.Add(dreader[0].ToString()); } } } } }
一个号码段前三位一个线程
List<Task> taskList = new List<Task>(); TaskFactory taskFactory = new TaskFactory(); // 从手机前3位 130 开始 至 199 结束 for (int i = 130; i < 200; i++) { int mobile_no = i; taskList.Add(taskFactory.StartNew(() => { Console.WriteLine($"{mobile_no} = {Thread.CurrentThread.ManagedThreadId}"); Get(mobile_no); })); } Task.WaitAll(taskList.ToArray());
开始获取数据
static void Get(int start_no) { int start_mobile = int.Parse($"{start_no}0000"); int end_mobile = int.Parse($"{start_no}9999"); // 获取某开头下的所有号码段 如: 1300000 - 1309999 for (int i = start_mobile; i <= end_mobile; i++) { if (MobileList.Contains(i.ToString())) continue; //已经存在的号码 int code = new Random().Next(1000, 9999); // 随机手机号码最后4位 string mobile = $"{i}{code}"; //获取数据 【抱歉,数据来源画面请各位小伙伴自行脑补】 ModelMobile model = Get1(mobile); // 数据源1 if (!model.QueryResult || string.IsNullOrWhiteSpace(model.Province)) model = Get2(mobile); // 数据源2 if (!model.QueryResult || string.IsNullOrWhiteSpace(model.Province)) model = Get3(mobile); // 数据源3 if (!model.QueryResult || string.IsNullOrWhiteSpace(model.Province)) model = Get4(mobile); // 数据源4 //获取成功后入库【入库画面请各位小伙伴自行脑补】 if (model.QueryResult) { if (save_data(model)) Console.WriteLine($" {Thread.CurrentThread.ManagedThreadId}. Success \t{i} = {model.Province} {model.City} ({model.Corp}) [{model.Source}] ......"); else Console.WriteLine($" {Thread.CurrentThread.ManagedThreadId}. SaveFail \t{i} = {model.Province} {model.City} ({model.Corp}) [{model.Source}] ......"); } else Console.WriteLine($" {Thread.CurrentThread.ManagedThreadId}. Fail \t{i} = {model.Message} [{model.Source}] ......"); } }
运行效果:
爬完所有号段后,数据总 442245 条,比某度排第一园子里的高手还要多。
只要源数据正常,这库还可以一直正常升级。
撸码完成,敢快去通知小姐姐,已经可以正常调用了。