Comment programmer le téléchargement D'une page Web en Java

j'aimerais pouvoir récupérer le html d'une page web et le sauvegarder dans un String , pour que je puisse le traiter. En outre, comment pourrais-je gérer divers types de compression.

Comment faire avec Java?

111
demandé sur jjnguy 2008-10-26 23:16:18

10 réponses

voici du code testé en utilisant la classe Java URL . Je recommande de faire un meilleur travail que je ne le fais ici de gérer les exceptions ou de les passer dans la pile d'appels, cependant.

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
        }
    }
}
100
répondu Bill the Lizard 2013-08-20 21:08:21

j'utiliserais un analyseur HTML décent comme Jsoup . C'est aussi simple que:

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

il gère de manière totalement transparente GZIP et chunked les réponses et l'encodage des caractères. Il offre aussi plus d'avantages, comme HTML traverser et manipulation par les sélecteurs CSS comme jQuery peut le faire. Vous n'avez qu'à le saisir comme Document , pas comme String .

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

Vous avez vraiment ne pas voulez exécuter de base de la Chaîne de méthodes ou même regex sur le code HTML.

voir aussi:

161
répondu BalusC 2017-05-23 11:47:23

la réponse de Bill est très bonne, mais vous pourriez vouloir faire certaines choses avec la requête comme la compression ou les user-agents. Le code suivant montre comment vous pouvez différents types de compression à vos requêtes.

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

pour définir aussi l'User-agent ajouter le code suivant:

conn.setRequestProperty ( "User-agent", "my agent name");
23
répondu jjnguy 2010-04-06 05:23:37

Eh bien , vous pouvez aller avec les bibliothèques intégrées telles que URL et URLConnection , mais ils ne donnent pas beaucoup de contrôle.

personnellement, J'irais avec la bibliothèque Apache HTTPClient .

modifier: HTTPClient a été défini à end of life par Apache. Le remplacement est: HTTP Composants

12
répondu Jon Skeet 2014-11-11 18:56:47

toutes les approches mentionnées ci-dessus ne téléchargent pas le texte de la page Web tel qu'il apparaît dans le navigateur. ces jours, beaucoup de données sont chargées dans les navigateurs via des scripts dans les pages html. aucune des techniques mentionnées ci-dessus ne supporte les scripts, ils ne téléchargent que le texte html. HTMLUNIT supporte les javascripts. donc, si vous cherchez à télécharger le texte de la page web comme il regarde dans le navigateur, alors vous devez utiliser HTMLUNIT .

6
répondu user3690910 2014-05-30 10:30:16

sur une machine Unix/Linux, vous pouvez simplement lancer "wget", mais ce n'est pas vraiment une option si vous écrivez un client multiplate-forme. Bien sûr, cela suppose que vous ne voulez pas vraiment faire grand chose avec les données que vous téléchargez entre le point de téléchargement et il frapper le disque.

0
répondu Timo Geusch 2008-10-26 20:43:45

essayez la bibliothèque 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);
    }
}

vous pouvez télécharger la bibliothèque jsoup ici .

0
répondu Deepak Prathapani 2014-05-21 10:00:29

Jetty a un client HTTP qui peut être utilisé pour télécharger une page 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();
            }
        }
    }
}

l'exemple imprime le contenu d'une simple page web.

dans un lecture d'une page Web en Java tutorial j'ai écrit six exemples de téléchargement d'une page Web programmaticaly en Java en utilisant URL, Jsoup, HtmlCleaner, Apache HttpClient, Jetty HttpClient, et HtmlUnit.

0
répondu Jan Bodnar 2016-08-18 16:42:58

obtenez de l'aide de cette classe il obtenir le code et filtrer certaines informations.

public class MainActivity extends Appcompatibility {

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

}

0
répondu Sohaib Aslam 2017-12-16 17:23:19

j'ai utilisé la réponse actuelle à ce post ( url ) et l'écriture de la sortie dans un fichier.

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) {

        }

    }
}
-1
répondu A_01 2018-07-27 12:42:29