① 目标场景
平时在工作过程中,偶尔会需要大量的手机号码,去测试一些具体的业务功能,为了保证测试的有效性,手机号码的真实性尤为的重要。 那如何按要求批量生成一些真实的手机号码呢?本文就带大家利用 Python 批量生成手机号码。
② 编写代码生成手机号码
要批量生成手机号码,首先需要了解 11 位手机号码的组成规律,即:
第 2 位的数值是 3、4、5、7、8 中的一个;
第 3 位根据第 2 位的数字,对应运营商的生成规律;
知道手机号码的组成规律后,接着把数字拼接起来,即可以生成一个手机号码。
def create_a_phone ( ) :
second = [ 3 , 4 , 5 , 7 , 8 ] [ random. randint( 0 , 4 ) ]
third = { 3 : random. randint( 0 , 9 ) ,
4 : [ 5 , 7 , 9 ] [ random. randint( 0 , 2 ) ] ,
5 : [ i for i in range ( 10 ) if i != 4 ] [ random. randint( 0 , 8 ) ] ,
7 : [ i for i in range ( 10 ) if i not in [ 4 , 9 ] ] [ random. randint( 0 , 7 ) ] ,
8 : random. randint( 0 , 9 ) , } [ second]
suffix = random. randint( 9999999 , 100000000 )
return "1{}{}{}" . format ( second, third, suffix)
由于三大运营商的号段一直在更新变化,上面组成的手机号码也有可能不是一个有效的号码。 为了保证号码的真实性,利用号码去获取手机号码归属地,如果能获取到归属地,即代表为一个真实有效的号码。
淘宝和百度都提供了查询归属地的 API,可以非常方便的查询号码的归属地:
def judge_phone_ava ( phone) :
"""
判断手机号码是否合理
:param phone:手机号码
:return:
"""
resp_content = requests. get( 'http://mobsec-dianhua.baidu.com/dianhua_api/open/location?tel=%s' % phone) . content
txt = json. loads( resp_content)
result = txt. get( 'response' ) . get( phone)
return result
循环上面的操作,可以生成一些随机的手机号码,正因为生成号码的随机性,使得数据的价值性大打折扣。
③ 生成指定城市的手机号码
如果需要批量生成指定城市的手机号码,上面的这种方法没法做到。幸运地是,有一个网站已经实现了这个功能,只需要用 Python 模拟请求即可:
选择手机号码归属地、包含号段、数量,就能快速生成想要的手机号码,按 F12 可以查看网络请求方式及参数:
请求参数中的区域代码对应选择的省+市区,这部分数据利用 JS 加载到页面中:
只需要解析网页源代码,利用正则表达式查找对应的字符串,解析出区域 ID 和城市名称:
def get_all_citys ( ) :
"""
获取所有的城市数据
:return:
"""
headers = {
'authority' : 'uutool.cn' ,
'pragma' : 'no-cache' ,
'cache-control' : 'no-cache' ,
'upgrade-insecure-requests' : '1' ,
'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36' ,
'sec-fetch-user' : '?1' ,
'accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' ,
'sec-fetch-site' : 'none' ,
'sec-fetch-mode' : 'navigate' ,
'accept-encoding' : 'gzip, deflate, br' ,
'accept-language' : 'zh-CN,zh;q=0.9,en;q=0.8' ,
'cookie' : 'UM_distinctid=16f759fe6bd24b-0322efd0d180d8-1d376b5b-1aeaa0-16f759fe6beb69; CNZZDATA1275106188=191793625-1578225029-https%253A%252F%252Fwww.google.com%252F%7C1578316721' ,
}
resp = requests. get( 'https://uutool.cn/phone-generate/' , headers= headers) . text
re_rule = r'areaArr:(.+?)segmentArr:'
result_data = re. findall( re_rule, resp, re. S) [ 0 ] . strip( ) [ : - 1 ]
result = json. loads( result_data)
provices = result. keys( )
citys = { }
for provice in provices:
current_citys = result. get( provice)
for item in current_citys:
citys[ item. get( 'name' ) ] = item. get( 'id' )
return citys
拿到城市名称和区域 ID 的关系数据后,模拟网络请求,即可以批量生成目标城市的手机号码:
citys = get_all_citys( )
city_name = input ( '请输入手机归属地:' )
if city_name not in citys. keys( ) :
city_name = '北京'
city_id = citys. get( city_name)
phones = generate_phones( num, city_id)
④ 结论
通过上面的操作,就能按照自己的需求,批量生成一些真实有效的手机号码。 接下来,可以结合自动化操作,可以使得我们生成的数据价值最大化。