2011-09-20 6 views
29

Sono un principiante di Java e il mio primo compito è analizzare alcuni 10.000 URL e estrarre alcune informazioni da esso, per questo sto usando Jsoup e funziona correttamente. Ma ora voglio aggiungere supporto proxy ad esso. I proxy hanno anche un nome utente e una password. Qualunque cosa può aiutarmi con questo. GrazieCome aggiungere il supporto proxy a Jsoup (parser HTML)?

+0

Hmm, Hai provato a usare HtmlUnit invece? Questo dovrebbe essere il compito – raven

+0

http://stackoverflow.com/questions/120797/how-do-i-set-the-proxy-to-be-used-by-the-jvm – swanliu

+0

yah ho usato ma io penso ancora che jsoup funzioni meglio per le mie esigenze. Tutto ciò che ho confuso è come lavorare efficientemente con i proxy usando jsoup. – Himanshu

risposta

25

Non è necessario ottenere i dati della pagina Web tramite Jsoup. Ecco la mia soluzione, potrebbe non essere la migliore però.

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

Ed eccolo. Ciò ottiene l'origine della pagina html attraverso un proxy e quindi lo analizza con Jsoup.

+0

buona soluzione. c'è un modo in cui posso usare il phishing basato su NIO dopo uc.connect? – danielad

+0

Per il lettore occasionale, è possibile passare direttamente a Jsoup l'inputstream di HttpURLConnection. Vedere la seguente risposta per i dettagli: http://stackoverflow.com/a/42085445/363573 – Stephan

+0

Vedere anche questa soluzione solo Jsoup: http://stackoverflow.com/a/34943161/363573 – Stephan

63

Si può facilmente impostare delega

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

Grazie! Troppo facile. – vikingsteve

+0

e non dimenticare di impostare il valore null dopo la chiamata, altrimenti le altre chiamate che non ne hanno bisogno saranno molto lente – Dejell

+0

Facile, veloce e funzionante. Questa risposta potrebbe essere accettata. – Gondy

13

e se siete dopo HTTPS come me, ricordatevi di provare

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

Vedere anche questa soluzione non a livello di sistema: http://stackoverflow.com/a/34943161/363573 – Stephan

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

Questa è la soluzione sbagliata, perché l'analisi è di solito multithreaded e di solito abbiamo bisogno di cambiare i proxy. Questo codice imposta solo un proxy per tutti i thread. Quindi meglio non usare Jsoup.Connection.

+0

In questo caso, aprire la connessione URL per Jsoup e assegnargli l'inputstream dell'URL per l'analisi. @ La soluzione di Ryan descrive questo: http://stackoverflow.com/a/8445790/363573 – Stephan

3

Come si potrebbe aggiungere questo prima di eseguire il programma di

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"); 
.. 
17

Prima Jsoup 1.9.1:

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

Jsoup 1.9.1 e superiori: (meno codice per scrivere)

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

Riferimenti:

0

provare questo codice invece:

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

Jsoup non supporta l'utilizzo di proxy, dal v1.9.1.Connection class ha i seguenti metodi:

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

che si può utilizzare in questo modo:

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

Se avete bisogno di autenticazione, è possibile utilizzare l'approccio Authenticator menzionato per @Navneet Swaminathan o semplicemente impostare system properties:

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

o

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