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

Posted

技术标签:

【中文标题】如何仅使用 c# Web 浏览器加载 html【英文标题】:How to only load html using c# Web Browser 【发布时间】:2019-08-22 16:25:35 【问题描述】:

我正在使用 C# Web 浏览器从网站上抓取数据。问题是获取大约 250 条记录大约需要 20 分钟。

我以编程方式做的是

1- 在下拉列表中获取所有年份。

2- 每年我都会进行一次搜索。并从表中抓取数据。

3- 行的第一个单元格是链接(详细信息),其余单元格具有基本信息。所以我要做的是获取基本信息,在新浏览器中打开详细信息链接并获取详细信息。

4- 循环执行第 3 步。

我对程序进行了性能测试,发现等待文档加载需要很长时间。如果我跳过从详细信息页面抓取数据,则需要 1.5 分钟才能抓取所有数据。在开始scraping之前,我使用以下方法等待文档完成。

public async Task WaitPageLoad(int timeOut)

    var pageLoaded = new TaskCompletionSource<bool>();
    var timeElapsed = 0;
    DocumentCompleted += (s, e) =>
    
        if (ReadyState != WebBrowserReadyState.Complete) return;
        if (pageLoaded.Task.IsCompleted) return; pageLoaded.SetResult(true);
    ;

    while (pageLoaded.Task.Status != TaskStatus.RanToCompletion)
    
        await Task.Delay(10); 
        timeElapsed++;
        if (timeElapsed >= timeOut * 100) pageLoaded.TrySetResult(true);
    

所以我想知道是否有任何方法可以让浏览器只加载 html 而不是图像或其他东西。

非常感谢任何帮助!

【问题讨论】:

您要抓取哪个网站?该站点将确定许多 c# web 抓取工具中哪个是最好的。 Web 浏览器控件可能不是您的最佳选择。 【参考方案1】:

根据您登录网站的方式,您需要这样的东西才能使用 WebClient:

WebClient client = new WebClient();
client.Credentials = new NetworkCredential("Username", "Password");
string pageData = client.DownloadString("https://***.com/");

【讨论】:

【参考方案2】:

为什么要使用WebBrowser?这是一个用于向用户解析和显示内容的控件。这无论如何都不是很快。

如果您想要的只是数据(并且不打算显示它),您可以简单地执行以下操作:

//Gets you the HTML for a given URL synchronously
var data = new System.Net.WebClient().DownloadString(url);

但是,根据您要抓取的页面的复杂性,上述方法可能更难使用。

对于更高级的网络抓取,我建议从 NuGet 获取 HtmlAgilityPackIronWebScraper

【讨论】:

我需要先登录网站,因此我认为这些 nuget 包对我没有帮助.. @Licentia 这并不少见,所以我认为这甚至无关紧要。几乎所有网页抓取代码(即使只使用内置的 .NET 方法)都支持身份验证。

以上是关于如何仅使用 c# Web 浏览器加载 html的主要内容,如果未能解决你的问题,请参考以下文章

如何在浏览器中通过 POST 请求加载外国图像?

c#如何判断webbrowser已经加载完毕

如何使用 C# 执行 HTML 文件的所有 Javascript 以仅生成 HTML DOM

如何解决Pyqt5在加载html时创建Web浏览器崩溃

如何将 HTML/JavaScript 从嵌入式资源加载到 winform Web 浏览器

Web页面加载,如何分析页面性能?如何进行优化?