¿Cómo agregar soporte de proxy a Jsoup (analizador de HTML)?

Soy un novato en Java y mi primera tarea es analizar unas 10.000 URL y extraer alguna información de ella, para esto estoy usando Jsoup y está funcionando bien. Pero ahora quiero agregar soporte proxy para ello. Los Proxies también tienen un nombre de usuario y contraseña. ¿Puede alguien ayudarme con esto? Gracias

No es necesario que obtenga los datos de la página web a través de Jsoup. Esta es mi solución, aunque tal vez no sea la mejor.

URL url = new URL("http://www.example.com/"); Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8080)); // or whatever your proxy is HttpURLConnection uc = (HttpURLConnection)url.openConnection(proxy); uc.connect(); String line = null; StringBuffer tmp = new StringBuffer(); BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream())); while ((line = in.readLine()) != null) { tmp.append(line); } Document doc = Jsoup.parse(String.valueOf(tmp)); 

Y ahí está. Esto obtiene la fuente de la página html a través de un proxy y luego la analiza con Jsoup.

Usted puede configurar fácilmente el proxy

 System.setProperty("http.proxyHost", "192.168.5.1"); System.setProperty("http.proxyPort", "1080"); Document doc = Jsoup.connect("www.google.com").get(); 

Jsoup 1.9.1 y superior: (enfoque recomendado)

 // Fetch url with proxy Document doc = Jsoup // .connect("http://www.example.com/") // .proxy("127.0.0.1", 8080) // sets a HTTP proxy .userAgent("Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2") // .header("Content-Language", "en-US") // .get(); 

También puede usar el sobrecarga Jsoup # proxy que toma una clase Proxy .

Antes de Jsoup 1.9.1: (enfoque detallado)

 // Setup proxy Proxy proxy = new Proxy( // Proxy.Type.HTTP, // InetSocketAddress.createUnresolved("127.0.0.1", 8080) // ); // Fetch url with proxy Document doc = Jsoup // .connect("http://www.example.com/") // .proxy(proxy) // .userAgent("Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2") // .header("Content-Language", "en-US") // .get(); 

Referencias

  • Connection # proxy (String, int)
  • Connection # proxy (Proxy)
  • Clase Proxy

y si buscas HTTPS como yo, recuerda intentar

 System.setProperty("https.proxyHost", "192.168.5.1"); System.setProperty("https.proxyPort", "1080"); Document doc = Jsoup.connect("www.google.com").get(); 
 System.setProperty("http.proxyHost", "192.168.5.1"); System.setProperty("http.proxyPort", "1080"); Document doc = Jsoup.connect("www.google.com").get(); 

Esta es una solución incorrecta, porque el análisis suele ser multiproceso y por lo general necesitamos cambiar los proxies. Este código establece solo un proxy para todos los hilos. Así que mejor no usar Jsoup.Connection.

Es posible que desee agregar esto antes de ejecutar el progtwig

 final String authUser = "USERNAME"; final String authPassword = "PASSWORD"; Authenticator.setDefault( new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication( authUser, authPassword.toCharArray()); } } ); .. System.setProperty("http.proxyHost", "192.168.5.1"); System.setProperty("http.proxyPort", "1080"); .. 

Jsoup admite el uso de proxies , ya que v1.9.1 . Connection clase de Connection tiene los siguientes métodos:

  • proxy(Proxy p)
  • proxy(String host, int port)

Que puedes usar de esta manera:

 Jsoup.connect("...url...").proxy("127.0.0.1", 8080); 

Si necesita autenticación, puede usar el enfoque de Authenticator mencionado por @Navneet Swaminathan o simplemente establecer las propiedades del sistema :

 System.setProperty("http.proxyUser", "username"); System.setProperty("http.proxyPassword", "password"); 

o

 System.setProperty("https.proxyUser", "username"); System.setProperty("https.proxyPassword", "password"); 

Pruebe este código en su lugar:

 URL url = new URL("http://www.example.com/"); Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8080)); // or whatever your proxy is HttpURLConnection uc = (HttpURLConnection)url.openConnection(proxy); hc.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); uc.setRequestProperty("Content-Language", "en-US"); uc.setRequestMethod("GET"); uc.connect(); Document doc = Jsoup.parse(uc.getInputStream());