C#代理IP爬虫运行速度过慢如何优化提速
问题根因
你现在的代码慢,核心是把性能优化的力气用错了地方,90%以上的耗时都在串行的网络请求上,你反而只把占比极低的文本解析部分做了并行,还写了不少拖速度的冗余逻辑:
- 网络请求完全串行:你用单个
WebClient实例在for循环里同步挨个下载所有代理源内容,网络IO等待占总耗时的95%以上,这部分完全没做并行,是最大的速度瓶颈。 - 正则重复执行做了巨量无用功:你在
Parallel.For循环里,每处理一个匹配项就对整段文本重新执行一次全量正则匹配,假设一个页面有100个代理IP,你就跑了100次完全相同的正则匹配,平白多做了上百倍的无效计算。 - 多线程操作不安全:普通
List<string>不是线程安全集合,多线程同时调用Add不仅会丢数据,还会产生隐式锁竞争,拖慢速度,甚至触发异常,只是你空catch把异常全吞了看不到。 - 没有超时机制:
WebClient默认没有设置合理的请求超时,遇到失效、卡顿的源会无意义等待很久。 - 控制台IO过于频繁:每拿到一个代理就打印日志、修改窗口标题,控制台输出是阻塞操作,高频调用会吃掉大量并行收益。
- 存在大量重复请求:你的代理源列表里有近三分之一是重复URL,重复下载浪费带宽和时间。
- 并行度设置逻辑错误:你按CPU核心数设置并行度,这个逻辑只适用于CPU密集型计算,网络请求是IO密集型操作,等待响应的时候CPU完全空闲,按CPU核数设并行度会浪费绝大部分带宽。
优化方案(按收益从高到低排序)
- 优先把网络请求改成并发异步
把老旧的WebClient换成全局单例的HttpClient(不要每次请求新建实例,否则会有端口耗尽问题),设置3-5秒的合理超时,用Task.WhenAll并发发起所有源的下载请求,失效源直接跳过不阻塞整体流程。这一步优化完速度至少能提升10~50倍,总耗时基本等于最慢的那个有效源的响应时间。
核心实现参考:// 全局只初始化一次HttpClient private static readonly HttpClient httpClient = new HttpClient() { Timeout = TimeSpan.FromSeconds(5) }; // 初始化时配置请求头 httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"); // 先对源列表去重,再并发下载 var downloadTasks = APIS.Distinct().Select(async api => { try { return await httpClient.GetStringAsync(api).ConfigureAwait(false); } catch { return string.Empty; } }); var allPageContents = await Task.WhenAll(downloadTasks); - 优化正则匹配逻辑
提前把代理匹配正则声明为编译型实例,每个页面内容只执行一次正则匹配,拿到所有匹配结果后再做后续处理,不要在循环里反复执行全量匹配:// 提前初始化编译好的正则,减少匹配开销 private static readonly Regex proxyRegex = new Regex(@"\d+\.\d+\.\d+\.\d+:\d+", RegexOptions.Compiled); // 单页内容只匹配一次 var proxyMatches = proxyRegex.Matches(pageContent); - 替换成线程安全集合
多线程场景下写入结果不要用普通List<string>,换成ConcurrentBag<string>这类专门为多线程设计的并发集合,避免数据丢失和不必要的锁竞争。 - 降低控制台操作频率
不要每拿到一个代理就打印日志、修改窗口标题,可以攒够10个代理或者每隔100ms更新一次控制台内容,减少阻塞IO的开销。 - 调整并行度逻辑
网络IO场景的并行度不需要绑定CPU核心数,可以根据自己的带宽情况设到30~100,充分利用带宽资源。 - 爬取结果去重
不同代理源爬到的IP有大量重复,所有源爬完后对结果做一次全局去重,减少后续代理有效性验证的工作量。
优化后预期效果
原来串行请求的模式下,就算每个源平均响应1秒,总耗时也要几十秒,遇到卡顿源总时长轻松破分钟;优化完成后,所有源并发请求,加上解析和去重的时间,总耗时基本可以控制在3~10秒。
内容的提问来源于stack exchange,提问作者vitem
相关产品推荐
相关产品推荐

