作为网优工程师,你是否也曾奢望手里有一份全国手机号码归属地对应表?学习Python后,我的这一梦想可以实现了。 今天偶然看到了一个直接获取手机号码归属地的模块phone,今天咱们就来实战一下。 号码基本框架如下:
In [1]: import phone ...: ...: phoneNum = '1581339' ...: info = phone.Phone().find(phoneNum) ...: print(info) {'phone': '1581339', 'province': '广东', 'city': '广州', 'zip_code': '510000', 'area_code': '020', 'phone_type': '移动'}可以看到,核心代码只有一行,作者也太牛逼了,膜拜。 我们来仔细看看,输入信息是手机号码前7位的字符串格式,输出信息包含:手机号段、归属省份、归属城市、邮政编码,区号,运营商归属。格式为一个字典。 获取一个手机号段归属地的代码有了,接下来我们来看看如何获取多个号段的归属地呢? 我想到了range
In [2]: import phone ...: ...: for i in range(1581330, 1581339): ...: # 注意输入值要求是字符串 ...: info = phone.Phone().find(str(i)) ...: print(info) ...: {'phone': '1581330', 'province': '广东', 'city': '广州', 'zip_code': '510000', 'area_code': '020', 'phone_type': '移动'} {'phone': '1581331', 'province': '广东', 'city': '广州', 'zip_code': '510000', 'area_code': '020', 'phone_type': '移动'} {'phone': '1581332', 'province': '广东', 'city': '广州', 'zip_code': '510000', 'area_code': '020', 'phone_type': '移动'} {'phone': '1581333', 'province': '广东', 'city': '广州', 'zip_code': '510000', 'area_code': '020', 'phone_type': '移动'} {'phone': '1581334', 'province': '广东', 'city': '广州', 'zip_code': '510000', 'area_code': '020', 'phone_type': '移动'} {'phone': '1581335', 'province': '广东', 'city': '广州', 'zip_code': '510000', 'area_code': '020', 'phone_type': '移动'} {'phone': '1581336', 'province': '广东', 'city': '广州', 'zip_code': '510000', 'area_code': '020', 'phone_type': '移动'} {'phone': '1581337', 'province': '广东', 'city': '广州', 'zip_code': '510000', 'area_code': '020', 'phone_type': '移动'} {'phone': '1581338', 'province': '广东', 'city': '广州', 'zip_code': '510000', 'area_code': '020', 'phone_type': '移动'}使用range我们可以批量获取信息了,仔细观察结果,这个字典的key都是重复的,而且,字典也不方便用于后续处理,尝试将dict转换为list
In [3]: info.values() Out[3]: dict_values(['1581338', '广东', '广州', '510000', '020', '移动'])我们还想将查询结果存储到文件,我自然想到了pandas,将list转换为DataFrame,然后写入csv就可以了
In [4] : import phone ...: import pandas as pd ...: ...: ...: phone_list=[] ...: ...: for i in range(1581330,1581339): ...: info = phone.Phone().find(str(i)) ...: phone_list.append(info.values()) ...: ...: # 创建DataFranme,并设置列名 ...: df=pd.DataFrame(phone_list, columns = ['手机号段', '省份', '地市', '邮编', '区号', '运营商']) ...: df Out[4]: 手机号段 省份 地市 邮编 区号 运营商 0 1581330 广东 广州 510000 020 移动 1 1581331 广东 广州 510000 020 移动 2 1581332 广东 广州 510000 020 移动 3 1581333 广东 广州 510000 020 移动 4 1581334 广东 广州 510000 020 移动 5 1581335 广东 广州 510000 020 移动 6 1581336 广东 广州 510000 020 移动 7 1581337 广东 广州 510000 020 移动 8 1581338 广东 广州 510000 020 移动好像我们马上就成功了呀,我们再试试别的号段
In [5] : import phone ...: import pandas as pd ...: ...: ...: phone_list=[] ...: ...: for i in range(1300000,1300010): ...: info = phone.Phone().find(str(i)) ...: phone_list.append(info.values()) ...: ...: # 创建DataFranme,并设置列名 ...: df=pd.DataFrame(phone_list, columns = ['手机号段', '省份', '地市', '邮编', '区号', '运营商']) ...: df --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-16-a3119c124be5> in <module> 7 for i in range(1300000,1300010): 8 info = phone.Phone().find(str(i)) ----> 9 phone_list.append(info.values()) 10 11 # 创建DataFranme,并设置列名 AttributeError: 'NoneType' object has no attribute 'values'。。。报错了 什么原因呢?这是因为1300000号段不存在,怎么办呢,程序容错性太差了,不够健壮,我们要尝试加入容错机制
In [6] : import phone ...: import pandas as pd ...: ...: phone_list=[] ...: ...: for i in range(1300000,1300010): ...: try: ...: info = phone.Phone().find(str(i)) ...: phone_list.append(info.values()) ...: # 如果出错,退出本次循环 ...: continue ...: except(RuntimeError, TypeError, NameError, AttributeError): ...: # 出错后,直接跳过,不做任何处理 ...: pass ...: ...: df=pd.DataFrame(phone_list, columns = ['手机号段', '省份', '地市', '邮编', '区号', '运营商']) ...: df Out[6]: 手机号段 省份 地市 邮编 区号 运营商 0 1300001 江苏 常州 213000 0519 联通 1 1300002 安徽 合肥 230000 0551 联通 2 1300003 四川 宜宾 644000 0831 联通 3 1300004 四川 自贡 643000 0813 联通 4 1300005 陕西 西安 710000 029 联通 5 1300006 江苏 南京 210000 025 联通 6 1300007 陕西 西安 710000 029 联通 7 1300008 湖北 武汉 430000 027 联通 8 1300009 陕西 西安 710000 029 联通写入csv,文件中含有中文,注意将文件编码设置为gbk
In [29]: # 文件包含中文,将文件编码设置为gbk ...: df.to_csv('phone_list.csv', encoding='gbk')打开生成的文件,看到如下信息,这就是我梦寐以求的那张表 完整代码
import phone import pandas as pd phone_list=[] # 修改range范围即可获得1000万行归属地信息 for i in range(1300000,1300010): try: info = phone.Phone().find(str(i)) phone_list.append(info.values()) # 如果出错,退出本次循环 continue except(RuntimeError, TypeError, NameError, AttributeError): # 出错后,直接跳过,不做任何处理 pass df=pd.DataFrame(phone_list, columns = ['手机号段', '省份', '地市', '邮编', '区号', '运营商']) # 文件包含中文,将文件编码设置为gbk df.to_csv('phone_list.csv', encoding='gbk')想了解更多,扫码关注。
