① 目标场景
平时在工作过程中,偶尔会需要大量的手机号码,去测试一些具体的业务功能,为了保证测试的有效性,手机号码的真实性尤为的重要。 那如何按要求批量生成一些真实的手机号码呢?本文就带大家利用 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) . contenttxt = 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) . textre_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)
④ 结论
通过上面的操作,就能按照自己的需求,批量生成一些真实有效的手机号码。 接下来,可以结合自动化操作,可以使得我们生成的数据价值最大化。