2010-08-17 147 views
1

我正在使用網絡爬蟲。我正在使用Webbrowser控件來達到此目的。我已經獲得了存儲在數據庫中的URL列表,我想逐一遍歷所有這些URL並解析HTML。C#Web瀏覽器控件:導航到列表到URL

我用下面的邏輯

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

我想要做的「webBrowser1_DocumentCompleted」事件的一些工作,一旦頁面完全加載。但是「webBrowser1_DocumentCompleted」沒有得到控制權,因爲我在這裏使用循環。只有在「hrefs」中的最後一個url被導航並且控件退出循環時它纔會得到控制權。

什麼是處理這種問題的最佳方法?

回答

4

將列表存儲在您所在州的某處,以及您所需的索引。然後在DocumentCompleted事件中,解析HTML並導航到下一頁。

(我個人不會用WebBrowser控制網頁抓取......我知道這意味着它會處理JavaScript的你,但是這將是一個困難得多好聽比並行使用多個WebRequestWebClient對象)。

1

首先,即使在加載任何內容之前,您都將新網址設置爲相同的Web瀏覽器控件,這樣您只需在瀏覽器中看到最後一個網址即可。瀏覽器肯定會花費一些時間來加載url,所以我猜在Document_Completed可以被觸發之前導航已經被提前取消了。

只有一種辦法同時做到這一點,

你必須使用一個標籤控制,並打開一個新的標籤項爲每個URL和每個標籤項目都會有它自己的web瀏覽器控件,你可以設置它的網址。

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(); 
    } 
} 
+0

+1您的隊列方法的啓發。我不確定他是否想要並行運行 - 我只是認爲他希望在繼續之前等待「完成」的循環。最好的祝福 – 2010-08-17 13:04:41