Question

Je veux savoir s'il y a une meilleure façon d'extraire les informations à partir d'une page Web que l'analyse syntaxique du code HTML pour ce que je suis à la recherche. à savoir: classement des films Extraction de 'imdb.com'

J'utilise actuellement les composants IndyHttp pour obtenir la page et j'utilise strUtils pour analyser le texte, mais le contenu est limité.

Était-ce utile?

La solution

J'ai trouvé regex es de simples plaine pour être très intuitive et simple lorsqu'ils traitent avec de bons sites Web, et IMDB est un bon site web.

Par exemple, le classement des films sur la page HTML de film de l'IMDB est dans un <DIV> avec class="star-box-giga-star". C'est très facile à extraire à l'aide d'une expression régulière. L'expression régulière suivante extraira la note de film à partir du HTML brut dans le groupe de capture 1:

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

Il est pas joli, mais il fait le travail. Les regards regex pour l'ID de classe « star-box-giga étoiles », puis il recherche le > qui met fin à la DIV et capture alors tout jusqu'à ce que le < suivant. Pour créer une nouvelle regex comme celui-ci, vous devez utiliser un navigateur Web qui permet d'inspecter des éléments (par exemple Crome ou Opera). Avec Chrome, vous pouvez simplement regarder la page web, un clic droit sur l'élément que vous souhaitez capturer et faire Inspect element, alors regardez autour des éléments facilement identifiables qui peuvent être utilisés pour créer une bonne regex. Dans ce cas, la classe "star-box-giga-star" est évidemment facilement identifiable! Vous aurez généralement aucun problème à trouver des éléments identifiables sur les bons sites Web, car les bons sites web utilisent CSS et CSS nécessite de ID ou class'es pour être en mesure de style des éléments correctement.

Autres conseils

Traitement Flux RSS est plus confortable.

Au moment de l'affichage, le seul flux RSS disponibles sur le site sont:

  • né à cette date
  • Décédé à cette date
  • Sondage quotidien

Cependant, vous pouvez faire un appel à l'ajout d'un nouveau en prenant contact avec le help desk .

Ressources sur flux RSS traitement:

Lorsque le grattage des sites Web, vous ne pouvez pas compter sur la disponibilité des informations. IMDB peut détecter votre racler et tenter de vous bloquer, ou ils peuvent souvent changer le format pour le rendre plus difficile.

Par conséquent, vous devez toujours essayer d'utiliser une API pris en charge ou flux RSS, ou au moins obtenir la permission de partir du site Web pour agréger leurs données, et assurer que vous respecter leurs termes. Souvent, vous devrez payer pour ce type d'accès. Racler un site sans autorisation peut vous ouvrir à la responsabilité sur un plan légal couple (déni de service et de la propriété intellectuelle).

Voici IMDB :

Vous ne pouvez pas utiliser l'exploration de données, robots, screen scraping, ou similaire outils de collecte et d'extraction de données en ligne sur notre site.

Pour répondre à votre question, la meilleure façon est d'utiliser la méthode fournie par le site. Pour un usage non commercial, et si vous respectez les termes , vous pouvez télécharger la base de données IMDB directement et utiliser les données à partir de là au lieu de gratter leur site. Mettez simplement à jour votre base de données fréquemment, et il est une meilleure solution que le grattage du site. Vous pouvez même envelopper votre propre API Web autour d'elle. Les notes sont disponibles comme une table autonome.

Utilisez HTML Tidy pour convertir tout HTML en XML valide et puis utiliser un analyseur XML, en utilisant peut-être XPATH ou développer votre propre code (qui est ce que je fais).

Toutes les réponses affiché couverture bien votre question générique. Je suis habituellement une stratégie similaire à celle détaillée par Cosmin. J'utilise wininet et regex pour la plupart de mes besoins d'extraction Web.

Mais permettez-moi d'ajouter mes deux cents à la sous-question spécifique sur l'extraction de qualification imdb. IMDBAPI.COM fournit une interface de requête renvoyant le code JSON, ce qui est très pratique pour ce type de recherches.

Ainsi, un programme de ligne de commande très simple pour obtenir une note de imdb serait ...

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.

Si la page que vous rampez est XML valide, j'utilise SimpleXML pour infos extraire. Fonctionne très bien.

Ressources:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top