57 votes

Comment "scanner" un site (ou une page) pour y trouver des informations, et les intégrer dans mon programme ?

J'essaie de comprendre comment extraire des informations d'une page Web et les intégrer dans mon programme (en Java).

Par exemple, si je connais la page exacte dont je veux obtenir l'information, pour simplifier, une page d'article Best Buy, comment puis-je obtenir l'information appropriée dont j'ai besoin sur cette page ? Comme le titre, le prix, la description ?

Quel serait le nom de ce processus ? Je n'ai aucune idée de l'endroit où commencer les recherches.

Edit : Bon, j'exécute un test pour le JSoup (celui posté par BalusC), mais je continue à obtenir cette erreur :

Exception in thread "main" java.lang.NoSuchMethodError: java.util.LinkedList.peekFirst()Ljava/lang/Object;
at org.jsoup.parser.TokenQueue.consumeWord(TokenQueue.java:209)
at org.jsoup.parser.Parser.parseStartTag(Parser.java:117)
at org.jsoup.parser.Parser.parse(Parser.java:76)
at org.jsoup.parser.Parser.parse(Parser.java:51)
at org.jsoup.Jsoup.parse(Jsoup.java:28)
at org.jsoup.Jsoup.parse(Jsoup.java:56)
at test.main(test.java:12)

J'ai Apache Commons

1 votes

Vous avez un problème avec LinkedList car LinkedList.peekFirst est apparu en java 1.6, et vous semblez utiliser une version antérieure.

2 votes

Ce processus est communément appelé "screen scraping" et est utilisé lorsqu'une API (comme SOAP) n'est pas disponible mais qu'une interface graphique web l'est. Il implique que votre application se fasse passer pour un navigateur Web et analyse les pages HTML (plus ou moins) manuellement. Je vous suggère de considérer l'une des API listées ci-dessous qui automatisent une grande partie de l'analyse.

104voto

BalusC Points 498232

Utilisez un analyseur HTML comme Jsoup . Il a ma préférence sur le autres analyseurs HTML disponibles en Java puisqu'il soutient jQuery comme Sélecteurs CSS . De même, sa classe représente une liste de nœuds, Elements met en œuvre Iterable de sorte que vous puissiez itérer sur elle dans une amélioré pour la boucle (il n'y a donc pas besoin de s'embêter avec le verbeux Node y NodeList comme les classes dans l'analyseur syntaxique DOM de Java).

Voici un exemple de coup d'envoi basique (il suffit de mettre le bouton le dernier fichier JAR de Jsoup dans le classpath) :

package com.stackoverflow.q2835505;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Test {

    public static void main(String[] args) throws Exception {
        String url = "https://stackoverflow.com/questions/2835505";
        Document document = Jsoup.connect(url).get();

        String question = document.select("#question .post-text").text();
        System.out.println("Question: " + question);

        Elements answerers = document.select("#answers .user-details a");
        for (Element answerer : answerers) {
            System.out.println("Answerer: " + answerer.text());
        }
    }

}

Comme vous l'avez peut-être deviné, cela imprime votre propre question et les noms de tous les répondeurs.

2 votes

Wow, c'est sympa ! J'ai une question cependant, j'ai juste copié et collé ceci juste pour faire un essai, mais je continue à obtenir cette erreur (regardez l'OP édité)

2 votes

@James : Cela nécessite au moins Java 1.6 (qui est déjà sorti depuis 3 ans). La mention LinkedList#peekFirst() a été introduite dans Java 1.6. Mettez à jour votre JVM (JDK) ou configurez votre IDE (Eclipse ?) en mode de conformité Java 6.

10 votes

Si des programmeurs .NET sont intéressés, j'ai porté jsoup vers .NET : nsoup.codeplex.com . J'espère que cela vous aidera.

10voto

sblundy Points 27163

C'est ce qu'on appelle le grattage d'écran, wikipedia a cet article sur le plus spécifique scraping web . Il peut s'agir d'un défi majeur, car il existe des codes HTML laids, désordonnés, cassés s'ils ne sont pas adaptés aux navigateurs, alors bonne chance.

5voto

mdma Points 33973

J'utiliserais JTidy - Il est similaire à JSoup, mais je ne connais pas bien JSoup. JTidy gère le HTML cassé et renvoie un Document w3c, ce qui vous permet de l'utiliser comme source pour XSLT afin d'extraire le contenu qui vous intéresse vraiment. Si vous ne connaissez pas XSLT, alors vous pouvez tout aussi bien choisir JSoup, car le modèle Document est plus agréable à utiliser que le w3c.

EDIT : Un rapide coup d'œil sur le site de JSoup montre que JSoup est peut-être le meilleur choix. Il semble qu'il supporte d'emblée les sélecteurs CSS pour extraire des éléments du document. Cela peut être beaucoup plus facile à utiliser que de se lancer dans le XSLT.

4voto

Roman Points 21807

Vous pouvez utiliser un analyseur html (de nombreux liens utiles ici : Analyseur html en java ).

Ce processus est appelé "captation du contenu du site web". Recherchez 'grab website content java' pour plus d'informations.

3voto

Bill the Lizard Points 147311

Le processus lui-même est normalement appelé "scraping". Vous pouvez utiliser un analyseur syntaxique comme TagSoup pour traiter la page une fois que vous l'avez récupérée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X