您现在的位置是:首页 > 编程语言学习 > 其他编程语言 > 文章正文 其他编程语言

Python如何实现号码归属地查询功能

2022-12-30 13:25:03 其他编程语言

简介这篇文章主要为大家详细介绍了如何利用Python实现对手机号码进行地域分析并查询归属地的功能,感兴趣的小伙伴可以跟随小编一起学习一下!使...

这篇文章主要为大家详细介绍了如何利用Python实现对手机号码进行地域分析并查询归属地的功能,感兴趣的小伙伴可以跟随小编一起学习一下!

使用场景

对手机号码进行地域分析,需要查询归属地;

问题描述

针对数据集比较大的情况,通过脚本来处理,使用多线程的方法来加快查询速度

  1. pool = multiprocessing.Pool(processes=pool_count) 
  2. for i in data_cut(data,pool_count): 
  3. data_log_list.append(pool.apply_async(main, (i,))) 
  4. pool.close() 
  5. pool.join() 

解决方案

创建一个 pool 进程池,然后通过data_cut将数据读取并且等分成数据组,设置好pool_count进程数量就可以开始,每个数据组独立查询然后将结果汇总给push_log进行最终处理,保存为csv文件。

  1. # 电话号码归属地查询 
  2.  
  3. import os 
  4. import sys 
  5. import time 
  6. import json 
  7. import warnings 
  8. import pandas as pd 
  9. import multiprocessing 
  10. from phone import Phone 
  11. warnings.filterwarnings("ignore"
  12. path = os.path.abspath("."
  13.  
  14. def data_cut(data_list,data_cut=4): 
  15. #将任务拆分,建议拆分数为CPU核心数,默认为4 
  16. #分组数据,分组间隔 
  17. data_all=[] 
  18. if data_cut > len(data_list): 
  19. data_cut = len(data_list) 
  20. data_cut_num = int((len(data_list)+1)/data_cut) 
  21. for i in range(1,data_cut+1): 
  22. if i < data_cut: 
  23. data_1=data_list[data_cut_num*(i-1):data_cut_num*i] 
  24. else
  25. data_1=data_list[data_cut_num*(i-1):] 
  26. data_all.append(data_1) 
  27. return data_all 
  28.  
  29. def push_log(data_log_list,file_name): 
  30. data_all = [] 
  31. data_list = [i.get() for i in data_log_list] 
  32. for i in data_list: 
  33. for j in i: 
  34. data_all.append(j) 
  35. data_all = pd.DataFrame(data_all) 
  36. data_all.to_csv(path + "/phone_{}.csv".format(file_name),index=False,encoding='gbk'
  37.  
  38. print('成功查询:',data_all.shape[0]) 
  39.  
  40. def main(data): 
  41. resp = [] 
  42. for i in data: 
  43. try
  44. if type(Phone().find(i)) == dict: 
  45. resp.append(Phone().find(i)) 
  46. except: 
  47. pass 
  48. return resp 
  49.  
  50. if __name__ == '__main__'
  51. start_time= time.time() 
  52. file_name = name = sys.argv[1] 
  53. data = pd.read_table(path + "/{}".format(file_name),header=None) 
  54. data=list(data[0]) 
  55. pool_count = 12 
  56. data_log_list = [] 
  57. pool = multiprocessing.Pool(processes=pool_count) 
  58. for i in data_cut(data,pool_count): 
  59. data_log_list.append(pool.apply_async(main, (i,))) 
  60. pool.close() 
  61. pool.join() 
  62.  
  63. push_log(data_log_list,file_name) 
  64. print(time.time()-start_time) 

方法补充

除了上文的方法,小编还为大家整理了一些其他Python号码归属地查询的方法,需要的可以参考一下

方法一:

  1. import requests 
  2.  
  3. def get_callerloc(phone): 
  4. url = f"https://www.qvdv.com/tools/qvdv-api-mobile.html?f=json&mobile={phone}" 
  5. headers = { 
  6. 'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36'
  7. response = requests.request("GET", url, headers=headers).json() 
  8. return response["message"
  9.  
  10. if __name__ == '__main__'
  11. phone = input("请输入手机号(查询归属地):"
  12. res = get_callerloc(phone) 
  13. print("手机号码:"+res["mobile"]) 
  14. print("归属地:"+res["province"]) 
  15. print("运营商:"+res["supplier"]) 

截图

方法二

GUI

  1. from tkinter import * 
  2. from tkinter import ttk 
  3. from tkinter import messagebox 
  4. from Get_Attr import Get_Infos 
  5. import re 
  6. import threading 
  7. class App: 
  8. def __init__(self): 
  9. self.root=Tk() 
  10. self.root.title('手机号码归属地查询-v1.0'
  11. self.root.resizable(0,0) 
  12. width=410 
  13. height=390 
  14. left=(self.root.winfo_screenwidth()-width)/2 
  15. top=(self.root.winfo_screenheight()-height)/2 
  16. self.root.geometry('%dx%d+%d+%d'%(width,height,left,top)) 
  17. self.create_widet() 
  18. self.set_widget() 
  19. self.place_widget() 
  20. self.root.mainloop() 
  21. def create_widet(self): 
  22. self.l1=ttk.Label(self.root) 
  23. self.e1=ttk.Entry(self.root) 
  24. self.b1=ttk.Button(self.root) 
  25. self.lf=ttk.LabelFrame(self.root) 
  26. self.l2=ttk.Label(self.lf) 
  27. self.e2=ttk.Entry(self.lf) 
  28. self.l3=ttk.Label(self.lf) 
  29. self.e3=ttk.Entry(self.lf) 
  30. self.l4=ttk.Label(self.lf) 
  31. self.e4=ttk.Entry(self.lf) 
  32. self.l5=ttk.Label(self.lf) 
  33. self.e5=ttk.Entry(self.lf) 
  34. self.l6=ttk.Label(self.lf) 
  35. self.e6=ttk.Entry(self.lf) 
  36. self.l7=ttk.Label(self.lf) 
  37. self.e7=ttk.Entry(self.lf) 
  38. self.b1.config(command=lambda:self.thread_it(self.search_infos)) 
  39. def set_widget(self): 
  40. self.e2_var=StringVar() 
  41. self.e3_var=StringVar() 
  42. self.e4_var=StringVar() 
  43. self.e5_var=StringVar() 
  44. self.e6_var=StringVar() 
  45. self.e7_var=StringVar() 
  46. self.l1.config(text='请输入手机号:'
  47. self.b1.config(text='查询'
  48. self.lf.config(text='查询结果'
  49. self.l2.config(text='手机号码:'
  50. self.l3.config(text='所属省份:'
  51. self.l4.config(text='所属城市:'
  52. self.l5.config(text='区   号:'
  53. self.l6.config(text='邮   编:'
  54. self.l7.config(text='类   型:'
  55. #将字符串变量绑定Entry组件 
  56. self.e2.config(textvariable=self.e2_var) 
  57. self.e3.config(textvariable=self.e3_var) 
  58. self.e4.config(textvariable=self.e4_var) 
  59. self.e5.config(textvariable=self.e5_var) 
  60. self.e6.config(textvariable=self.e6_var) 
  61. self.e7.config(textvariable=self.e7_var) 
  62. self.root.bind('<Escape>',self.escape) 
  63. self.root.bind('<Return>',self.do_search) 
  64. def place_widget(self): 
  65. self.l1.place(x=30,y=20) 
  66. self.e1.place(x=130,y=20) 
  67. self.b1.place(x=290,y=20) 
  68. self.lf.place(x=30,y=60,width=350,height=300) 
  69. self.l2.place(x=60,y=10) 
  70. self.e2.place(x=150,y=10) 
  71. self.l3.place(x=60,y=50) 
  72. self.e3.place(x=150,y=50) 
  73. self.l4.place(x=60,y=90) 
  74. self.e4.place(x=150,y=90) 
  75. self.l5.place(x=60,y=130) 
  76. self.e5.place(x=150,y=130) 
  77. self.l6.place(x=60,y=170) 
  78. self.e6.place(x=150,y=170) 
  79. self.l7.place(x=60,y=210) 
  80. self.e7.place(x=150,y=210) 
  81. def search_infos(self): 
  82. pn=self.e1.get() 
  83. #判断输入类型,必须为11位数字 
  84. if re.match('\d{11}',pn): 
  85. result=Get_Infos().get_infos(pn) 
  86. self.e2_var.set(pn) 
  87. self.e3_var.set(result['province']) 
  88. self.e4_var.set(result['city']) 
  89. self.e5_var.set(result['areacode']) 
  90. self.e6_var.set(result['zip']) 
  91. self.e7_var.set(result['company']) 
  92. else
  93. messagebox.showwarning('警告','输入有误,请检查!'
  94. #使用线程防止UI界面卡死 
  95. def thread_it(self,func,*args): 
  96. t=threading.Thread(target=func,args=args) 
  97. t.setDaemon(True) 
  98. t.start() 
  99. def escape(self,event): 
  100. self.root.destroy() 
  101. def do_search(self,event): 
  102. self.thread_it(self.search_infos()) 
  103. if __name__ == '__main__'
  104. a=App() 
  105. Get_Attr 
  106.  
  107. import json 
  108. import requests 
  109. from urllib.parse import urlencode 
  110. class Get_Infos(): 
  111. def __init__(self): 
  112. self.url='http://apis.juhe.cn/mobile/get?' 
  113. self.headers={ 
  114. 'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36' 
  115. def get_infos(self,phone_num): 
  116. params={ 
  117. 'phone':phone_num, 
  118. 'key':'7a2b367a62fa24108b1f27ed4c84c97a'
  119. 'dtype':'' 
  120. r=requests.get(self.url+urlencode(params),headers=self.headers) 
  121. _json=json.loads(r.text) 
  122. if _json.get('resultcode')=='200'
  123. result=_json.get('result'
  124. item={} 
  125. item['province']=result.get('province'
  126. item['city']=result.get('city'
  127. item['areacode']=result.get('areacode'
  128. item['zip']=result.get('zip'
  129. item['company']=result.get('company'
  130. return item 
  131. else
  132. return False 

 

站点信息