首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

C# 獲取真實公網 IP 及地理位置(國家/省份):網頁抓取方案

     編輯:ASP.NET 基礎

方案定位

適用於**低頻調用**、無本地 IP 庫環境的場景。高頻/生產環境**強烈建議**使用離線 IP 庫(如 MaxMind GeoIP2、ip2region、纯真库),延遲毫秒級、無外部依賴。

核心代碼實現


public class IpLocationService
{
    private const string Ip138Url = "https://www.ip138.com/ips8.asp";
    private const string Cz88Url = "https://www.cz88.net/ip/?ip={0}";

    /// 
    /// 獲取公網 IP、國家、省市
    /// 
    public string GetIpDetails()
    {
        string html = GetHtml(Ip138Url);
        
        // 提取包含 IP 和國家的表格單元格
        string cellHtml = Regex.Match(html, @"(?<=<td\s*align=""center"">)[^<]*?(?=<br/><br/></td>)", RegexOptions.Singleline).Value;
        
        // 提取 IP
        string ip = Regex.Match(cellHtml, @"((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)").Value;
        
        // 提取國家(最後一個「:」後的內容)
        int idx = cellHtml.LastIndexOf(":");
        string country = idx >= 0 ? cellHtml.Substring(idx + 1).Trim() : "未知";

        // 獲取省市
        string region = GetRegionByIp(ip);

        return $"IP:{ip} 國家:{country} 省市:{region}";
    }

    /// 
    /// 通過 IP 查詢省市(cz88.net)
    /// 
    private string GetRegionByIp(string ip)
    {
        string html = GetHtml(string.Format(Cz88Url, ip));
        string regionHtml = Regex.Match(html, @"(?<=<span\s*id=""cz_addr"">).*?(?=</span>)", RegexOptions.Singleline).Value;
        return regionHtml.Split(' ')[0]; // 取第一段(省份)
    }

    /// 
    /// 通用 HTTP GET 獲取網頁源碼
    /// 
    private string GetHtml(string url)
    {
        var request = (HttpWebRequest)WebRequest.Create(url);
        request.Timeout = 5000;
        request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0)"; // 模擬瀏覽器
        
        using (var response = (HttpWebResponse)request.GetResponse())
        using (var stream = response.GetResponseStream())
        using (var reader = new StreamReader(stream, Encoding.Default)) // 目標站點多為 GB2312
        {
            return reader.ReadToEnd();
        }
    }
}

調用示例


var service = new IpLocationService();
string details = service.GetIpDetails();
Console.WriteLine(details);
// 輸出:IP:123.45.67.89 國家:中國 省市:北京

關鍵技術點

缺陷與風險

  • ❌ **強依賴第三方網站結構**:頁面改版即失效
  • ❌ **網絡延遲不可控**:跨網請求 200ms~2s,高併發下嚴重拖慢響應
  • ❌ **頻率限制/封 IP**:短時間大量請求會被目標站封禁
  • ❌ **無法獲取城市級精度**:cz88 僅返回省份

生產級替代方案對比

環節處理方式
編碼處理目標站點多為 GB2312,`StreamReader(stream, Encoding.Default)` 自動適配系統編碼(中文環境下即 GB2312)
正則提取使用 `Singleline` 選項讓 `.` 匹配換行;`(?<=...)` 正向後顧斷言精準定位
超時控制`request.Timeout = 5000` 防止外部依賴阻塞線程
User-Agent模擬瀏覽器避免被簡單反爬蟲攔截

遷移建議

  1. 定義介面 `IIpLocationProvider`,實現 `WebScrapingProvider`、`GeoIp2Provider` 等
  2. DI 容器註冊對應實現,配置切換無業務代碼變動
  3. 本地庫方案:NuGet 安裝 `MaxMind.GeoIP2` 或引用 `ip2region.xdb` + C# 客戶端
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案延遲精度維護成本適用場景
網頁抓取 (本文)高省級高 (易失效)原型驗證、極低頻
MaxMind GeoIP2 (付費)極低城市/經緯度低 (月度更新)企業級生產
ip2region (開源)極低省/市低 (社區維護)中小項目
純真庫 (免費)極低省/市中 (需定期更新)國內項目
淘騰IP庫 API低街道級零 (商業SLA)高精度需求