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
Sobald Sie den Inhalt der Seite verwendet haben, können Sie Dispose aufrufen, um den Browser (und vielleicht den Speicher) freizugeben – Rob
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
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