12行代码获取1000万行手机号码归属地

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

想了解更多,扫码关注。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值