使用 API 和离线库查询 IP 地址方法详解
目录
- 一、IP 地址查询能获取哪些信息
- 1.地理位置信息
- 2.网络信息
- 3.网络类型
- 二、IP 地址查询方法,附代码
- 1.在线查询 IP 地址方法
- 2.使用 API 进行 IP 地址查询
- 3.使用离线库进行 IP 地址查询
互联网监管部门要求公开 IP 归属地,引起了很大热度,但作为平台或企业的开发者不能只凑个热闹,使用 IP 地址查询尤为重要。
IP 地址是实现网络互通的条件之一,通过查询 IP 地址,可获取地理位置、时区、经纬度、运营商等信息,为金融、电商、广告、网安行业提供流量分析、网络安全等技术支持。因为 IP 数据云查询的数据维度多,定位精准,所以下面以它为例,教大家如何进行 IP 地址查询。
一、IP 地址查询能获取哪些信息
1.地理位置信息
- 国家:IP 所属的国家或地区。
- 城市:IP 所在的城市或省份信息。
- 区县或街道:用高精准定位的产品,可以定位到街道
- 经纬度:IP 地址大致对应的地理坐标。
2.网络信息
- 互联网服务提供商(ISP):提供该 IP 地址的网络服务商。
- 自治系统编号(ASN):分配给 IP 地址段的自治系统编号,标识网络的运营商。
3.网络类型
- 数据中心 IP:区分 IP 是否属于家庭用户、商业用户或数据中心。
- 代理、Tor 节点:识别 IP 地址是否使用了虚拟专用网络、代理服务或 Tor 匿名网络。
开发者或企业可以根据业务需求,使用 IP 归属地、IP 应用场景、IP 风险画像产品等产品,或数据定制。
二、IP 地址查询方法,附代码
个人少量查询可选择在线查询,对企业或平台,需要大量的 IP 地址查询,建议使用 API 或离线库查询方式。
在线 IP 查询 | API 查询 | 离线库查询 | |
---|---|---|---|
更新频率 | 实时更新 | 实时更新 | 依赖于数据库更新频率,可选择日更、周更、月更等 |
批量查询 | 不能批量查询 | 支持大规模批量查询,取决于 API 服务的配额和限制 | 支持大规模批量查询,查询速度受限于本地硬件 |
网络 | 完全依赖网络,需要持续的网络连接 | 需要网络连接,API 调用需要访问外部服务器 | 不依赖网络,本地查询,不受网络状态影响 |
支持 IP 类型 | IPv4 和 IPv6 | IPv4 和 IPv6 | IPv4 和 IPv6 |
响应速度 | 受网络延迟和服务器负载影响 | 取决于 API 响应速度和网络状况 | 查询在本地进行,无网络延迟 |
操作复杂度 | 简单,适合非技术人员使用 | 需要一定开发集成和配置,但可自动化 | 需要下载、部署数据库文件和编写查询脚本 |
适用场景 | 少量查询、个人或临时使用 | 批量查询、企业级应用、广告验证、用户分析等场景 | 大规模数据处理、网络优化、流量调度等场景 |
1.在线查询 IP 地址方法
查询地址:https://www.ip66.net/?utm-source=kol&utm-keyword=?2753
直接输入 IP 地址,根据套餐返回相应的结果,每日可免费查询
2.使用 API 进行 IP 地址查询
【https://www.ipdatacloud.com/?utm-source=kol&utm-keyword=?2752】
首先根据需求购买数据后,获取 api 接口的 key
接口地址:https://api.ipdatacloud.com
请求说明:
请求方法(java 示例代码):
public static void main(String[] args) throws IOException, InterruptedException {
String urlArr = "https://api.ipdatacloud.com/v2/query?ip=&key=";
HttpClient httpClient = HttpClient.newBuilder().build();
HttpRequest getRequest = HttpRequest.newBuilder()
.GET()
.uri(URI.create(urlArr))
.build();
// 发送GET请求并获取响应
HttpResponse<String> resp = httpClient.send(getRequest, HttpResponse.BodyHandlers.ofString());
//对返回的json数据做解析
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(resp.body());
String data = rootNode.get("data").get("location").asText();
Location location = objectMapper.readValue(data, Location.class);
System.out.println(location.toString());
}
输出说明:
3.使用离线库进行 IP 地址查询
在需要大规模查询或高效访问时,可以考虑使用本地缓存或 IP 离线库。这种方式可以在本地处理查询请求,减少对外部 API 的依赖
首先获取 IP 离线库【https://www.ipdatacloud.com/?utm-source=kol&utm-keyword=?2752】,以下是查询java代码示例(内存版):
package com.ipdatacloud.search;import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
/*
getInstanceFileIpv4() ipv4文件版查询
getInstanceFileIpv6() ipv6文件版查询
getInstanceMemIpv4() ipv4内存版查询
getInstanceMemIpv6() ipv6内存版查询
*/
// 1.实例化查询类
Search finder = Search.getInstanceMemIpv4("file_path");
// 2.执行查询
String res = finder.get("ip_address");
// 3.解析查询结果
Location location = new Location(res);
System.out.println(location.getContinent()); // 大洲
System.out.println(location.getCountry()); // 国家
System.out.println(location.getProvince()); // 省份
System.out.println(location.getCity()); // 城市
System.out.println(location.getDistrict()); // 区县
System.out.println(location.getIsp()); // 运营商
System.out.println(location.getAreaCode()); // 区域代码
System.out.println(location.getCountryEnglish()); // 国家/地区英文
System.out.println(location.getCountryCode()); // 国家/地区英文简写
System.out.println(location.getLongitude()); // 经度
System.out.println(location.getLatitude()); // 纬度
System.out.println(location.getElevation()); // 海拔
System.out.println(location.getZipCode()); // 邮编
System.out.println(location.getCityCode()); // 城市代码
System.out.println(location.getWeatherStation()); // 气象站
System.out.println(location.getAsn()); // ASN码
System.out.println(location.getPreserve()); // 预留
System.out.println(location.getStreet()); // 街道
System.out.println(location.getTimeZone()); // 时区
}
}