温馨提示:
1. 此代码样例同时支持访问http和https网页
2. 使用用户名密码访问的情况下,每次请求httpclient会发送两次进行认证从而导致请求耗时增加,建议使用终端IP授权访问
3. 若有多个用户名、密码进行认证,需要在代码中须添加AuthCacheValue.setAuthCache(new AuthCacheImpl());
参考样例
import java.io.IOException; import java.net.Authenticator; import java.net.InetSocketAddress; import java.net.PasswordAuthentication; import java.net.Proxy; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; public class TestProxyJsoup { // 用户名密码授权 final static String ProxyUser = "username"; final static String ProxyPass = "password"; // 代理IP、端口号 final static String ProxyHost = "159.138.141.125"; final static Integer ProxyPort = 18916; public static String getUrlProxyContent(String url) { Authenticator.setDefault(new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(ProxyUser, ProxyPass.toCharArray()); } }); Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ProxyHost, ProxyPort)); try { // 此处自己处理异常、其他参数等 Document doc = Jsoup.connect(url).followRedirects(false).timeout(3000).proxy(proxy).get(); if (doc != null) { System.out.println(doc.body().html()); } } catch (IOException e) { e.printStackTrace(); } return null; } public static void main(String[] args) throws Exception { // 目标网站 String targetUrl = "https://example.com"; // JDK 8u111版本后,目标页面为HTTPS协议,启用proxy用户密码鉴权 System.setProperty("jdk.http.auth.tunneling.disabledSchemes", ""); getUrlProxyContent(targetUrl); } }