5 Stimmen

Der beste Weg, um Informationen aus dem Web zu extrahieren Delphi

Ich möchte wissen, ob es einen besseren Weg der Extraktion von Informationen aus einer Webseite als Parsing der HTML für das, was ich suche. dh: Extrahieren von Filmbewertung von 'imdb.com'

Ich bin derzeit mit der IndyHttp-Komponenten, um die Seite zu erhalten und ich bin mit strUtils, um den Text zu analysieren, aber der Inhalt ist begrenzt.

7voto

Cosmin Prund Punkte 25218

Ich habe festgestellt, dass einfache Regexe sehr intuitiv und einfach sind, wenn es um gute Websites geht, und IMDB ist eine gute Website.

Zum Beispiel ist die Filmbewertung auf der HTML-Seite der IMDB in einer <DIV> con class="star-box-giga-star" . Das ist mit einem regulären Ausdruck SEHR einfach zu extrahieren. Der folgende reguläre Ausdruck extrahiert die Filmbewertung aus dem Roh-HTML in die Erfassungsgruppe 1:

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

Es ist nicht schön, aber es erfüllt seinen Zweck. Der Regex sucht nach der Klassenkennung "star-box-giga-star" und dann nach dem > die die DIV und fängt dann alles bis zum folgenden < . Um eine neue Regex wie diese zu erstellen, sollten Sie einen Webbrowser verwenden, der die Inspektion von Elementen ermöglicht (z. B. Crome oder Opera). Mit Chrome können Sie einfach auf die Webseite schauen, mit der rechten Maustaste auf das Element klicken, das Sie erfassen möchten, und Folgendes tun Inspect element und schauen Sie sich dann nach leicht erkennbaren Elementen um, die zur Erstellung einer guten Regex verwendet werden können. In diesem Fall ist die "star-box-giga-star" Klasse ist offensichtlich leicht zu erkennen! Normalerweise haben Sie keine Probleme, solche identifizierbaren Elemente auf guten Websites zu finden, denn gute Websites verwenden CSS und CSS erfordert ID oder class um die Elemente richtig gestalten zu können.

3voto

menjaraz Punkte 7521

Verarbeitung RSS-Feed ist bequemer.

Zum Zeitpunkt der Veröffentlichung sind nur folgende RSS-Feeds auf der Website verfügbar:

  • Geboren an diesem Datum
  • Gestorben an diesem Datum
  • Tägliche Umfrage

Sie können jedoch einen neuen Antrag stellen, indem Sie sich mit der Helpdesk .

Ressourcen zur Verarbeitung von RSS-Feeds:

3voto

Marcus Adams Punkte 51234

Beim Scraping von Websites können Sie sich nicht auf die Verfügbarkeit der Informationen verlassen. IMDB kann Ihr Scraping erkennen und versuchen, Sie zu sperren, oder das Format häufig ändern, um es zu erschweren.

Daher sollten Sie immer versuchen, eine unterstützte API oder einen RSS-Feed zu verwenden, oder zumindest die Erlaubnis der Website einholen, ihre Daten zu aggregieren, und sicherstellen, dass Sie sich an ihre Bedingungen halten. Oft müssen Sie für diese Art des Zugriffs bezahlen. Das Scraping einer Website ohne Erlaubnis kann Sie in mehrfacher Hinsicht haftbar machen (Denial of Service und geistiges Eigentum).

Hier ist IMDB's Anweisung :

Sie dürfen kein Data Mining, keine Roboter, kein Screen Scraping oder ähnliches verwenden. Tools zur Online-Datenerfassung und -extraktion auf unserer Website verwenden.

Um Ihre Frage zu beantworten, ist es besser, die auf der Website beschriebene Methode zu verwenden. Für nicht-kommerzielle Zwecke und wenn Sie sich an deren Bedingungen können Sie die IMDB-Datenbank direkt herunterladen und verwenden Sie die Daten von dort, anstatt ihre Website zu scrapen. Aktualisieren Sie einfach Ihre Datenbank regelmäßig, und es ist eine bessere Lösung als das Scrapen der Website. Sie könnten sogar Ihre eigene Web-API um diese Daten herum aufbauen. Bewertungen sind als eigenständige Tabelle verfügbar.

2voto

Misha Punkte 1790

Verwenden Sie HTML Tidy, um HTML in gültiges XML umzuwandeln, und verwenden Sie dann einen XML-Parser, vielleicht unter Verwendung von XPATH oder durch Entwicklung eigenen Codes (was ich tue).

2voto

PA. Punkte 26952

Alle veröffentlichten Antworten decken Ihre allgemeine Frage gut ab. Ich verfolge normalerweise eine ähnliche Strategie wie die von Cosmin beschriebene. Ich verwende Wininet und Regex für die meisten meiner Web-Extraktionsanforderungen.

Aber lassen Sie mich meinen Senf zu der speziellen Unterfrage über die Extraktion von imdb-Qualifikationen dazugeben. IMDBAPI.COM bietet eine Abfrageschnittstelle, die json-Code zurückgibt, was für diese Art der Suche sehr praktisch ist.

Ein sehr einfaches Kommandozeilenprogramm, um eine imdb-Bewertung zu erhalten, wäre also...

program imdbrating;
{$apptype console}
uses htmlutils;

function ExtractJsonParm(parm,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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X