web-dev-qa-db-fra.com

Comment ajouter un support proxy à Jsoup?

Je suis un débutant pour Java et ma première tâche est d'analyser quelque 10 000 URL et d'en extraire des informations, pour cela j'utilise Jsoup et ça marche bien .

Mais maintenant, je veux y ajouter un support proxy. Les mandataires ont également un nom d'utilisateur et un mot de passe.

37
Himanshu

Vous n'avez pas besoin d'obtenir les données de la page Web via Jsoup. Voici ma solution, mais ce n'est peut-être pas la meilleure.

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

Et voilà. Cela obtient la source de la page html via un proxy, puis l'analyse avec Jsoup.

33
Ryan

Vous pouvez facilement définir un proxy

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

Jsoup 1.9.1 et supérieur: (approche recommandée)

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

Vous pouvez également utiliser la surcharge Jsoup # proxy qui prend une classe Proxy .

Avant Jsoup 1.9.1: (approche verbeuse)

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

Les références:

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

C'est une mauvaise solution, car l'analyse est généralement multithread et nous devons généralement changer de proxy. Ce code définit un seul proxy pour tous les threads. Il vaut donc mieux ne pas utiliser Jsoup.Connection.

4
Alex Shwarc

Vous voudrez peut-être ajouter ceci avant d'exécuter le programme

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

Jsoup prend en charge l'utilisation de proxy , puisque v1.9.1 . Connection class a les méthodes suivantes:

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

Que vous pouvez l'utiliser comme ceci:

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

Si vous avez besoin d'une authentification, vous pouvez utiliser l'approche Authenticator mentionnée par @ Navneet Swaminathan ou simplement définir propriétés système :

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

ou

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

Essayez plutôt ce code:

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());
1
Stephan