Domanda

Voglio sapere se esiste un modo migliore per estrarre informazioni da una pagina web che analizzare l'HTML per quello che sto cercando. IE: estrazione di un film da 'imdb.com'

Attualmente sto usando i componenti IndyHTTP per ottenere la pagina e sto usando gli strutili per analizzare il testo ma il contenuto è limitato.

È stato utile?

Soluzione

Ho trovato un semplice regex-es altamente intuitivo e semplice quando ho a che fare con buoni siti Web e IMDB è un buon sito web.

Ad esempio, la valutazione del film sulla pagina HTML del film dell'IMDB è in un <DIV> insieme a class="star-box-giga-star". È molto facile da estrarre usando un'espressione regolare. La seguente espressione regolare estraggerà la valutazione del film dall'HTML RAW nel gruppo di cattura 1:

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

Non è carino, ma fa il lavoro. Il regex cerca l'ID classe "Star-Box-Giga-Star", quindi cerca il > che termina il DIV, e poi cattura tutto fino a quanto segue <. Per creare un nuovo regex come questo, è necessario utilizzare un browser Web che consente di ispezionare gli elementi (ad esempio Crome o Opera). Con Chrome puoi semplicemente guardare la pagina web, fare clic con il pulsante destro del mouse sull'elemento che vuoi catturare e fare Inspect element, Quindi cerca elementi facilmente identificabili che possono essere utilizzati per creare un buon regex. In questo caso il "star-box-giga-star" La classe è ovviamente facilmente identificabile! Di solito non avrai problemi a trovare elementi così identificabili su buoni siti Web perché i buoni siti Web utilizzano CSS e CSS ID's o classPer essere in grado di modellare correttamente gli elementi.

Altri suggerimenti

in lavorazione RSS Feed è più comodo.

Al momento della pubblicazione, gli unici feed RSS disponibili sul sito sono:

  • Nato in questa data
  • È morto in questa data
  • Sondaggio quotidiano

Tuttavia, puoi fare una chiamata per aggiungerne uno nuovo entrando in contatto con il Help Desk.

Risorse sull'elaborazione del feed RSS:

Quando si raschiano i siti Web, non è possibile fare affidamento sulla disponibilità delle informazioni. IMDB può rilevare il tuo raschiatura e tentare di bloccarti, oppure possono spesso cambiare il formato per renderlo più difficile.

Pertanto, dovresti sempre provare a utilizzare un feed API o RSS supportato o almeno ottenere l'autorizzazione dal sito Web per aggregare i loro dati e assicurarti di rispettare i loro termini. Spesso dovrai pagare per questo tipo di accesso. Rampilare un sito Web senza autorizzazione può aprirti alla responsabilità su un paio di fronti legali (negazione del servizio e proprietà intellettuale).

Ecco IMDB dichiarazione:

Non è possibile utilizzare data mining, robot, screening per schermo o strumenti di raccolta e estrazione di dati online simili sul nostro sito Web.

Per rispondere alla tua domanda, il modo migliore è utilizzare il metodo fornito dal sito Web. Per uso non commerciale e se si rispetta il loro termini, puoi Scarica direttamente il database IMDB e usa i dati da lì invece di raschiare il loro sito. Basta aggiornare frequentemente il database ed è una soluzione migliore rispetto a raschiare il sito. Potresti persino avvolgere la tua API web attorno ad essa. Le valutazioni sono disponibili come tabella autonoma.

Usa HTML Tidy per convertire qualsiasi HTML in XML valido e quindi utilizzare un parser XML, forse usando XPath o sviluppare il tuo codice (che è quello che faccio).

Tutte le risposte pubblicate coprono bene la tua domanda generica. Di solito seguo una strategia simile a quella dettagliata da Cosmin. Uso Wininet e Regex per la maggior parte delle mie esigenze di estrazione web.

Ma lasciami aggiungere i miei due centesimi nella sottocestione specifica all'estrazione della qualifica IMDB. IMDBAPI.com fornisce un'interfaccia di query che restituisce il codice JSON, che è molto utile per questo tipo di ricerche.

Quindi un programma di riga di comando molto semplice per ottenere una valutazione IMDB sarebbe ...

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.

Se la pagina che stai strisciando è valida XML, uso SimpleXML per estrarre Infos. Funziona abbastanza bene.

Risorsa:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top