如果你有一个包含多个网址的列表,需要快速收集每个网页上的H1标题。快速、准确地从海量网页中提取关键信息。今天这个代码就太有用了!
实现的关键:
定义了一个URL列表,并初始化一个ConcurrentBag对象用于存储H1标题。
利用HttpClient发送异步HTTP请求,并通过Task.WhenAll方法并发处理所有网址。
在抓取过程中,如果遇到网络异常,程序会自动尝试最多三次重新获取,
每次重试之间加入递增延迟以避免过频请求导致的问题。
它使用了HTMLAgilityPack库来解析HTML,
System.Collections.Concurrent库中的ConcurrentBag来存储H1标题,
以及System.Net.Http库中的HttpClient来发送HTTP请求。
核心代码部分包括两个方法:
FetchH1HeadingsAsync负责单个URL的异步抓取,若出现异常则进行重试;
这是一个异步方法,用于抓取单个URL的H1标题。
方法接受一个URL、一个HttpClient实例和一个ConcurrentBag作为参数。
该方法尝试最多三次抓取H1标题。如果第一次尝试失败,
它会等待一段时间(根据尝试次数递增)然后重试。
如果三次尝试都失败,它会输出一条错误消息。
在每次尝试中,它使用HttpClient发送GET请求以获取URL的内容,
然后调用ProcessHTMLContent方法解析HTML并提取H1标题。
// 异步方法,用于获取单个URL的H1标题,支持重试机制
static async Task FetchH1HeadingsAsync(string url, HttpClient client, ConcurrentBag<string> headings)
{
for (int attempt = 1; attempt <= 3; attempt ) // 最多尝试3次抓取
{
try
{
string htmlContent = await client.GetStringAsync(url);
ProcessHtmlContent(htmlContent, headings); // 解析HTML并添加标题
return;
}
catch (HttpRequestException) when (attempt < 3)
{
await Task.Delay(TimeSpan.FromSeconds(attempt * 2)); // 每次失败后增加延时再重试
}
}
Console.WriteLine($"尝试三次后仍无法从{url}获取内容。");
}
ProcessHtmlContent将接收到的HTML内容解析成HtmlDocument对象,
并从中提取所有H1标签对应的文本内容作为标题。
// 解析HTML内容并提取所有H1标题,存入线程安全集合
static void ProcessHtmlContent(string htmlContent, ConcurrentBag<string> headings)
{
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlContent);
foreach (var node in doc.DocumentNode.SelectNodes("//h1"))
{
if (node != null)
{
headings.Add(node.InnerText.Trim()); // 添加标题前去除空白字符
}
}
}
这个案例演示的技术方案具有很高的实用价值,在互联网信息采集、搜索引擎优化分析等领域可以发挥极为重要的作用。
通过高效的并发异步处理和线程安全数据结构,可以大大减少信息抓取的时间成本,并有优异的性能表现。
这是一个非常好的实现方式,H1也可以改成别的,效果杠杠的,需要完整代码或者编译成实用工具的可以关注留言给我。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved