Il modo migliore per estrarre informazioni dal Web Delphi
-
27-10-2019 - |
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.
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 class
Per 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:
- Pertinente inviare Qui su così.
- Super oggetto
- Wikipedia.
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: