厉害!Python竟知道你的手机号归属~只用10行代码!

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值