2010-05-14 14 views
41

Bueno, estoy intentando averiguar cómo obtener información de una página web y llevarla a mi programa (en Java).¿Cómo "escanear" un sitio web (o página) para obtener información y ponerlo en mi programa?

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

¿Cómo se llamaría este proceso? No tengo ni idea de comenzar siquiera 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

+1

Usted tiene un problema con LinkedList porque LinkedList.peekFirst apareció en Java 1.6, y parece que usa el oído lier version – zamza

+2

Este proceso se denomina comúnmente "screen scraping" y se usa cuando una API (como SOAP) no está disponible, pero sí una GUI web. Implica que su aplicación pretenda ser un navegador web y analizar las páginas HTML (más o menos) de forma manual. Le sugiero que considere una de las API enumeradas a continuación que automatizan gran parte del análisis sintáctico. –

Respuesta

83

Use un analizador HTML como Jsoup. Esto tiene mi preferencia por encima de other HTML parsers available in Java ya que es supportsjQuery como CSS selectors. Además, su clase que representa una lista de nodos, Elements, implementa Iterable de modo que usted puede iterar sobre ella en un enhanced for loop (lo que no hay necesidad de complicarse 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 latest Jsoup JAR file 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.

+1

¡Guau, esto es bueno! Tengo una pregunta, simplemente copié y pegué esto solo para hacer una prueba, pero sigo obteniendo este error (mira el OP editado) – James

+2

@James: Esto requiere al menos Java 1.6 (que ya ha salido en 3 años) . El método mencionado ['LinkedList # peekFirst()'] (http://java.sun.com/javase/6/docs/api/java/util/LinkedList.html#peekFirst%28%29) se introdujo en Java 1.6 . Actualice su JVM (JDK) o configure su IDE (Eclipse?) En el modo de cumplimiento de Java 6. – BalusC

+8

Si cualquier programador de .NET está interesado, he portado jsoup a .NET: http://nsoup.codeplex.com/. Espero que esto ayude a cualquiera. – GeReV

3

Usted puede usar un analizador html (muchos enlaces útiles aquí: java html parser).

El proceso se denomina 'contenido de sitio web atrapante'. Busque 'obtener contenido del sitio web java' para mayor inversión.

-1

Mire en la biblioteca cURL. Nunca lo he usado en Java, pero estoy seguro de que debe haber enlaces para ello. Básicamente, lo que harás es enviar una solicitud de cURL a la página que quieras 'rascar'. La solicitud devolverá una cadena con el código fuente a la página. A partir de ahí, usará regex para analizar los datos que desee del código fuente. Por lo general, así es como lo harás.

+3

[No use regex para analizar HTML] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454). – BalusC

9

Esto se conoce como raspado de pantalla, wikipedia tiene este artículo en los más específicos web scraping. Puede ser un desafío importante porque hay un HTML feo, defectuoso, roto, si no fuera por el navegador, así que buena suerte.

1

Es probable que desee ver el código HTML para ver si puede encontrar cadenas que son únicas y cerca de su texto, entonces puede usar línea/char-offsets para obtener los datos.

Podría ser incómodo en Java, si no hay clases XML similares a las que se encuentran en System.XML.Linq en C#.

4

El proceso en sí se denomina normalmente "raspado". Puede usar un analizador como TagSoup para procesar la página una vez que la haya obtenido.

4

Yo usaría JTidy - es similar a JSoup, pero no sé JSoup bien. JTidy maneja HTML roto y devuelve un Documento w3c, por lo que puede usarlo como fuente de XSLT para extraer el contenido que realmente le interesa.Si no conoce XSLT, entonces puede ir con JSoup, ya que el modelo de documento es más agradable para trabajar que w3c.

EDITAR: Un vistazo rápido en el sitio web JSoup muestra que JSoup puede ser la mejor opción. Parece ser compatible con los selectores de CSS para extraer elementos del documento. Puede ser mucho más fácil trabajar con esto que ingresar a XSLT.

1

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 llama raspando

+0

¿Por qué sería más fácil usar regex? He intentado con Regex y realmente no puedo manejar html en la vida real y es posiblemente peligroso usar parse html. Jsoup es una solución lista para usar, solo unos pocos códigos de línea y usted hace lo que necesite hacer con su html. – newbie

+0

Ejemplo simplificado: imagine que lo único que desea es extraer la fecha en que se generó la página. Entonces, verifica el html y ves algo como ' 07/07/07'. Bueno, entonces usaría String.indexOf o algunas de mis propias utilidades como textBetween ("", ""). Un beneficio adicional es que no tiene que analizar todo el html. Tuve éxito extrayendo datos de html con una clase doméstica de StringScanner con métodos como moveBefore (String what), moveAfter (String what), getTextUpTo (String what), ... Todo depende de lo complicado que sea su problema. – Anton

1

También puedes probar jARVEST.

Está basado en un JRuby DSL sobre un motor puramente Java para transformar sitios web de araña raspa.

Ejemplo:

Encuentra 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); 
    } 
Cuestiones relacionadas