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

Je voudrais pouvoir récupérer le fichier HTML d’une page Web et l’enregistrer dans une Ssortingng afin de pouvoir le traiter. Comment puis-je gérer différents types de compression?

Comment pourrais-je faire cela en utilisant Java?

Voici quelques codes testés utilisant la classe URL de Java. Je recommande toutefois de faire un meilleur travail que moi pour gérer les exceptions ou les transférer à la stack d’appels.

 public static void main(Ssortingng[] args) { URL url; InputStream is = null; BufferedReader br; Ssortingng 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 } } } 

J’utiliserais un parsingur HTML décent comme Jsoup . C’est alors aussi simple que:

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

Il gère les réponses GZIP et fragmentées et l’encodage des caractères de manière totalement transparente. Il offre également plus d’avantages, comme le déplacement et la manipulation du code HTML par des sélecteurs CSS comme le fait jQuery. Vous n’avez qu’à l’attraper en tant que Document , pas en tant que Ssortingng .

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

Vous ne voulez vraiment pas exécuter les méthodes Ssortingng de base, ni même utiliser regex en HTML pour le traiter.

Voir également:

  • Quels sont les avantages et les inconvénients des principaux parsingurs HTML en Java?

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 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"); Ssortingng 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"); 

Eh bien, vous pourriez 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 .
Edit: HTTPClient a été mis en fin de vie par Apache. Le remplacement est: Composants HTTP

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-ci, beaucoup de données sont chargées dans les navigateurs via des scripts au format HTML. aucune des techniques mentionnées ci-dessus ne supporte les scripts, elles ne font que télécharger le texte HTML uniquement. HTMLUNIT prend en charge les javascripts. Par conséquent, si vous souhaitez télécharger le texte de la page Web dans le navigateur, vous devez utiliser HTMLUNIT .

Sur une machine Unix / Linux, vous pouvez simplement lancer wget, mais ce n’est pas vraiment une option si vous écrivez un client multi-plateforme. 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 moment de le télécharger et celui du disque.

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(Ssortingng args[]) throws IOException{ Document doc = Jsoup.connect("https://www.wikipedia.org/").get(); Ssortingng text = doc.body().text(); System.out.print(text); } } 

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

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(Ssortingng[] args) throws Exception { HttpClient client = null; try { client = new HttpClient(); client.start(); Ssortingng url = "http://www.something.com"; ContentResponse res = client.GET(url); System.out.println(res.getContentAsSsortingng()); } finally { if (client != null) { client.stop(); } } } } 

L’exemple imprime le contenu d’une page Web simple.

Dans un didacticiel Lecture d’une page Web en Java, j’ai écrit six exemples de téléchargement d’une page Web programmable en Java à l’aide d’URL, JSoup, HtmlCleaner, Apache HttpClient, Jetty HttpClient et HtmlUnit.

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

la classe publique MainActivity étend 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 { Ssortingng des=" "; Ssortingng tag1= "
"; Ssortingng l = obj.execute( "http://www.nu.edu.pk/Campus/Chiniot-Faisalabad/Faculty" ).get(); url.setText( l ); url.setText( " " ); Ssortingng[] t1 = l.split(tag1); Ssortingng[] t2 = t1[0].split( "
" ); url.setText( t2[0] ); } catch (Exception e) { Toast.makeText( this,e.toSsortingng(),Toast.LENGTH_SHORT ).show(); } } // input, extrafunctionrunparallel, output class DownloadCode extends AsyncTask { @Override protected Ssortingng doInBackground(Ssortingng... WebAddress) // ssortingng of webAddress separate by ',' { Ssortingng 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.toSsortingng()); } return htmlcontent; } }

}

J’ai utilisé la réponse à ce post ( url ) et écrit la sortie dans un fichier.

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