programacion - ¿Cómo se descarga programáticamente una página web en Java?
jlabel definicion (10)
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 pila 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
}
}
}
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?
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
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.
Esto funcionó para mí
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) {
}
}
}
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 here .
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.
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");
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 .
Usaría un analizador HTML decente como Jsoup . Entonces es tan fácil como:
String html = Jsoup.connect("http://.com").get().html();
Maneja GZIP y las respuestas fragmentadas y la codificación de caracteres de forma totalmente transparente. También ofrece más ventajas, como el traversing HTML y la manipulation 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 don''t desea ejecutar métodos de cadena básicos o incluso regex en HTML para procesarlo.
Ver también:
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= "<div class=/"description/">";
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( "</div>" );
url.setText( t2[0] );
}
catch (Exception e)
{
Toast.makeText( this,e.toString(),Toast.LENGTH_SHORT ).show();
}
}
// input, extrafunctionrunparallel, output
class DownloadCode extends AsyncTask<String,Void,String>
{
@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;
}
}
}