web-dev-qa-db-fra.com

Comment télécharger par programme une page Web dans Java

Je voudrais pouvoir récupérer le code HTML d'une page Web et l'enregistrer dans un fichier String afin de pouvoir le traiter. Aussi, comment pourrais-je gérer différents types de compression.

Comment pourrais-je m'y prendre avec Java?

116
jjnguy

Voici du code testé utilisant la classe URL de Java. Je recommanderais toutefois de faire un meilleur travail que moi ici en gérant les exceptions ou en les transmettant à 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
        }
    }
}
104
Bill the Lizard

Je voudrais utiliser un analyseur HTML décent comme Jsoup . C'est aussi simple que:

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

Il gère les réponses GZIP et fragmentées ainsi que l’encodage des caractères de manière totalement transparente. Il offre également plus d'avantages, comme HTML traversant et manipulation par des sélecteurs CSS comme le peut le faire jQuery. Vous devez seulement le saisir en tant que Document, pas en tant que String.

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

Vous voulez vraiment ne pas vouloir exécuter des méthodes de base String ou même regex sur HTML pour le traiter.

Voir également:

169
BalusC

La réponse de Bill est très bonne, mais vous voudrez peut-être faire certaines choses avec la demande, comme la compression ou les agents utilisateurs. Le code suivant montre comment vous pouvez utiliser différents types de compression pour vos demandes.

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 également l'agent utilisateur, ajoutez le code suivant:

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

Eh bien, vous pouvez utiliser les bibliothèques intégrées telles que URL et RLConnection , mais elles ne donnent pas beaucoup de contrôle .

Personnellement, j'irais avec la bibliothèque Apache HTTPClient .
Edit: HTTPClient a été défini sur fin de vie par Apache. Le remplacement est: Composants HTTP

12
Jon Skeet

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. De nos jours, beaucoup de données sont chargées dans les navigateurs via des scripts en pages HTML. Aucune des techniques mentionnées ci-dessus ne prend en charge les scripts, ils téléchargent simplement le texte HTML uniquement. HTMLUNIT supporte les javascripts. donc, si vous souhaitez télécharger le texte de la page Web tel qu’il apparaît dans le navigateur, vous devez utiliser HTMLUNIT .

7
user3690910

Vous aurez probablement besoin d'extraire du code depuis une page Web sécurisée (protocole https). Dans l'exemple suivant, le fichier HTML est en cours d'enregistrement dans c:\temp\nomfichier.html Enjoy!

import Java.io.BufferedReader;
import Java.io.BufferedWriter;
import Java.io.FileWriter;
import Java.io.InputStream;
import Java.io.InputStreamReader;
import Java.net.URL;

import javax.net.ssl.HttpsURLConnection;

/**
 * <b>Get the Html source from the secure url </b>
 */
public class HttpsClientUtil {
    public static void main(String[] args) throws Exception {
        String httpsURL = "https://stackoverflow.com";
        String FILENAME = "c:\\temp\\filename.html";
        BufferedWriter bw = new BufferedWriter(new FileWriter(FILENAME));
        URL myurl = new URL(httpsURL);
        HttpsURLConnection con = (HttpsURLConnection) myurl.openConnection();
        con.setRequestProperty ( "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0" );
        InputStream ins = con.getInputStream();
        InputStreamReader isr = new InputStreamReader(ins, "Windows-1252");
        BufferedReader in = new BufferedReader(isr);
        String inputLine;

        // Write each line into the file
        while ((inputLine = in.readLine()) != null) {
            System.out.println(inputLine);
            bw.write(inputLine);
        }
        in.close(); 
        bw.close();
    }
}
1
QA Specialist

Obtenez de l'aide de cette classe pour obtenir du code et filtrer certaines informations.

public class MainActivity extends 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;
        }
    }
}
0
Sohaib Aslam

Essayez d'utiliser 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
optimus0127

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 tutoriel, j'ai écrit six exemples de téléchargement d'une page Web par programmation dans Java en utilisant une URL, JSoup, HtmlCleaner, Apache HttpClient, Jetty HttpClient et HtmlUnit.

0
Jan Bodnar

Sur un système Unix/Linux, vous pouvez simplement exécuter "wget", mais ce n’est pas vraiment une option si vous écrivez un client multiplate-forme. Bien entendu, cela suppose que vous ne voulez pas vraiment faire grand chose avec les données que vous téléchargez, entre le moment où vous les téléchargez et le moment où elles sont stockées sur le disque.

0
Timo Geusch