作为网优工程师,你是否也曾奢望手里有一份全国手机号码归属地对应表?学习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')