如何为Jsoup添加代理支持?

时间:2011-09-20 09:11:11

标签: java jsoup

我是Java的初学者,我的第一个任务是解析大约10,000个URL并从中提取一些信息,为此我使用 Jsoup 并且它工作正常。

但现在我想为它添加代理支持。代理也有用户名和密码。

7 个答案:

答案 0 :(得分:70)

您可以轻松设置代理

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

答案 1 :(得分:34)

Jsoup 1.9.1及以上:(推荐方法)

.directive('delete', function() {
        return {
            restrict: 'E',
            replace: true,
            template: '<div></div>',
            link: function(scope, element) {
                element.click(function(){
                    $scope.removeRow = function (task) {
                        $scope.tasks.splice($scope.tasks.indexOf(task), 1);
                    }
                });
            }
        }
    });

您也可以使用带有Jsoup#proxy类的重载Proxy

在Jsoup 1.9.1之前:(详细方法)

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

参考文献:

答案 2 :(得分:33)

您不必通过Jsoup获取网页数据。这是我的解决方案,但它可能不是最好的。

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

就是这样。这通过代理获取html页面的源,然后使用Jsoup解析它。

答案 3 :(得分:4)

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

这是错误的解决方案,因为解析通常是多线程的,我们通常需要更改代理。此代码仅为所有线程设置一个代理。最好不要使用Jsoup.Connection。

答案 4 :(得分:4)

您可能希望在运行程序之前添加它

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

答案 5 :(得分:2)

Jsoup确实支持使用代理,因为v1.9.1Connection class有以下方法:

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

您可以像这样使用它:

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

如果您需要身份验证,可以使用@Navneet Swaminathan提到的Authenticator方法或只设置system properties

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

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

答案 6 :(得分:1)

请尝试使用此代码:

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