手机号码归属地查询一般可以通过以下几种方式实现:
1. 使用公开的号码归属地数据库
- 可以使用国内的手机号码归属地数据库,如:
- 百度号码归属地开放API
- 阿里云号码归属地API
- 腾讯号码归属地API
- 你可以在本地存储一个 CSV 或 SQLite 数据库,定期更新,查询时直接匹配。
2. 调用第三方API
许多服务商提供号码归属地查询 API,例如:
https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=手机号
https://api.vvhan.com/api/phone?tel=手机号
https://mobsec-dianhua.baidu.com/dianhua_api/open/location?tel=手机号
示例代码(Python 调用 API):
import requestsdef get_phone_location(phone_number):url = f"https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel={phone_number}"response = requests.get(url)response.encoding = 'gbk' # 该接口返回的是 GBK 编码return response.textphone_number = "13800138000"
print(get_phone_location(phone_number))
3. 基于正则和号段匹配
- 手机号码前三位(如
138
)代表号段,前七位(如1380013
)用于进一步归属地区分。 - 你可以使用已知的号段数据进行匹配。
示例代码(本地匹配号段库):
import json# 假设有一个JSON数据库
phone_data = {"1380013": {"province": "北京", "city": "北京", "isp": "中国移动"},"1590000": {"province": "广东", "city": "广州", "isp": "中国联通"}
}def lookup_phone(phone_number):prefix = phone_number[:7] # 取前7位return phone_data.get(prefix, "未知")print(lookup_phone("13800138000"))
4. 使用Python的 phonenumbers
库(适用于国际号码)
import phonenumbers
from phonenumbers import geocoderphone_number = phonenumbers.parse("+8613800138000", "CN")
location = geocoder.description_for_number(phone_number, "zh")
print(location) # 输出:北京
如果你需要更准确的数据,建议使用第三方API或定期更新本地数据库。
在不联网的情况下,要查手机号码归属地,需要依赖已知的号码段数据,因为手机号码的前三位决定了运营商,前七位可以进一步确定归属地。你可以使用本地数据库或静态规则进行查询。
1. 号码分配规律
- 手机号码的 前三位(如
138
)代表 运营商。 - 前七位(如
1380013
)可以确定到具体的省市。
国内三大运营商号段(部分)
运营商 | 号段(前三位) |
---|---|
中国移动 | 134, 135, 136, 137, 138, 139, 147, 150, 151, 152, 157, 158, 159, 165, 1703, 1705, 178, 182, 183, 184, 187, 188 |
中国联通 | 130, 131, 132, 145, 155, 156, 166, 1704, 175, 176, 185, 186 |
中国电信 | 133, 149, 153, 173, 177, 180, 181, 189, 191, 199 |
2. 本地存储号码段
可以使用 SQLite、JSON 或 CSV 存储号码段信息,并在本地查询。
示例数据(JSON 格式)
{"1380013": {"province": "北京", "city": "北京", "isp": "中国移动"},"1590000": {"province": "广东", "city": "广州", "isp": "中国联通"},"1801234": {"province": "上海", "city": "上海", "isp": "中国电信"}
}
3. 纯 Python 实现(本地查询归属地)
import json# 本地号码段数据库(可存储为 JSON 文件)
phone_data = {"1380013": {"province": "北京", "city": "北京", "isp": "中国移动"},"1590000": {"province": "广东", "city": "广州", "isp": "中国联通"},"1801234": {"province": "上海", "city": "上海", "isp": "中国电信"}
}def lookup_phone(phone_number):"""查询手机号码归属地"""prefix = phone_number[:7] # 获取前7位return phone_data.get(prefix, {"province": "未知", "city": "未知", "isp": "未知"})# 测试
phone_number = "13800138000"
result = lookup_phone(phone_number)
print(f"号码: {phone_number} 归属地: {result['province']} {result['city']} 运营商: {result['isp']}")
输出示例:
号码: 13800138000 归属地: 北京 北京 运营商: 中国移动
4. 使用 SQLite 存储并查询
如果号码库较大,建议使用 SQLite,它既是本地存储,又支持高效查询。
(1) 创建 SQLite 数据库
import sqlite3# 连接数据库
conn = sqlite3.connect("phone_location.db")
cursor = conn.cursor()# 创建表
cursor.execute("""
CREATE TABLE IF NOT EXISTS phone_data (prefix TEXT PRIMARY KEY,province TEXT,city TEXT,isp TEXT
)
""")# 插入数据(示例)
data = [("1380013", "北京", "北京", "中国移动"),("1590000", "广东", "广州", "中国联通"),("1801234", "上海", "上海", "中国电信")
]
cursor.executemany("INSERT OR REPLACE INTO phone_data VALUES (?, ?, ?, ?)", data)
conn.commit()
conn.close()
(2) 查询号码归属地
import sqlite3def lookup_phone(phone_number):"""查询 SQLite 号码库"""prefix = phone_number[:7] # 取前7位conn = sqlite3.connect("phone_location.db")cursor = conn.cursor()cursor.execute("SELECT province, city, isp FROM phone_data WHERE prefix = ?", (prefix,))result = cursor.fetchone()conn.close()if result:return {"province": result[0], "city": result[1], "isp": result[2]}else:return {"province": "未知", "city": "未知", "isp": "未知"}# 测试查询
phone_number = "13800138000"
result = lookup_phone(phone_number)
print(f"号码: {phone_number} 归属地: {result['province']} {result['city']} 运营商: {result['isp']}")
总结
- 匹配规律: 通过 前三位 确定运营商,前七位 确定省市。
- 本地存储数据: 号码归属地数据可以存成 JSON、CSV 或 SQLite 并查询。
- SQLite 查询效率高,适用于大数据量存储。
- 完全离线,无需联网,速度快。
如果你需要完整的号码归属地数据库,可以定期从网上下载最新的数据,导入 SQLite 或 JSON 文件,实现本地查询。