Frage

Ich möchte wissen, ob es eine bessere Möglichkeit gibt, Informationen von einer Webseite zu extrahieren, als die HTML für das zu analysieren, was ich suche. IE: Extrahieren von Filmbewertung von 'imdb.com'

Ich verwende derzeit die IndyHTTP -Komponenten, um die Seite zu erhalten, und ich verwende Strudils, um den Text zu analysieren, aber der Inhalt ist begrenzt.

War es hilfreich?

Lösung

Ich fand einfache einfache Regex-ES im Umgang mit guten Websites sehr intuitiv und einfach, und IMDB ist eine gute Website.

Zum Beispiel ist die Filmbewertung auf der HTML -Seite des IMDB -Films in a <DIV> mit class="star-box-giga-star". Das ist sehr einfach mit einem regulären Ausdruck zu extrahieren. Der folgende reguläre Ausdruck extrahiert die Filmbewertung aus dem RAW -HTML in die Capture Group 1:

star-box-giga-star[^>]*>([^<]*)<

Es ist nicht schön, aber es macht den Job. Der Regex sucht nach der Klassen-ID "Star-Box-Giga-Star", dann sucht sie nach dem > Das endet die DIV, und fängt dann alles bis zum folgenden fest <. Um einen neuen Regex wie diesen zu erstellen, sollten Sie einen Webbrowser verwenden, mit dem Elemente untersucht werden können (z. B. Crome oder Opera). Mit Chrome können Sie einfach die Webseite betrachten, klicken Sie mit der rechten Maustaste auf das Element, das Sie erfassen und tun möchten Inspect element, Schauen Sie sich dann nach leicht identifizierbaren Elementen um, mit denen ein gutes Regex erstellt werden kann. In diesem Fall der "star-box-giga-star" Die Klasse ist offensichtlich leicht zu identifizierbar! Normalerweise haben Sie kein Problem damit, solche identifizierbaren Elemente auf guten Websites zu finden, da gute Websites CSS und CSS verwenden ID's oder class'Es, die Elemente richtig stylen zu können.

Andere Tipps

wird bearbeitet RSS -Feed ist komfortabler.

Zum Zeitpunkt der Veröffentlichung sind die einzigen RSS -Feeds auf der Website:

  • An diesem Datum geboren
  • Starb an diesem Tag
  • Tägliche Umfrage

Sie können jedoch einen neuen Hinzufügen eines neuen hinzufügen, indem Sie sich mit dem in Verbindung setzen Beratungsstelle.

Ressourcen für die RSS -Feed -Verarbeitung:

Wenn Sie Websites abkratzen, können Sie sich nicht auf die Verfügbarkeit der Informationen verlassen. IMDB kann Ihr Kratzen erkennen und versuchen, Sie zu blockieren, oder sie können das Format häufig ändern, um es schwieriger zu machen.

Daher sollten Sie immer versuchen, eine unterstützte API- oder RSS -Feed zu verwenden oder zumindest die Erlaubnis von der Website zu erhalten, um ihre Daten zu aggregieren und sicherzustellen, dass Sie sich an ihre Bedingungen halten. Oft müssen Sie für diese Art von Zugriff bezahlen. Wenn Sie eine Website ohne Erlaubnis abkratzen, können Sie an einigen rechtlichen Fronten (Verweigerung des Dienstes und des geistigen Eigentums) der Haftung eröffnet werden.

Hier sind IMDBs Aussage:

Sie dürfen auf unserer Website keine Data Mining, Roboter, Screen Scraping oder ähnliche Online -Datenerfassung und Extraktionstools verwenden.

Um Ihre Frage zu beantworten, ist es besser, die von der Website bereitgestellte Methode zu verwenden. Für nichtkommerzielle Verwendung und wenn Sie sich an ihre halten Bedingungen, du kannst Laden Sie die IMDB -Datenbank direkt herunter und verwenden Sie die Daten von dort, anstatt ihre Website zu kratzen. Aktualisieren Sie einfach Ihre Datenbank häufig und sie ist eine bessere Lösung als das Abkratzen der Website. Sie könnten sogar Ihre eigene Web -API darum wickeln. Bewertungen sind als eigenständige Tabelle erhältlich.

Verwenden Sie HTML Tidy, um HTML in gültige XML zu konvertieren, und verwenden Sie dann einen XML -Parser, um XPath zu verwenden oder Ihren eigenen Code zu entwickeln (was ich tue).

Alle Antworten haben Ihre generische Frage gut abgegeben. Normalerweise folge ich einer Strategie ähnlich der von Cosmin beschriebenen Strategie. Ich benutze Wininet und Regex für die meisten meiner Web -Extraktionsanforderungen.

Aber lassen Sie mich meine zwei Cent bei der spezifischen Unterquestion beim Extrahieren der IMDB -Qualifikation hinzufügen. IMDBAPI.com bietet eine Abfrageschnittstelle, die den JSON -Code zurückgibt, der für diese Art von Suchanfragen sehr praktisch ist.

Ein sehr einfaches Befehlszeilenprogramm zum Erhalten einer IMDB -Bewertung wäre also ...

program imdbrating;
{$apptype console}
uses htmlutils;

function ExtractJsonParm(parm:string;h:string):string;
 var r:integer;
 begin
  r:=pos('"'+Parm+'":',h);
  if r<>0 then 
    result:=copy(h,r+length(Parm)+4,pos(',',copy(h,r+length(Parm)+4,length(h)))-2)
  else
    result:='N/A';
 end;

var h:string;
begin
  h:=HttpGet('http://www.imdbapi.com/?t=' + UrlEncode(ParamStr(1)));
  writeln(ExtractJsonParm('Rating',h));
end.

Wenn die Seite, die Sie kriechen, gültig ist XML, benutze ich SimpleXML Infos extrahieren. Funktioniert ziemlich gut.

Ressource:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top