La forma de “exploración” de un sitio web (o página) para obtener información, y lo pongo en mi programa?

StackOverflow https://stackoverflow.com/questions/2835505

  •  26-09-2019
  •  | 
  •  

Pregunta

Bien, estoy más o menos tratando de encontrar la manera de extraer información de una página web, y lo pongo en mi programa (en Java).

Por ejemplo, si conozco a la página exacta Quiero información de, en aras de la simplicidad de una página del artículo de Best Buy, ¿cómo iba a obtener la información adecuada que necesito fuera de esa página? Al igual que el título, precio, descripción?

¿Cómo sería este proceso aún se llama? No tengo ni idea eran incluso comenzar a investigar esto.

Editar: Bien, estoy corriendo una prueba para el JSoup (el que está publicado por BalusC), pero me siguen dando este error:

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)

tengo Apache Commons

¿Fue útil?

Solución

El uso de un analizador de HTML como Jsoup . Esto tiene mi preferencia por encima de la otra HTML analizadores disponibles en Java ya que soportes como href="http://www.w3.org/TR/CSS2/selector.html" rel="noreferrer"> CSS selectores . Además, su clase que representa una lista de nodos, Elements , implementos Iterable de modo que usted puede iterar sobre ella en un < a href = "http://java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html" rel = "noreferrer"> ciclo mejorado (lo que no hay necesidad de molestia con verbosa Node y NodeList como las clases en el promedio de Java analizador DOM).

Aquí hay un ejemplo básico patada de salida (sólo hay que poner el último archivo JAR Jsoup en la ruta de clase):

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());
        }
    }

}

Como es de suponer, esto imprime su propia pregunta y los nombres de todos los que responden.

Otros consejos

Esto se conoce como captura de imágenes, Wikipedia tiene este artículo en el más específico raspado web . Puede ser un reto importante porque hay algunos feo, desorden arriba, roto-si-no-para-navegador-inteligencia HTML por ahí, así que buena suerte.

JTidy - es simlar a JSoup, pero no sé bien JSoup. manijas rotas JTidy HTML y devuelve un documento del W3C, así que usted puede utilizar esto como una fuente de XSLT para extraer el contenido que usted está realmente interesado en. Si usted no sabe XSLT, a continuación, que también podría ir con JSoup, como el Documento modelo es más agradable que trabajar con W3C.

EDIT: Una mirada rápida en la página web JSoup muestra que JSoup de hecho puede ser la mejor opción. Se parece apoyar selectores CSS fuera de la caja para la extracción de material del documento. Esto puede ser mucho más fácil de trabajar que entrar en XSLT.

Se puede utilizar un analizador de HTML (varias útiles aquí: java html analizador ).

El proceso se denomina 'acaparamiento de contenido del sitio web'. Buscar 'grab página web Java Content' para más invertigation.

soportes jsoup java 1.5

https://github.com/tburch/jsoup/commit/d8ea84f46e009a7f144ee414a9fa73ea187019a3

Parece como si la pila fue un error, y se ha fijado

solución JSoup es grande, pero si usted necesita para extraer algo muy simple que sea más fácil de usar expresiones regulares o String.indexOf

Como otros ya han mencionado el proceso se denomina raspado

Probablemente usted quiere mirar el código HTML para ver si puede encontrar cadenas que son únicos y cerca de su texto, a continuación, puede utilizar la línea / char-offsets para llegar a los datos.

podría ser torpe en Java, si no hay clases XML similares a los encontrados en System.XML.Linq en C #.

También podría intentar jARVEST .

Se basa en un JRuby DSL a través de un motor de Java pura a spider-raspa-transform sitios web.

Ejemplo :

Para todos los enlaces dentro de una página web (wget y xpath son construcciones del lenguaje de la jARVEST):

wget | xpath('//a/@href')

Dentro de un programa Java:

Jarvest jarvest = new Jarvest();
  String[] results = jarvest.exec(
    "wget | xpath('//a/@href')", //robot! 
    "http://www.google.com" //inputs
  );
  for (String s : results){
    System.out.println(s);
  }

Mi respuesta probablemente no será útil para el escritor de esta pregunta (Tengo 8 meses de retraso por lo que no es el momento adecuado, supongo) pero creo que probablemente será útil para muchos otros desarrolladores que podrían venir a través de esta respuesta.

Hoy en día, me acaba de publicar (en el nombre de mi empresa) un HTML para POJO marco completo que se puede utilizar para mapear HTML para cualquier clase POJO con simplemente algunas anotaciones. La biblioteca en sí es bastante práctico y cuenta con muchas otras cosas a la vez que siendo muy enchufable. Puede echar un vistazo a él aquí: https://github.com/whimtrip/jwht-htmltopojo

Modo de empleo: Conceptos básicos

Imaginemos que necesitamos para analizar la siguiente página HTML:

<html>
    <head>
        <title>A Simple HTML Document</title>
    </head>
    <body>
        <div class="restaurant">
            <h1>A la bonne Franquette</h1>
            <p>French cuisine restaurant for gourmet of fellow french people</p>
            <div class="location">
                <p>in <span>London</span></p>
            </div>
            <p>Restaurant n*18,190. Ranked 113 out of 1,550 restaurants</p>  
            <div class="meals">
                <div class="meal">
                    <p>Veal Cutlet</p>
                    <p rating-color="green">4.5/5 stars</p>
                    <p>Chef Mr. Frenchie</p>
                </div>

                <div class="meal">
                    <p>Ratatouille</p>
                    <p rating-color="orange">3.6/5 stars</p>
                    <p>Chef Mr. Frenchie and Mme. French-Cuisine</p>
                </div>

            </div> 
        </div>    
    </body>
</html>

Vamos a crear los objetos POJO que queremos asignar a:

public class Restaurant {

    @Selector( value = "div.restaurant > h1")
    private String name;

    @Selector( value = "div.restaurant > p:nth-child(2)")
    private String description;

    @Selector( value = "div.restaurant > div:nth-child(3) > p > span")    
    private String location;    

    @Selector( 
        value = "div.restaurant > p:nth-child(4)"
        format = "^Restaurant n\*([0-9,]+). Ranked ([0-9,]+) out of ([0-9,]+) restaurants$",
        indexForRegexPattern = 1,
        useDeserializer = true,
        deserializer = ReplacerDeserializer.class,
        preConvert = true,
        postConvert = false
    )
    // so that the number becomes a valid number as they are shown in this format : 18,190
    @ReplaceWith(value = ",", with = "")
    private Long id;

    @Selector( 
        value = "div.restaurant > p:nth-child(4)"
        format = "^Restaurant n\*([0-9,]+). Ranked ([0-9,]+) out of ([0-9,]+) restaurants$",
        // This time, we want the second regex group and not the first one anymore
        indexForRegexPattern = 2,
        useDeserializer = true,
        deserializer = ReplacerDeserializer.class,
        preConvert = true,
        postConvert = false
    )
    // so that the number becomes a valid number as they are shown in this format : 18,190
    @ReplaceWith(value = ",", with = "")
    private Integer rank;

    @Selector(value = ".meal")    
    private List<Meal> meals;

    // getters and setters

}

Y ahora la clase Meal así:

public class Meal {

    @Selector(value = "p:nth-child(1)")
    private String name;

    @Selector(
        value = "p:nth-child(2)",
        format = "^([0-9.]+)\/5 stars$",
        indexForRegexPattern = 1
    )
    private Float stars;

    @Selector(
        value = "p:nth-child(2)",
        // rating-color custom attribute can be used as well
        attr = "rating-color"
    )
    private String ratingColor;

    @Selector(
        value = "p:nth-child(3)"
    )
    private String chefs;

    // getters and setters.
}

Nos proporcionó algunos más explicaciones sobre el código anterior en nuestra página de GitHub.

Por el momento, vamos a ver cómo se deben descartar esta.

private static final String MY_HTML_FILE = "my-html-file.html";

public static void main(String[] args) {


    HtmlToPojoEngine htmlToPojoEngine = HtmlToPojoEngine.create();

    HtmlAdapter<Restaurant> adapter = htmlToPojoEngine.adapter(Restaurant.class);

    // If they were several restaurants in the same page, 
    // you would need to create a parent POJO containing
    // a list of Restaurants as shown with the meals here
    Restaurant restaurant = adapter.fromHtml(getHtmlBody());

    // That's it, do some magic now!

}


private static String getHtmlBody() throws IOException {
    byte[] encoded = Files.readAllBytes(Paths.get(MY_HTML_FILE));
    return new String(encoded, Charset.forName("UTF-8"));

}

Otro pequeño ejemplo se puede encontrar aquí

Esperamos que esto ayude a alguien por ahí!

Mira en la biblioteca cURL. Nunca he utilizado en Java, pero estoy seguro de que debe haber fijaciones para ello. Básicamente, lo que va a hacer es enviar una solicitud cURL para cualquier página que desea 'roce'. La solicitud devolverá una cadena con el código fuente de la página. A partir de ahí, va a utilizar expresiones regulares para analizar todos los datos que desea desde el código fuente. Eso es por lo general de cómo se va a hacer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top