Pregunta

Me gustaría usar Java para obtener la fuente de un sitio web (seguro) y luego analizar ese sitio web para ver los enlaces que contiene. He encontrado cómo conectarme a esa URL, pero luego, ¿cómo puedo obtener fácilmente la fuente, prefiriéndome como el DOM Document bear para poder obtener fácilmente la información que quiero?

¿O hay una mejor manera de conectarse al sitio https, obtener la fuente (que tengo que hacer para obtener una tabla de datos ... es bastante simple), entonces esos enlaces son archivos que voy a descargar.

Desearía que fuera FTP, pero estos son archivos almacenados en mi tivo (quiero descargarlos mediante programación a mi computadora (

¿Fue útil?

Solución

Puede obtener un nivel bajo y simplemente solicitarlo con un socket. En java parece

// Arg[0] = Hostname
// Arg[1] = File like index.html
public static void main(String[] args) throws Exception {
    SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();

    SSLSocket sslsock = (SSLSocket) factory.createSocket(args[0], 443);

    SSLSession session = sslsock.getSession();
    X509Certificate cert;
    try {
        cert = (X509Certificate) session.getPeerCertificates()[0];
    } catch (SSLPeerUnverifiedException e) {
        System.err.println(session.getPeerHost() + " did not present a valid cert.");
        return;
    }

    // Now use the secure socket just like a regular socket to read pages.
    PrintWriter out = new PrintWriter(sslsock.getOutputStream());
    out.write("GET " + args[1] + " HTTP/1.0\r\n\r\n");
    out.flush();

    BufferedReader in = new BufferedReader(new InputStreamReader(sslsock.getInputStream()));
    String line;
    String regExp = ".*<a href=\"(.*)\">.*";
    Pattern p = Pattern.compile( regExp, Pattern.CASE_INSENSITIVE );

    while ((line = in.readLine()) != null) {
        // Using Oscar's RegEx.
        Matcher m = p.matcher( line );  
        if( m.matches() ) {
            System.out.println( m.group(1) );
        }
    }

    sslsock.close();
}

Otros consejos

Probablemente podría obtener mejores resultados de las opciones de Pete o sktrdie. Aquí hay una forma adicional si desea saber cómo hacerlo & Quot; by had & Quot;

No soy muy bueno en expresiones regulares, por lo que en este caso devuelve el último enlace de una línea. Bueno, es un comienzo.

import java.io.*;
import java.net.*;
import java.util.regex.*;

public class Links { 
    public static void main( String [] args ) throws IOException  { 

        URL url = new URL( args[0] );
        InputStream is = url.openConnection().getInputStream();

        BufferedReader reader = new BufferedReader( new InputStreamReader( is )  );

        String line = null;
        String regExp = ".*<a href=\"(.*)\">.*";
        Pattern p = Pattern.compile( regExp, Pattern.CASE_INSENSITIVE );

        while( ( line = reader.readLine() ) != null )  {
            Matcher m = p.matcher( line );  
            if( m.matches() ) {
                System.out.println( m.group(1) );
            }
        }
        reader.close();
    }
}

EDIT

Vaya, me perdí totalmente el " seguro " parte. De todos modos no pude evitarlo, tuve que escribir esta muestra: P

Pruebe HttpUnit o HttpClient . Aunque el primero es aparentemente para escribir pruebas de integración, tiene una API conveniente para iterar mediante programación a través de los enlaces de una página web, con algo como el siguiente uso de WebResponse.getLinks () :

WebConversation wc = new WebConversation();
WebResponse resp = wc.getResponse("http://stackoverflow.com/questions/422970/");
WebLink[] links = resp.getLinks();
// Loop over array of links...

Puede usar javacurl para obtener el html del sitio y java DOM para analizarlo.

Intente usar la biblioteca jsoup.

import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;


public class ParseHTML {

    public static void main(String args[]) throws IOException{
        Document doc = Jsoup.connect("https://www.wikipedia.org/").get();
        String text = doc.body().text();

        System.out.print(text);
    }
}

Puede descargar la biblioteca jsoup aquí .

Hay dos significados de fuente en un contexto web:

La fuente HTML: Si solicita una página web por URL, siempre obtiene el código fuente HTML. De hecho, no hay nada más que pueda obtener de la URL. Las páginas web siempre se transmiten en forma de fuente, no existe una página web compilada . Y para lo que está intentando, esto debería ser suficiente para cumplir con su tarea.

Fuente del script: Si la página web se genera dinámicamente, se codifica en algún lenguaje de script del lado del servidor (como PHP, Ruby, JSP ...). También existe un código fuente en este nivel. Pero al usar una conexión HTTP no puede obtener este tipo de código fuente. Esta no es una característica faltante sino completamente a propósito.

Análisis: Dicho esto, tendrá que analizar de alguna manera el código HTML. Si solo necesita los enlaces, usar un RegEx (como mostró Oscar Reyes) será el enfoque más práctico, pero también podría escribir un analizador simple & Quot; manualmente & Quot ;. Sería lento, más código ... pero funciona.

Si desea acceder al código en un nivel más lógico, analizarlo en un DOM sería el camino a seguir. Si el código es XHTML válido , simplemente puede analizarlo en un documento org.w3c.dom. y hacer cualquier cosa con él. Si es al menos HTML válido , puede aplicar algunos trucos para convertirlo a XHTML (en algunos casos raros, reemplazar & Lt; br & Gt; por & Lt; br / > y cambiar el doctype es suficiente) y usarlo como XML.

Si no es XML válido, necesitaría un analizador HTML DOM. No tengo idea si existe tal cosa para Java y si funciona bien.

Existe un servidor FTP que se puede instalar en su Tivo para permitir descargas de programas, consulte aquí http://dvrpedia.com / MFS_FTP

La pregunta está formulada de manera diferente (cómo manejar http / html en java) pero al final mencionas que lo que quieres es descargar programas. Tivo utiliza su propio sistema de archivos (MFS - Media File System), por lo que no es fácil montar el disco en otra máquina; en cambio, es más fácil ejecutar el servidor http o ftp en el Tivo y descargarlo desde ellos

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