2017-12-16 5 views
1

Ich habe eine Windows Desktop-Anwendung, die verwendet wird, um WebScraping auf einer Website mit WebBrowser.WebBrowser verursacht Programm nicht genügend Arbeitsspeicher Fehler

Ich musste WebBrowser verwenden, da die Website einige Javascript-Funktionen implementiert, so dass dies der einzige Weg war, den HTML-Inhalt der Seiten zu erhalten.

Das Programm muss ca. 1500 Seiten analysieren, daher habe ich eine Taskverzögerung implementiert, um zu vermeiden, dass der Server überlastet wird (und möglicherweise gesperrt wird).

Das Problem ist, dass nach 50-100 geparste Seiten, bekomme ich eine nicht genügend Speicher Fehler und das Programm wird geschlossen.

Dies ist der Code:

private async void buttonProd_Click(object sender, EventArgs e) 
{ 
    const string C_Prod_UrlTemplate = "http://www.mysite.it"; 

    var _searches = new List<Get_SiteSearchResult>(); 
    using (ProdDataContext db = new ProdDataContext()) 
    { 
     _searches = db.Get_SiteSearch("PROD").ToList(); 
     foreach (var s in _searches) 
     { 
      WebBrowser wb1 = new WebBrowser(); 
      wb1.ScriptErrorsSuppressed = true; 

      Uri uri = new Uri(String.Format(C_Prod_UrlTemplate,s.prod)); 

      wb1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);      

      wb1.Url = uri; 
      await Task.Delay(90 * 1000); 
     } 
    } 
} 

private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    using (ProdDataContext db = new ProdDataContext()) 
    { 
     WebBrowser wb = (WebBrowser)sender; 

     string s = wb.Document.Body.InnerHtml; 

     string fName = wb.CodSite + "_" + wb.PostId + ".txt"; 

     File.WriteAllText(wb.FolderPath + @"LINKS\" + fName, s); 

     db.Set_LinkDownloaded(wb.CodSite, wb.PostId);   
    } 
} 

Der Fehler messa auf dieser Befehlszeile in webBrowser_DocumentCompleted Verfahren erzeugt wird:

string s = wb.Document.Body.InnerHtml; 

Dank

zu unterstützen
+0

Sobald Sie den Inhalt der Seite verwendet haben, können Sie Dispose aufrufen, um den Browser (und vielleicht den Speicher) freizugeben – Rob

+0

Es sieht so aus, als ob Sie für jeden Abruf ein 'WebBrowser'-Steuerelement erstellen. Nicht sicher, ob dies der Grund ist, aber es scheint zu schwer für solch eine einfache Aufgabe (holen URL-Inhalt). Sie können 'WebClient' wie angegeben [hier] verwenden (https://stackoverflow.com/questions/1048199/easiest-way-to-read-from-a-url-into-a-string-in-net) oder a Bibliothek, die auch eine leistungsfähige Verarbeitung des Inhalts wie [HtmlAgilityPack] ermöglicht (https://stackoverflow.com/questions/1048199/easiest-way-to-read-from-a-url-into-a-string-in-net)). – Alexei

+0

Ich versuche den Webbrowser zu entfernen, nachdem ich den Inhalt bekommen habe. @Alexei, Ich kann den WebClient nicht verwenden, da der endgültige Inhalt, den ich bekommen muss, nach einigen JavaScript-Weiterleitungen erhalten wird ... – DarioN1

Antwort

0

Anstatt eine Kontrolle der Verwendung (die ist ein ziemlich komplexes Konstrukt, das mehr Speicher benötigt als ein einfaches Objekt), Sie können einfach die Zeichenfolge (nur den HTML-Code) abrufen, die mit einer URL wie der folgenden verknüpft ist:

using(WebClient wc = new WebClient()) { 
    string s = wc.DownloadString(url); 
    // do stuff with content 
} 

Natürlich sollten Sie einige Fehlerbehandlung (vielleicht sogar ein neues Verfahren Mechanismus) und setzen einige Verzögerungen gewährleisten Ihnen nicht pro Zeitintervall zu viel Anfragen zu gewährleisten tun.

+0

Ich kann nicht WebClient verwenden, da die Seiten oft von Javascript auf andere Seiten umgeleitet werden, so dass der WebBrowser die einzige Möglichkeit ist, zu bekommen, was ich brauche – DarioN1

+0

@ DarioN1 - oh, kann es sein kompensiert, wie durch [diese Frage und ihre Antwort] angezeigt (https://stackoverflow.com/questions/13039068/webclient-does-not-automatisch-redirect). – Alexei

+0

@ DarioN1 - auch, wenn Sie HtmlAgilityPack versuchen, überprüfen Sie [diese Frage] (https://stackoverflow.com/questions/6239319/c-sharp-htmlagility-pack-capturing-redirct). – Alexei

Verwandte Themen