¿Cómo se descarga programáticamente una página web en Java?

Me gustaría poder buscar el html de una página web y guardarlo en un String , para poder procesarlo. Además, ¿cómo podría manejar varios tipos de compresión?

¿Cómo podría hacer eso usando Java?

Aquí hay algunos códigos probados usando la clase de URL de Java. Sin embargo, recomendaría hacer un mejor trabajo que el que hago aquí al manejar las excepciones o pasarlas por la stack de llamadas.

 public static void main(String[] args) { URL url; InputStream is = null; BufferedReader br; String line; try { url = new URL("http://stackoverflow.com/"); is = url.openStream(); // throws an IOException br = new BufferedReader(new InputStreamReader(is)); while ((line = br.readLine()) != null) { System.out.println(line); } } catch (MalformedURLException mue) { mue.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { if (is != null) is.close(); } catch (IOException ioe) { // nothing to see here } } } 

Usaría un analizador HTML decente como Jsoup . Entonces es tan fácil como:

 String html = Jsoup.connect("http://stackoverflow.com").get().html(); 

Maneja GZIP y las respuestas fragmentadas y la encoding de caracteres de forma totalmente transparente. También ofrece más ventajas, como el desplazamiento de HTML y la manipulación por selectores de CSS, como lo hace jQuery. Solo tiene que tomarlo como Document , no como una String .

 Document document = Jsoup.connect("http://google.com").get(); 

Realmente no desea ejecutar métodos de cadena básicos o incluso regex en HTML para procesarlo.

Ver también:

  • ¿Cuáles son los pros y los contras de los principales analizadores de HTML en Java?

La respuesta de Bill es muy buena, pero es posible que desee hacer algunas cosas con la solicitud como compresión o user-agents. El siguiente código muestra cómo puede varios tipos de compresión para sus solicitudes.

 URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // Cast shouldn't fail HttpURLConnection.setFollowRedirects(true); // allow both GZip and Deflate (ZLib) encodings conn.setRequestProperty("Accept-Encoding", "gzip, deflate"); String encoding = conn.getContentEncoding(); InputStream inStr = null; // create the appropriate stream wrapper based on // the encoding type if (encoding != null && encoding.equalsIgnoreCase("gzip")) { inStr = new GZIPInputStream(conn.getInputStream()); } else if (encoding != null && encoding.equalsIgnoreCase("deflate")) { inStr = new InflaterInputStream(conn.getInputStream(), new Inflater(true)); } else { inStr = conn.getInputStream(); } 

Para configurar también user-agent agregue el siguiente código:

 conn.setRequestProperty ( "User-agent", "my agent name"); 

Bueno, podría ir con las bibliotecas incorporadas, como URL y URLConnection , pero no le dan mucho control.

Personalmente, me gustaría ir con la biblioteca HTTPClient de Apache .
Editar: HTTPClient ha sido configurado para el final de la vida por Apache. El reemplazo es: componentes de HTTP

Todos los enfoques mencionados anteriormente no descargan el texto de la página web como se ve en el navegador. en estos días, una gran cantidad de datos se cargan en los navegadores a través de scripts en páginas html. ninguna de las técnicas mencionadas anteriormente admite scripts, solo descarga el texto html solamente. HTMLUNIT es compatible con los javascripts. así que si está buscando descargar el texto de la página web como se ve en el navegador, entonces debe usar HTMLUNIT .

En un cuadro de Unix / Linux, simplemente podría ejecutar ‘wget’, pero esto no es realmente una opción si está escribiendo un cliente multiplataforma. Por supuesto, esto supone que realmente no desea hacer mucho con los datos que descarga entre el momento de descargarlo y el de golpear el disco.

Intenta 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í .

Jetty tiene un cliente HTTP que puede usarse para descargar una página web.

 package com.zetcode; import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.api.ContentResponse; public class ReadWebPageEx5 { public static void main(String[] args) throws Exception { HttpClient client = null; try { client = new HttpClient(); client.start(); String url = "http://www.something.com"; ContentResponse res = client.GET(url); System.out.println(res.getContentAsString()); } finally { if (client != null) { client.stop(); } } } } 

El ejemplo imprime los contenidos de una página web simple.

En una página web de Lectura en Java , he escrito seis ejemplos de descarga de una página web programáticamente en Java utilizando URL, JSoup, HtmlCleaner, Apache HttpClient, Jetty HttpClient y HtmlUnit.

Obtenga ayuda de esta clase para obtener código y filtrar cierta información.

la clase pública MainActivity extiende AppCompatActivity {

 EditText url; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate( savedInstanceState ); setContentView( R.layout.activity_main ); url = ((EditText)findViewById( R.id.editText)); DownloadCode obj = new DownloadCode(); try { String des=" "; String tag1= "
"; String l = obj.execute( "http://www.nu.edu.pk/Campus/Chiniot-Faisalabad/Faculty" ).get(); url.setText( l ); url.setText( " " ); String[] t1 = l.split(tag1); String[] t2 = t1[0].split( "
" ); url.setText( t2[0] ); } catch (Exception e) { Toast.makeText( this,e.toString(),Toast.LENGTH_SHORT ).show(); } } // input, extrafunctionrunparallel, output class DownloadCode extends AsyncTask { @Override protected String doInBackground(String... WebAddress) // string of webAddress separate by ',' { String htmlcontent = " "; try { URL url = new URL( WebAddress[0] ); HttpURLConnection c = (HttpURLConnection) url.openConnection(); c.connect(); InputStream input = c.getInputStream(); int data; InputStreamReader reader = new InputStreamReader( input ); data = reader.read(); while (data != -1) { char content = (char) data; htmlcontent+=content; data = reader.read(); } } catch (Exception e) { Log.i("Status : ",e.toString()); } return htmlcontent; } }

}

Utilicé la respuesta real a esta publicación ( url ) y escribí el resultado en un archivo.

 package test; import java.net.*; import java.io.*; public class PDFTest { public static void main(String[] args) throws Exception { try { URL oracle = new URL("http://www.fetagracollege.org"); BufferedReader in = new BufferedReader(new InputStreamReader(oracle.openStream())); String fileName = "D:\\a_01\\output.txt"; PrintWriter writer = new PrintWriter(fileName, "UTF-8"); OutputStream outputStream = new FileOutputStream(fileName); String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println(inputLine); writer.println(inputLine); } in.close(); } catch(Exception e) { } } }