我正在使用C#Web浏览器从网站上抓取数据。问题是大约需要20分钟才能获得250条记录。
我以编程方式做的是
1-获取下拉列表中的所有年份
2 - 每年我都会进行搜索。并从表中抓取数据。
该行的第一个单元格是链接(细节),其余单元格具有基本信息。
所以我所做的是获取基本信息,在新浏览器中打开详细信息链接并获取详细信息
4-循环到第3步
我对程序进行了性能测试,发现等待文档加载需要花费大量时间
如果我跳过从详细信息页面抓取数据,则需要1.5分钟来废弃所有数据。
在开始报废之前,我使用以下方法等待文档完成
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而不是图像或东西..
任何帮助非常感谢!
为什么要使用WebBrowser
?这是用于向用户解析和显示内容的控件。这在任何方面都不会很快。
如果您想要的只是数据(并且不打算显示它),您可以简单地执行以下操作:
//Gets you the HTML for a given URL synchronously
var data = new System.Net.WebClient().DownloadString(url);
但是,根据您尝试抓取的页面的复杂程度,上述内容可能更难以使用。
对于更高级的网页抓取,我建议从NuGet获取HtmlAgilityPack
或IronWebScraper
。
根据您登录网站的方式,您需要使用以下内容来使用WebClient:
WebClient client = new WebClient();
client.Credentials = new NetworkCredential("Username", "Password");
string pageData = client.DownloadString("https://stackoverflow.com/");