You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C# (.NET 4.8) HTTP/S代理检测准确率提升技术求助

C# (.NET 4.8) HTTP/S代理检测准确率提升技术求助

大家好,最近我在做一个C# (.NET 4.8)项目,用来爬取并验证上百个HTTP/S代理,但目前遇到了准确率的瓶颈,想请各位大佬帮忙分析改进!

过去几天我测试了多种验证代理是否存活的方法,但当前的实现和常用在线代理检测工具相比,准确率只有大概50%——我程序标记为“存活”的代理里,只有一半能被在线工具确认有效,而且我特意确认过没有被IP检测接口限流,这个因素可以排除!

我的核心验证逻辑是:给每个代理配置HttpClient,请求一个返回公网IP的接口,对比返回的IP和代理IP是否一致,一致就判定代理存活。但实际结果和在线工具的差距实在太大,我试过两种思路都没改善:

  • 思路1:请求IP检测接口,严格对比返回IP与代理IP
  • 思路2:直接请求普通公开URL,仅检查是否返回200状态码

两种方法的准确率都没达到预期,和在线工具的结果偏差明显。下面是我当前的核心验证方法代码,真心希望大家能给我一些优化建议,提升检测的准确性!

// 注意:retries、timeOut、delayMs是我定义的全局配置变量
private static async Task<bool> Check(string proxy)
{
    string[] proxyParts = proxy.Split(':');
    if (proxyParts.Length < 2)
    {
        return false; // 无效的代理格式,直接返回
    }
    string proxyIp = proxyParts[0];

    // 重试机制:最多尝试retries次
    for (int attempt = 1; attempt <= retries; attempt++)
    {
        var handler = new HttpClientHandler
        {
            Proxy = new WebProxy(proxy),
            UseProxy = true
        };

        using (var checkClient = new HttpClient(handler)
        {
            Timeout = TimeSpan.FromMilliseconds(timeOut)
        })
        {
            try
            {
                string jsonResponse = await checkClient.GetStringAsync("https://api.ipify.org?format=json").ConfigureAwait(false);
                var jsonObject = JToken.Parse(jsonResponse);
                string publicIp = jsonObject["ip"]?.ToString();

                if (!string.IsNullOrEmpty(publicIp) && publicIp == proxyIp)
                {
                    return true; // 代理IP与返回的公网IP匹配,验证通过
                }
            }
            catch
            {
                // 最后一次尝试失败则返回false
                if (attempt == retries)
                {
                    return false;
                }
            }
            // 重试前短暂延迟
            await Task.Delay(delayMs).ConfigureAwait(false);
        }
    }
    return false;
}

内容来源于stack exchange

火山引擎 最新活动