Python 实现手机号归属地查询工具
引言
在网络安全、用户验证及数据分析场景中,获取手机号码的归属地信息是一项常见需求。通过 Python 编写脚本,可以自动化完成这一查询过程,提高处理效率。本文将详细介绍如何利用 Python 第三方库实现手机号归属地查询,并结合 IP 地址查询功能,构建一个完整的命令行工具。
本文介绍了如何使用 Python 第三方库 phone 实现手机号归属地查询功能。文章涵盖了环境搭建、库的安装与验证、核心代码实现(包括输入校验、异常处理)、命令行参数解析(argparse)以及 IP 地址查询的集成方法。此外,还提供了批量查询、结果持久化等高级用法,并补充了隐私合规注意事项和常见问题排查指南。通过模块化设计,该方案可轻松扩展为完整的命令行工具,适用于日常数据处理和安全分析场景。

在网络安全、用户验证及数据分析场景中,获取手机号码的归属地信息是一项常见需求。通过 Python 编写脚本,可以自动化完成这一查询过程,提高处理效率。本文将详细介绍如何利用 Python 第三方库实现手机号归属地查询,并结合 IP 地址查询功能,构建一个完整的命令行工具。
确保已安装 Python 3.6 及以上版本。使用 pip 包管理器安装所需的依赖库。在终端或命令行中执行以下命令:
pip install phone
注意:部分库可能需要特定版本的 Python 支持,建议在使用前查阅官方文档。如果遇到安装失败,请尝试升级 pip 或使用国内镜像源:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple phone
本方案主要使用 phone 库。该库封装了手机号段解析逻辑,能够根据号码前七位匹配运营商和归属地信息。其内部通常维护了一个本地的号段数据库,查询速度较快且无需联网调用外部 API。
安装完成后,可以通过以下简单代码验证库是否正常工作:
from phone import Phone
p = Phone()
result = p.find("13800138000")
print(result)
如果输出包含归属地信息,则说明安装成功。若报错,请检查 Python 版本兼容性。
为了构建一个实用的工具,我们需要完善输入验证、错误处理以及命令行参数解析。
封装查询逻辑,增加异常捕获,防止因非法号码导致程序崩溃。同时优化返回数据结构,便于后续处理。
from phone import Phone
class PhoneUtil:
def __init__(self):
try:
self.phone_obj = Phone()
except Exception as e:
print(f"初始化失败:{e}")
self.phone_obj = None
def parse_phone_num(self, phone_num: str) -> dict:
"""
解析手机号归属地
:param phone_num: 11 位手机号码字符串
:return: 包含归属地信息的字典,失败返回空字典
"""
if not phone_num or len(phone_num) != 11:
return {"error": "Invalid phone number format", "code": 400}
# 简单的数字格式校验
if not phone_num.isdigit():
return {"error": "Phone number must contain only digits", "code": 400}
try:
if self.phone_obj:
result = self.phone_obj.find(phone_num)
return {"success": True, "data": result}
else:
return {"error": "Library not initialized", "code": 500}
except Exception as e:
return {"error": str(e), "code": 500}
虽然本文重点在于手机号,但实际工具常需结合 IP 查询。此处展示如何预留接口并整合。在实际项目中,可接入 ip2region 或其他 IP 库。
def get_ip_region(ip: str) -> dict:
"""
模拟 IP 归属地查询函数
实际项目中可接入 xdb 或其他 IP 库
"""
import re
# 简单的 IP 格式校验
pattern = r'^(\d{1,3}\.){3}\d{1,3}$'
if not re.match(pattern, ip):
return {"error": "Invalid IP address format", "code": 400}
# 这里仅为示例结构,具体实现需依赖 ip2region 等库
# 假设我们有一个本地数据库文件
return {"ip": ip, "location": "Unknown Region", "code": 200}
使用 argparse 模块提供友好的 CLI 交互界面。支持互斥组,确保用户只能选择一种查询方式。
import argparse
import sys
def main():
parser = argparse.ArgumentParser(description='通过电话号码或 IP 地址查询归属地信息')
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('-p', dest='phone', help='通过电话号码查询归属地')
group.add_argument('-i', dest='ip', help='通过 IP 地址查询归属地')
args = parser.parse_args()
if args.phone:
util = PhoneUtil()
info = util.parse_phone_num(args.phone)
print(f'{args.phone}: {info}')
elif args.ip:
info = get_ip_region(args.ip)
print(f'{args.ip}: {info}')
if __name__ == '__main__':
main()
在实际业务中,往往需要处理大量数据。可以将上述逻辑封装为类,支持从文件读取列表进行批量处理。
def batch_query(filename: str):
with open(filename, 'r', encoding='utf-8') as f:
lines = f.readlines()
for line in lines:
phone = line.strip()
if phone:
util = PhoneUtil()
info = util.parse_phone_num(phone)
print(f'{phone}: {info}')
查询结果可保存至 CSV 或 JSON 文件,便于后续分析。
import json
import csv
def save_to_json(data, filename='result.json'):
with open(filename, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
def save_to_csv(data_list, filename='result.csv'):
with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.DictWriter(f, fieldnames=data_list[0].keys())
writer.writeheader()
writer.writerows(data_list)
原因:未正确安装库或 Python 环境冲突。
解决:重新运行 pip install phone,确认当前使用的 Python 解释器路径正确。
原因:号码不在数据库中或格式不正确。 解决:检查号码是否为 11 位纯数字,尝试更换其他号码测试。
原因:未配置 IP 数据库文件。 解决:下载对应的 ip2region.xdb 文件并配置到代码路径中。
通过 Python 的 phone 库,我们可以快速构建手机号归属地查询工具。结合 argparse 实现命令行交互,该方案轻量且易于集成到其他系统中。对于更复杂的场景,建议结合专业的 IP 地理位置数据库服务以获得更精准的结果。开发者应根据实际需求调整代码结构,确保系统的稳定性和安全性。
一个完整的工具应包含以下文件结构:
project/
├── main.py # 主入口
├── phone_util.py # 手机号处理逻辑
├── ip_util.py # IP 处理逻辑
├── utils.py # 通用工具函数
└── requirements.txt # 依赖列表
这种模块化设计有助于后期维护和功能扩展。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online