【问题标题】:How to only load html using c# Web Browser如何仅使用 c# Web 浏览器加载 html
【发布时间】: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 浏览器控件可能不是您的最佳选择。

标签: c# winforms webbrowser-control


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    对于更高级的网络抓取,我建议从 NuGet 获取 HtmlAgilityPack 或 IronWebScraper。

    【讨论】:

    • 我需要先登录网站,因此我认为这些 nuget 包对我没有帮助..
    • @Licentia 这并不少见,所以我认为这甚至无关紧要。几乎所有网页抓取代码(即使只使用内置的 .NET 方法)都支持身份验证。
    猜你喜欢
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2017-08-28
    • 2021-10-13
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多