HtmlAgilityPack爬取存在的外部链接返回404,如何排查解决?
解决HtmlAgilityPack加载外部链接返回404的问题
以下是针对你遇到的外部链接误报404问题的具体解决思路和代码调整方案:
设置合法User-Agent
多数CDN和服务器会拦截HttpWebRequest默认的爬虫风格User-Agent(如Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)),直接返回404。需要模拟主流浏览器的标识:page.PreRequest = request => { request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"; return true; };强制启用TLS 1.2+
现代CDN普遍要求使用TLS 1.2或更高版本,而旧版.NET框架中HttpWebRequest默认可能使用TLS 1.0,导致握手失败被返回404。在请求前全局设置:ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13;补充必要请求头
部分服务器会校验Accept、Accept-Encoding等请求头,缺失时返回404。在PreRequest中补充:page.PreRequest = request => { request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"; request.Accept = "text/css,*/*;q=0.1"; request.AcceptEncoding = "gzip, deflate, br"; return true; };确认自动重定向配置
部分外部链接会通过跳转返回内容,确保HtmlWeb允许自动重定向:page.AutoRedirect = true;
整合后的完整测试代码
// 全局设置TLS版本 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; var page = new HtmlWeb(); var tcs = new TaskCompletionSource<HttpWebResponse>(); page.PreRequest = request => { request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"; request.Accept = "text/css,*/*;q=0.1"; request.AcceptEncoding = "gzip, deflate, br"; request.AllowAutoRedirect = true; return true; }; page.PostResponse = (request, response) => tcs.SetResult(response); var doc = page.Load("https://cdn.datatables.net/1.13.2/css/jquery.datatables.min.css"); var httpWebResponse = tcs.Task.Result; // 验证状态码,正常应返回HttpStatusCode.OK Console.WriteLine(httpWebResponse.StatusCode);
这些调整模拟了真实浏览器的请求行为,能避开大部分CDN和服务器的反爬拦截,解决外部链接误报404的问题。
内容的提问来源于stack exchange,提问作者LarryBud
相关产品推荐
相关产品推荐

