【问题标题】:C# Webbrowser Control: Navigating to a List to URLsC# Webbrowser 控件:导航到 URL 列表
【发布时间】:2010-08-17 11:15:27
【问题描述】:

我正在开发一个网络爬虫。为此,我正在使用 Webbrowser 控件。我有存储在数据库中的 url 列表,我想一一遍历所有这些 URL 并解析 HTML。

我使用了以下逻辑

            foreach (string href in hrefs)
            {
                webBrowser1.Url = new Uri(href);
                webBrowser1.Navigate(href);
            }

页面完全加载后,我想在“webBrowser1_DocumentCompleted”事件中做一些工作。但是“webBrowser1_DocumentCompleted”没有得到控制,因为我在这里使用循环。只有在“hrefs”中的最后一个url被导航并且控件退出循环时才获得控件。

处理此类问题的最佳方法是什么?

【问题讨论】:

    标签: c# navigation browser url-routing web-crawler


    【解决方案1】:

    将列表存储在您所在州的某处,以及您要去的地方的索引。然后在DocumentCompleted 事件中,解析HTML,然后导航到下一页。

    (我个人不会使用WebBrowser 控件进行网络爬取...我知道这意味着它会为您处理JavaScript,但是与使用多个@987654323 相比,并行化要困难得多@ 或 WebClient 对象。)

    【讨论】:

      【解决方案2】:

      首先,您正在为相同的 Web 浏览器控件设置新的 url,甚至在它加载任何内容之前,这样您就可以在浏览器上看到最后一个 url。浏览器肯定会花一些时间来加载 url,所以我猜导航在 Document_Completed 被触发之前已经提前取消了。

      只有一种方法可以同时做到这一点,

      您必须使用选项卡控件,并为每个 url 打开一个新的选项卡项,每个选项卡项将有自己的网络浏览器控件,您可以设置其 url。

      foreach(string href in hrefs){
         TabItem item = new TabItem();
         WebBrowser wb = new WebBrowser();
         wb.DocumentCompleted += wb_DocumentCompleted;
         wb.Url = href;
         item.Child = web;
         tabControl1.Items.Add(item);
      }
      
      
      private void wb_DocumentCompleted(object sender, EventArgs e){
       /// do your stuff...
      }
      

      为了改进上述方法,你应该看看如何在不同的 UI 线程中创建多个选项卡项,这里要讨论它的漂亮日志主题,但它仍然是可能的。

      另一种方法是使用队列...

      private static Queue<string> queue = new ...
      
      foreach(string href in hrefs){
          queue.Enqueue(href);
      }
      
      private void webBrowser1_DocumentCompleted(object sender, EventArgs e){
          if(queue.Count>0){
              webBrowser1.Url = queue.Dequeue();
          }
      }
      

      【讨论】:

      • +1 受您的队列方法的启发。我不确定他是否想并行运行它——我只是认为他想要一个循环,在继续之前等待“完成”。最好的问候
      猜你喜欢
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      相关资源
      最近更新 更多