从具有 C# 加载页面的网站获取 HTML 代码

Posted

技术标签:

【中文标题】从具有 C# 加载页面的网站获取 HTML 代码【英文标题】:Get HTML code from a website that has a loading page in C# 【发布时间】:2014-08-16 09:51:28 【问题描述】:

我正在使用这篇文章中的代码:Get html code from website in C#

将html保存在字符串中

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)

    Stream receiveStream = response.GetResponseStream();
    StreamReader readStream;
    if (response.CharacterSet == null)
        readStream = new StreamReader(receiveStream);
    else
        readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));
    string data = readStream.ReadToEnd();
    response.Close();
    readStream.Close();

    msgBox.Text = data;

但是我尝试阅读的页面有一个临时加载页面,我该如何解决这个问题,它会在实际加载此页面后再次尝试保存 html?

最好的问候

【问题讨论】:

【参考方案1】:

我正在阅读的页面有一个临时加载页面

这完全取决于这意味着什么以及“临时加载页面”如何工作。例如,如果该页面(无论是来自 javascript 代码还是某些 HTML META 重定向)向目标页面发出请求,那么 that 请求就是您需要捕获的内容。目前您正在从给定的 URL 读取:

(HttpWebRequest)WebRequest.Create(url)

这实质上是向该 URL 发出 GET 请求并读取响应。但是根据您的描述,这听起来像是错误的 URL。听起来有一个 second URL,其中包含您要查找的实际信息。

鉴于此,您基本上有两种选择:

    通过访问页面并检查浏览器中的请求来手动确定其他 URL 是什么,并将其用作代码中 url 的值。 确定 如何 其他 URL 本身是由第一个 URL 的页面代码确定的(它是嵌入在页面源中的某处吗?),从您从第一个得到的响应中解析它url 值,然后向新 URL 发出第二次请求。

显然,第一个选项要容易得多。仅当第二个 URL 随每次访问而更改或预计会随着时间的推移而频繁更改时,才需要第二个 URL。如果是这种情况,那么您基本上必须对网站如何执行第二个请求进行逆向工程,以便您也可以执行它。

网络抓取很快就会变得复杂,并且经常变成抓取内容的人和托管内容的人(他们可能不希望内容被抓取)之间的猫捉老鼠游戏(甚至是无意和相互不知道的) .

【讨论】:

感谢您的回复,但是我已经检查了 url 是否更改,但它没有更改。完全一样。我猜它使用某种类型的javascript加载,但我似乎无法绕过它。有没有办法打开该页面并在阅读 html 代码之前等待几秒钟? @WtFudgE:我不确定“等待几秒钟”是什么意思。您需要确定的是初始页面是否真的包含您正在寻找的数据(也许它只是被设置为不可见,然后通过 JavaScript 使其可见),或者它是否加载了来自对服务器的单独调用的数据。浏览器地址栏中的 URL 可能不会更改,但如果您要查找的数据来自单独的请求,那么 那就是您要发出的请求。检查浏览器的调试工具以检查网络请求。【参考方案2】:

你为什么不使用 webbrowser 并使用延迟

await Task.Delay(n)

【讨论】:

以上是关于从具有 C# 加载页面的网站获取 HTML 代码的主要内容,如果未能解决你的问题,请参考以下文章

如何仅使用 c# Web 浏览器加载 html

从一页导航到另一页后脚本未加载

关于页头页尾的异步加载

ASP.NET 页面未加载 CSS 样式

从具有每日档案的静态 HTML/CSS 单页网站创建可搜索档案

SQL 更新命令不起作用