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