Remarque: Le code suivant est basé sur HttpClient4.5.2.
Il s'agit d'une tâche plus facile d'implémenter la demande GET Crawling des pages Web à l'aide de HTTPClient de Java:
Public Static String Get (URL de chaîne) {CloseableHttpResponSponse = null; BufferedReader dans = null; Résultat de chaîne = ""; essayez {clôturehttpclienthttppclient = httpclients.CreateDefault (); HttpGetThttpget = new httpget (url); Response = httppClient.Execute (httpget); dans = new BufferedReader (new inputStreamReader (réponse.getEntity (). getContent ())); StringBuffersB = new StringBuffer (""); Chaîne line = ""; String nl = System.getProperty ("line.separator"); while ((line = in.readline ())! = null) {sb.append (line + nl); } in.close (); result = sb.toString (); } catch (ioException e) {e.printStackTrace (); } enfin {try {if (null! = réponse) réponse.close (); } catch (ioException e) {e.printStackTrace (); }} Retour Résultat; }La méthode ci-dessus est également utile lors de l'exécution multi-thread des demandes GET. Cependant, cette demande multi-thread est basée sur la création d'une instance httpClient à chaque fois que la méthode GET est appelée. Chaque instance httpclient est recyclée une fois. Ce n'est évidemment pas une implémentation optimale.
HTTPClient fournit une solution de demande multi-thread, et vous pouvez afficher le document officiel "Pooring Connection Manager". Les demandes multipliées d'implémentation HTTPClient sont implémentées en fonction du pool de connexion intégré, qui a une classe clé, à savoir la mise en commun de la mise en commun du pool de connexion HTTPClient. Il existe deux méthodes clés disponibles dans PooringHttpClientConnectionManager: setMextotal et setDefaultMaxPerRoute. SetMextotal définit le nombre maximum de connexions au pool de connexions et SetDefaultMaxPerRoute définit le nombre de connexions par défaut sur chaque route. Il existe également une méthode setMaxPerRoute - Définissez séparément le nombre maximum de connexions pour un certain site, comme ceci:
HttphoSthost = new httphost ("LocaHost", 80); CM.SetMaxPerRoute (New Httproute (hôte), 50);Notre implémentation de la demande GET est légèrement ajustée en fonction de la documentation:
package com.zhyea.robin; import org.apache.http.client.methods.closeablehttpresponse; import org.apache.http.client.methods.httpget; import org.apache.http.impl.client.closeablehttpclient; import org.apache.http.impl.client.httpclient; import; org.apache.http.impl.conn.poolinghttpclientConnectionManager; Importer java.io.bufferedReader; import java.io.ioException; import java.io.inputStreamReader; classe publique httputil {private static closeableHttpClientHttpClient; statique {PooringHttpClientConnectionManagerCm = new PooringHttpClientConnectionManager (); CM.SetMextotal (200); cm.SetDefaultMaxPerRoute (20); CM.SetDefaultMaxPerRoute (50); httpClient = httpClients.Custom (). setConnectionManager (cm) .build (); } public static String get (string url) {clôturehttpResponsponse = null; BufferedReaderin = null; Résultat de chaîne = ""; essayez {httpGetThttpget = new httpget (url); réponse = httpClient.Exécute (httpget); dans = new BufferedReader (new inputStreamReader (réponse.getEntity (). getContent ())); StringBuffersB = new StringBuffer (""); Chaîne line = ""; String nl = System.getProperty ("line.separator"); while ((line = in.readline ())! = null) {sb.append (line + nl); } in.close (); result = sb.toString (); } catch (ioException e) {e.printStackTrace (); } enfin {try {if (null! = réponse) réponse.close (); } catch (ioException e) {e.printStackTrace (); }} Retour Résultat; } public static void main (String [] args) {System.out.println (get ("https://www.baidu.com/")); }}C'est à peu près tout. Mais pour moi, je préfère la mise en œuvre courante du pclient http. Par exemple, la demande HTTP GET que nous venons d'implémenter peut être implémentée simplement comme celle-ci:
package com.zhyea.robin; import org.apache.http.client.fluent.request; import java.io.ioException; classe publique httputil {public static string get (string url) {string result = ""; try {result = request.get (url) .connectTimeout (1000) .sockettimeout (1000) .ExECUTE (). returnContent (). Asstring (); } catch (ioException e) {e.printStackTrace (); } Retour Résultat; } public static void main (String [] args) {System.out.println (get ("https://www.baidu.com/")); }}Tout ce que nous avons à faire est de remplacer la dépendance HTTPClient précédente par une dépendance à HC fluide:
<dependency> <proupId> org.apache.httpComponents </rom groupeid> <ArtifActid> Fluent-hc </lefactive> <version> 4.5.2 </-version> </Dependance>
Et cette mise en œuvre fluide est naturellement réalisée en utilisant la mise en poolHttpClientConnectionManager. Les valeurs de Maxtotal et defaultMaxPerRoute qu'il définit est respectivement de 200 et 100:
Connmgr = nouveau PooringHttpClientConnectionManager (SFR); Connmgr.setDefaultMaxPerRoute (100); Connmgr.setMextotal (200);
La seule chose qui rend les gens bouleversés, c'est que l'exécuteur testamentaire ne fournit pas de moyen d'ajuster ces deux valeurs. Mais cela suffit. Si cela ne fonctionne vraiment pas, vous pouvez également envisager de réécrire la méthode de l'exécuteur, puis d'utiliser directement l'exécuteur pour exécuter la demande GET:
Executor.NewInstance (). Execute (request.get (URL)) .reTurnContent (). Asstring ();
C'est tout!