c# - 尝试解析 HTML 时出错

标签 c# html parsing ssl user-agent

我正在尝试解析站点“https://www.crunchbase.com”。但是这个站点有一个“Antibot 保护”。而且我不知道如何从页面中获取任何 html 元素。

首先我做了一个“ssl”安全通道。

ServicePointManager.Expect100Continue = true;

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

然后我用浏览器的用户代理字符串创建了一个 HttpRequest。

var request = (HttpWebRequest)WebRequest.Create("https://www.crunchbase.com");

request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0";

request.Timeout = 10000;

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Console.WriteLine("Server status code: " + response.StatusCode);

并使用 StreamWriter 加载页面:

using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
    string result = sr.ReadToEnd();
    Console.WriteLine(result);
}

但结果是: enter image description here

最后我尝试从页面获取所有 Urls:

HtmlWeb web = new HtmlWeb();

HtmlDocument document = web.Load(response.ResponseUri.AbsoluteUri);

string respUri = response.ResponseUri.ToString();

HtmlNode[] nodes = document.DocumentNode.SelectNodes("//a").ToArray();

foreach (var item in nodes)
{
    Console.WriteLine(item.InnerHtml);
}

但是应用会抛出 Unhadled Exception。

最佳答案

我假设控制台窗口的上半部分是 Console.WriteLine(result) 的输出,这几乎显示了反机器人保护。无论您在浏览此站点时看到什么,它都不会出现在这个几乎是空的主体的 HTML 中(当它被呈现时,它给出......什么都没有)。网页的实际内容可能是由 HTML 内容引用的 Javascript 代码片段之一动态加载的。另一方面,HtmlWeb 解析器(我认为来自 HTML Agility Pack)不执行此 Javascript 代码,因此不会到达包含您要查找的元素的实际内容。换句话说,保护工作...

关于c# - 尝试解析 HTML 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43439330/

相关文章:

c# - 使用 MiniDump (DbgHelp.h) 获取句柄数据

javascript - 防止源加载两次

html - 'state' 验证没有错误消息和不正确的图标颜色

python - 使用 lxml/python 解析论坛帖子

php - 如何从网站收集图像,包括 CSS 文件中引用的任何图像?

c# - 结合两个 LINQ 查询的优雅方式

c# - Mongodb C# 驱动程序按嵌套属性排序

c# - 如何在 c# 中使用 google apis 将邮件设置为 gmail 的 'Important'?

javascript - 用计数器命名大量输入复选框

c# - 如何将两个 float 组的 JSON 解析为两个列表?