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)?
risposta
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.
buona soluzione. c'è un modo in cui posso usare il phishing basato su NIO dopo uc.connect? – danielad
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
Vedere anche questa soluzione solo Jsoup: http://stackoverflow.com/a/34943161/363573 – Stephan
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();
Grazie! Troppo facile. – vikingsteve
e non dimenticare di impostare il valore null dopo la chiamata, altrimenti le altre chiamate che non ne hanno bisogno saranno molto lente – Dejell
Facile, veloce e funzionante. Questa risposta potrebbe essere accettata. – Gondy
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();
Vedere anche questa soluzione non a livello di sistema: http://stackoverflow.com/a/34943161/363573 – Stephan
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.
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
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");
..
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:
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());
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");
Hmm, Hai provato a usare HtmlUnit invece? Questo dovrebbe essere il compito – raven
http://stackoverflow.com/questions/120797/how-do-i-set-the-proxy-to-be-used-by-the-jvm – swanliu
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