如何仅使用 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 获取 HtmlAgilityPack
或 IronWebScraper
。
【讨论】:
我需要先登录网站,因此我认为这些 nuget 包对我没有帮助.. @Licentia 这并不少见,所以我认为这甚至无关紧要。几乎所有网页抓取代码(即使只使用内置的 .NET 方法)都支持身份验证。以上是关于如何仅使用 c# Web 浏览器加载 html的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 C# 执行 HTML 文件的所有 Javascript 以仅生成 HTML DOM