Python 幫你批量生成手機(jī)號碼
作者 |?星安果
來源 |?AirPython
閱讀文本大概需要 8 分鐘。
1
目 標(biāo) 場 景
平時在工作過程中,偶爾會需要大量的?手機(jī)號碼,去測試一些具體的業(yè)務(wù)功能,為了保證測試的有效性,手機(jī)號碼的?真實(shí)性?尤為的重要。
那如何按要求?批量生成?一些真實(shí)的手機(jī)號碼呢?
本篇文章的目的是帶大家利用 Python 批量生成手機(jī)號碼。
2
編 寫 代 碼
要批量生成手機(jī)號碼,首先需要了解 11 位手機(jī)號碼的組成規(guī)律,即:
手機(jī)號碼一共有 11 位,以 1 開頭
第 2 位的數(shù)值是 3、4、5、7、8 中的一個
第 3 位根據(jù)第 2 位的數(shù)字,對應(yīng)運(yùn)營商的生成規(guī)律
后 8 位是隨機(jī)生成的 8 個數(shù)字
知道手機(jī)號碼的組成規(guī)律后,接著把數(shù)字拼接起來,即可以生成一個手機(jī)號碼。
def?create_a_phone():
????#?第二位數(shù)字
????second?=?[3,?4,?5,?7,?8][random.randint(0,?4)]
????#?第三位數(shù)字
????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]
????#?最后八位數(shù)字
????suffix?=?random.randint(9999999,?100000000)
????#?拼接手機(jī)號
????return?"1{}{}{}".format(second,?third,?suffix)
由于三大運(yùn)營商的號段一直在更新變化,上面組成的手機(jī)號碼也有可能不是一個有效的號碼。
為了保證號碼的真實(shí)性,利用號碼去獲取?手機(jī)號碼歸屬地,如果能獲取到歸屬地,即代表為一個真實(shí)有效的號碼。

淘寶和百度都提供了查詢歸屬地的 API,可以非常方便的查詢號碼的歸屬地。
def?judge_phone_ava(phone):
????"""
????判斷手機(jī)號碼是否合理
????:param?phone:手機(jī)號碼
????: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
循環(huán)上面的操作,可以生成一些隨機(jī)的手機(jī)號碼,正因?yàn)樯商柎a的隨機(jī)性,使得數(shù)據(jù)的價值性大打折扣。
如果我需要批量生成指定城市的手機(jī)號碼,上面的這種方法沒法做到。幸運(yùn)地是,有一個網(wǎng)站(https://uutool.cn/phone-generate/)已經(jīng)實(shí)現(xiàn)了這個功能,我們只需要用 Python 模擬請求即可。

選擇手機(jī)號碼歸屬地、包含號段、數(shù)量,就能快速生成我們想要的手機(jī)號碼,按 F12 可以查看網(wǎng)絡(luò)請求方式及參數(shù)。

請求參數(shù)中的區(qū)域代碼對應(yīng)選擇的省+市區(qū),這部分?jǐn)?shù)據(jù)利用 JS 加載到頁面中了。

我們只需要解析網(wǎng)頁源代碼,利用正則表達(dá)式查找對應(yīng)的字符串,解析出?區(qū)域 ID 和城市名稱。
def?get_all_citys():
????"""
????獲取所有的城市數(shù)據(jù)
????: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)
????????#?citys.extend(current_citys)
????????for?item?in?current_citys:
????????????citys[item.get('name')]?=?item.get('id')
????return?citys
拿到城市名稱和區(qū)域 ID 的關(guān)系數(shù)據(jù)后,模擬網(wǎng)絡(luò)請求,即可以批量生成目標(biāo)城市的手機(jī)號碼。
citys?=?get_all_citys()
city_name = input('請輸入手機(jī)歸屬地:')
if?city_name?not?in?citys.keys():
?????city_name?=?'北京'
#?獲取城市id
city_id?=?citys.get(city_name)
phones?=?generate_phones(num,?city_id)
#?pass3
結(jié) 果 結(jié) 論
通過上面的操作,就能按照自己的需求,批量生成一些真實(shí)有效的手機(jī)號碼。
接下來,可以結(jié)合自動化操作,可以使得我們生成的數(shù)據(jù)價值最大化。
源碼地址:https://github.com/xingag/tools_python/tree/master/%E6%89%B9%E9%87%8F%E7%94%9F%E6%88%90%E6%89%8B%E6%9C%BA%E5%8F%B7%E7%A0%81
