2017-06-26 5 views
0

Ich versuche einen WebScraper zu erstellen, um Nachrichtenartikel zu sammeln, aber ich habe Probleme, den vollen HTML-Inhalt der Webseite zu erhalten. Here is the url, dass ich zunächst für Artikel Suchergebnisse kratzen muss:Wie bekomme ich den vollständigen Webseiten-HTML-Code in C#?

Dann kratze ich jeden einzelnen Artikel (example).

Ich habe versucht mit WebRequest, HTTPWebRequest und WebClient, um meine Anfragen zu machen, aber das Ergebnis, das jedes Mal nur den HTML-Inhalt für die Sidebar enthält, etc. Ich habe Chrome-Entwickler-Tools verwendet und das zurückgegebene HTML beginnt nur nach dem Hauptinhalt der Seite und ist daher nicht hilfreich. Ich habe auch nach Ajax-Aufrufen für den Inhalt gesucht und konnte keine finden.

Ich war erfolgreich in der Lage, den benötigten Inhalt mit Selenium Webdriver zu kratzen, aber das ist nicht ideal, da es viel langsamer ist, jede URL zu besuchen, und es wird oft beim Laden von Seiten aufgehängt. Jede Hilfe bei der Anforderung des vollständigen HTML-Inhalts der Seite wäre sehr willkommen.

+1

Es würde helfen, wenn Sie den Code hinzufügen, den Sie ausführen – foobar

+1

Wenn Sie nicht die HTML erhalten, die Sie mit Ihrer ersten Anfrage kratzen müssen, wird es wahrscheinlich mit JavaScript geladen. In diesem Fall müssen Sie diese Anforderungen replizieren, um das zu erhalten, was Sie benötigen. – ThePerplexedOne

+0

Sie erhalten Roh-HTML für Artikel-Links. Von dem, was ich sehen kann, müssen Sie das Abfrageargument http://www.fa-mag.com/search.php?query=u&offset=0 senden, wenn der Abfrageparameter leer ist, gibt es nichts zurück. –

Antwort

0

Ich bin mir nicht sicher, welches Problem Sie haben, aber hier ist, wie ich Ihre Aufgabe erfüllt.

Zuerst habe ich die Seite in meinem Webbrowser mit der Netzwerk-Registerkarte in den Entwicklertools geöffnet.

Von hier sammelte ich eine Liste der Header meines echten Browsers gesendet. Ich habe dann einen HttpWebRequest erstellt, der die nachfolgenden Header angehängt hat und konnte das vollständige HTML der Seite abrufen.

public string getHtml() 
{ 
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.fa-mag.com/search.php?and_or=and&date_range=all&magazine=&sort=newest&method=basic&query=ubs"); 

    req.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0"; 
    req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
    req.AllowAutoRedirect = false; 
    req.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.5"); 
    req.Headers.Add("cookie", "analytics_id=595127c20cdfe6.52043028595127c20ce022.71834842; PHPSESSID=tbbo7npldsv26n2q7pg2728k77; D_IID=3E4FEA7F-9794-34EE-99F8-87EEA3DF0689; D_UID=5F374D94-270D-3653-8C54-9A46F381EAE2; D_ZID=505BB8EF-5A2D-3CBD-87D8-FABAD5014776; D_ZUID=BB0C9EF2-0E7B-383E-A03A-A3E92CC8051A; D_HID=9642D775-D860-3F04-8720-73E5339042BA; D_SID=63.138.127.22:6Ci6jv2Xv+yum3m9lNfnyRcAylne67YfnS/u8goKrxQ"); 
    req.Headers.Add("DNT", "1"); 
    req.Headers.Add("Upgrade-Insecure-Requests", "1"); 
    HttpWebResponse res = null; 
    try 
    { 
     res = (HttpWebResponse)req.GetResponse(); 
    } 
    catch (WebException webex) 
    { 
     res = (HttpWebResponse)webex.Response; 
    } 

    string html = new StreamReader(res.GetResponseStream()).ReadToEnd(); 
    return html; 
} 

Ohne die benutzerdefinierten Header gibt es bietet protection auf der Seite, die eine 416-Antwort und führt eine Umleitung sendet. Wenn Sie den HTML-Code in der Weiterleitungsseite lesen, wird festgestellt, dass die Website Sie als Bot erkannt hat.

+0

Sie haben recht, aber höchstwahrscheinlich läuft die Sitzung ab und Sie werden wieder zum Bot erklärt. Eventuell müssen zwei Anrufe für die Weiterleitung getätigt werden. –

+0

Ich habe gerade den gleichen Code ausgeführt und immer noch nur die teilweise HTML der Seite – FightOn

+0

hier ist der HTML-Code Ich bekomme: Edit, zu lange kann es hier nicht einfügen. –

Verwandte Themen