Kiểm tra độ chính xác của dịch vụ định vị địa lý IP bằng proxy xoay
22 tháng 9, 2026
Giới thiệu
Trong nhiều trường hợp ứng dụng – từ quảng cáo Geo‑targeted, kiểm soát nội dung theo khu vực, đến phát hiện gian dựa trên vị trí – độ chính xác của dịch vụ định vị địa lý IP đóng vai trò then chốt. Sai số chỉ vài kilomet có thể dẫn đến việc hiển thị quảng cáo sai đối tượng, chặn truy cập không công bằng hoặc vi phạm quy định về dữ liệu residencia. Bài viết này cung cấp một quy trình chi tiết,実用 để kiểm tra độ chính xác của các dịch vụ như ipinfo.io, ip-api.com, MaxMind GeoIP2 bằng cách sử dụng proxy xoay residential. Quá trình bao gồm lấy danh sách proxy từ nhiều quốc gia, gửi request qua mỗi proxy, so sánh vị trí trả về với tọa độ thực tế và tính toán sai số trung bình.
Tại sao cần kiểm tra độ chính xác IP geolocation?
- Tối ưu quảng cáo: Quảng cáo chỉ hiển thị đúng khi vị trí IP được xác định chính xác.
- Tuân thủ pháp luật: Một số quy định (GDPR, CCPA) yêu cầu giới hạn truy cập dựa trên vị trí géographique; sai số có thể dẫn đến vi phạm.
- Phát hiện gian: Hệ thống chống gian thường dựa trên IP để phát hiện login từ vị trí lạ; nếu dịch vụ sai vị trí, có thể gây ra false positive hoặc false negative.
- Phân tích lưu lượng: Các công cụ аналитики phụ thuộc vào dữ liệu địa lý để phân khúc người dùng; sai số làm méo lệch kết quả.
Chuẩn bị môi trường và công cụ
- Ngôn ngữ: Python 3.9+ (có thể chuyển sang Node.js nếu muốn).
- Thư viện:
requestshoặchttpxđể làm việc với proxy,geopyđể tính khoảng cách haversine,pandasđể lưu trữ kết quả,tenacityđể retry. - Dịch vụ kiểm tra: Chọn một hoặc nhiều endpoint công khai trả về JSON chứa latitude, longitude, country, city (ví dụ:
https://ipinfo.io/json,http://ip-api.com/json). - Danh sách proxy: Mua hoặc thuê proxy residential từ các nhà cung cấp như RoProxy, Luminati, Oxylabs. Đảm bảo có ít nhất 5‑10 proxy từ mỗi quốc gia bạn muốn kiểm tra.
- File cấu hình:
proxies.txtchứa một proxy per line under formathttp://user:pass@host:port(hoặcsocks5://nếu cần).
Thu thập danh sách proxy xoay
Proxy xoay nghĩa là mỗi request có thể sử dụng một IP khác nhau từ pool. Để mô phỏng tình trạng thực tế, chúng ta sẽ xoay ngẫu nhiên sau mỗi request hoặc sau một_batch cố định (ví dụ 10 request).
import random
def load_proxies(path: str) -> list[str]:
with open(path, 'r') as f:
return [line.strip() for line in f if line.strip()]
PROXIES = load_proxies('proxies.txt')
def get_random_proxy() -> dict:
proxy = random.choice(PROXIES)
return {
'http': proxy,
'https': proxy,
}
Nếu nhà cung cấp hỗ trợ endpoint để lấy danh sách IP động, bạn có thể gọi API đó định kỳ để cập nhật list.
Thiết lập script kiểm tra
Chúng ta sẽ viết một hàm check_geolocation thực hiện:
- Lấy proxy ngẫu nhiên.
- Gửi GET request tới dịch vụ kiểm tra qua proxy.
- Phản hồi JSON, trích xuất
lat,lon(hoặc các trường tương đương). - So sánh với tọa độ mong đợi (được xác định trước từ bản ghi địa lý của quốc gia/thành phố mà proxy якобы đến từ).
- Tính khoảng cách haversine (km) và ghi lại kết quả.
import requests
from geopy.distance import geodesic
import time
# Bản đồ quốc gia → tọa độ trung gian (có thể lấy từ GeoNames)
COUNTRY_CENTER = {
'US': (39.8283, -98.5795),
'VN': (14.0583, 108.2772),
'DE': (51.1657, 10.4515),
# … thêm các quốc gia cần kiểm tra
}
def get_country_from_ip(ip: str) -> str:
# Có thể dùng một dịch vụ khác để lấy country code từ IP thực
resp = requests.get(f'https://ipapi.co/{ip}/country/', timeout=5)
return resp.text.strip().upper()
def check_geolocation(service_url: str) -> dict:
proxy = get_random_proxy()
try:
resp = requests.get(service_url, proxies=proxy, timeout=10)
resp.raise_for_status()
data = resp.json()
# Các dịch vụ có trường tên khác nhau, chuẩn hoá
lat = data.get('latitude') or data.get('lat') or data.get('latitude')
lon = data.get('longitude') or data.get('lon') or data.get('lng')
ip = data.get('ip')
if lat is None or lon is None:
raise ValueError('Không tìm thấy lat/lon trong phản hồi')
country = get_country_from_ip(ip)
expected_lat, expected_lon = COUNTRY_CENTER.get(country, (None, None))
if expected_lat is None:
distance = None
else:
distance = geodesic((lat, lon), (expected_lat, expected_lon)).kilometers
return {
'ip': ip,
'service': service_url,
'lat': lat,
'lon': lon,
'expected_lat': expected_lat,
'expected_lon': expected_lon,
'distance_km': distance,
'timestamp': time.time(),
'proxy': proxy['http']
}
except Exception as e:
return {
'error': str(e),
'proxy': proxy['http'],
'timestamp': time.time()
}
# Vòng lặp chính
RESULTS = []
SERVICES = [
'https://ipinfo.io/json',
'http://ip-api.com/json',
# Thêm dịch vụ khác nếu cần
]
for _ in range(200): # số lượng test mong muốn
for svc in SERVICES:
result = check_geolocation(svc)
RESULTS.append(result)
time.sleep(0.5) # tránh hitting rate limit quá nhanh
import pandas as pd
df = pd.DataFrame(RESULTS)
df.to_csv('geolocation_test_results.csv', index=False)
print('Kết quả đã lưu')
Giải thích các thành phần
get_random_proxychọn ngẫu nhiên một proxy từ danh sách, giúp mô phỏng xoay IP.get_country_from_ipgọi một dịch vụ phụ trợ (ipapi.co) để xác định quốc gia thực tế của IP proxy – cần thiết vì chúng ta không tin blindly vào nhà cung cấp proxy về vị trí.COUNTRY_CENTERchứa tọa độ trung gian của mỗi quốc gia; nếu bạn cần độ chính xác thành phố, thay bằng tọa độ cụ thể của thành phố mà proxy заявлен.- Hàm
check_geolocationtrả về một dict chứa khoảng cách sai số (km) hoặc lỗi nếu có.
Phân tích kết quả và đo lường sai số
Sau khi thu thập đủ dữ liệu, chúng ta tính toán các chỉ số sau:
- Sai số trung bình (Mean Absolute Error, MAE): trung bình của
distance_kmnơi không null. - Phân vị 90th percentile: mức độ mà 90% các Measurement có sai số nhỏ hơn.
- Tỷ lệ lỗi: phần trăm kết quả có
errorkhông null. - Phân bố theo quốc gia: xem quốc gia nào có sai số lớn nhất để xác định điểm الضعف của dịch vụ hoặc chất lượng proxy.
import numpy as np
def analyse(df: pd.DataFrame):
valid = df[df['distance_km'].notnull()]
mae = valid['distance_km'].mean()
p90 = valid['distance_km'].quantile(0.9)
error_rate = df['error'].notnull().mean() * 100
print(f'MAE: {mae:.2f} km')
print(f'90th percentile: {p90:.2f} km')
print(f'Error rate: {error_rate:.2f}%')
# Phân theo quốc gia
if 'expected_lat' in valid.columns:
valid['country'] = valid.apply(lambda r: get_country_from_ip(r['ip']), axis=1)
country_mae = valid.groupby('country')['distance_km'].mean()
print('Sai số trung bình theo quốc gia:')
print(country_mae.sort_values(ascending=False))
analyse(df)
Kết quả cho bạn biết dịch vụ nào có độ chính xác tốt nhất và liệu có cần thay đổi nhà cung cấp proxy không.
Xử lý giới hạn tốc độ và CAPTCHA
Nhiều dịch vụ kiểm tra IP có giới hạn request mỗi phút. Để tránh bị chặn:
- Delay ngẫu nhiên:
time.sleep(random.uniform(0.3, 1.2))giữa các request. - Retry với backoff: Sử dụng thư viện
tenacityđể thực hiện exponential backoff khi nhận mã 429 hoặc 503. - Phân luồng hoặc async: Nếu cần throughput cao, viết lại bằng
httpx.AsyncClientvà dùng semaphore để giới hạn số luồng đồng thời. - Detect CAPTCHA: Nếu phản hồi trả về HTML chứa từ "captcha" hoặc status 403, chuyển sang proxy khác và tăng thời gian chờ.
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
def safe_get(url, proxies):
resp = requests.get(url, proxies=proxies, timeout=10)
if resp.status_code == 429:
raise Exception('Rate limit exceeded')
resp.raise_for_status()
return resp
Cải thiện độ chính xác dựa trên kết quả
Nếu bạn phát hiện sai số hệ thống (ví dụ dịch vụ luôn đặt vị trí về trung tâm quốc gia thay vì thành phố cụ thể):
- Lựa chọn dịch vụ khác: Một số nhà cung cấp cung cấp độ chính xác thành phố cao hơn (ví dụ: MaxMind GeoIP2 Enterprise).
- Kết hợp nhiều dịch vụ: Lấy trung bình vị trí từ 2‑3 dịch vụ để giảm sai số.
- Điều chỉnh dựa trên IP range: Nếu bạn biết dải IP proxy thuộc về một ISP cụ thể, bạn có thể tra cứu trongฐาน dữ liệu WHOIS để lấy vị trí chính xác hơn và áp dụng correction factor.
- Gửi phản hồi tới nhà cung cấp: Nhiều công ty cung cấp kênh báo lỗi vị trí; việc cung cấp dữ liệu thực tế giúp họ cải thiện cơ sở dữ liệu.
Kết luận
Việc sử dụng proxy xoay để kiểm tra độ chính xác của dịch vụ định vị địa lý IP là một quy trình đơn giản nhưng mạnh mẽ. Nó giúp các đội phát triển, маркетинг và an ninh xác nhận rằng ứng dụng của họ dựa trên vị trí IP thật sự hoạt động như mong đợi, đồng thời phát hiện sớm các vấn đề về chất lượng proxy hoặc dịch vụ geolocation. Bằng cách triển khai script mẫu trên, tùy chỉnh tham số số lượng test, danh sách dịch vụ và chiến lược xử lý lỗi, bạn có thể tạo ra một hệ thống giám sát liên tục chạy trong CI/CD hoặc như một job định kỳ, đảm bảo rằng mọi quyết định dựa trên vị trí luôn được ground‑truth xác thực.
Lưu ý: Thay đổi COUNTRY_CENTER và danh sách proxy sao cho phù hợp vớiScope kiểm tra của bạn. Luôn tuân thủ quy định về sử dụng proxy và không vượt quá giới hạn tốc độ của các dịch vụ kiểm tra IP để tránh bị chặn hoặc vi phạm khoản dịch vụ.*