某天,某部門負責人小姐姐:要在訂單中識別收貨人手機號碼歸屬地,這樣能夠參考判斷該客戶是否爲惡意下單。
搬磚君:能夠,有兩種方案;
1、網上買個API接口(須要RMB支持);
2、找個手機歸屬地庫(免費,有可能不是最新);
小姐姐:申請RMB,估計領導不會簽字,那就免費的吧。
搬磚君:好吧,(此時心中一萬個。。。(大家懂的));git
因而某度搜索 手機號碼歸屬地最新數據庫 排名第一的竟然是園子裏的高手,瞬間興奮起來,github
打開連接看到 github ,心想這下不要去擼碼找數據了。結果翻遍每一個文件夾只有查詢方法,卻沒有庫。
再往下看原來庫是有 購買 連接,還有升級連接。看來這路走不通了。sql
再翻了下某度的其它搜索結果,要麼不最新,要麼收費,要麼就是登陸須要積分下載。
心想去找個API接口把他的數據擼出來就行了。 繼續某度 手機號碼歸屬地查詢API接口 ,
通過測試,比對,找了4個可用並且可信度比較高的。數據庫
開始擼碼【抱歉,數據源和數據入庫 畫面請各位小夥伴自行腦補】:dom
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());
開始獲取數據spa
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 條,比某度排第一園子裏的高手還要多。3d
只要源數據正常,這庫還能夠一直正常升級。
擼碼完成,敢快去通知小姐姐,已經能夠正常調用了。code