我有一个更改网址的for循环
for (int i = 1; i < max; i += 50)
{
completed = false;
string currkey = country;
crawler.Navigate(new Uri("http://www.example.net/func.php?dom=" + currkey + "&key=&start=" + i));
Console.WriteLine("Navigating to " + "http://www.example.net/func.php?dom=" + currkey + "&key=&start=" + i);
while (!completed)
{
Application.DoEvents();
Thread.Sleep(500);
}
}
这是我的文档完成处理程序
crawler.Refresh();
Console.WriteLine("Getting universities");
getUniversities();
Console.WriteLine("Finished getting universities");
completed = true;
当我摆脱for循环并使用单个链接时,它似乎正确导航到网站,但是当我使用for循环按顺序加载网站时,似乎Web浏览器在第二次迭代中陷入困境
实施例: currkey =美国
在第一次迭代中,网站链接将是http://www.example.net/func.php?dom=“美国”&amp; key =&amp; start = 1,在下一个网站链接将是http://www.example.net/func.php?dom=“美国”&amp; ;键=安培;开始= 51。尝试加载第二个链接时导航卡住了。
我已经使用了boolean completed注意到当前的迭代已经完成,但它仍然卡住了。
感谢任何形式的帮助
答案 0 :(得分:0)
您的Thread.Sleep
来电阻止WebBrowser
继续加载。您应该做的是附加到DocumentCompleted
事件,然后加载下一页。请不要在WinForms中使用/ sleep组合 - 您应该使用控件公开的事件。
附上活动:
crawler.DownloadCompleted += CrawlerDocumentCompleted;
事件处理程序:
private void CrawlerDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
//The document has loaded - now do something
}
最后的想法
由于您正在实现爬虫,为什么要使用WinForms中的WebBrowser
控件进行导航。当然你感兴趣的是服务器提供的html?或者是使用JavaScript将其他元素加载到DOM中的页面,要求您使用WebBrowser
?
您可以使用WebClient
类和DownloadString
或DownloadStringAsync
方法。见https://msdn.microsoft.com/en-us/library/fhd1f0sw(v=vs.110).aspx