【发布时间】:2011-07-26 08:53:12
【问题描述】:
我正在使用带有 htmlunit 的代理,我的代理列表包含 http 和 socks 的混合,我不知道要传递给 htmlunit 的下一个选择的代理是 http 还是 socks,htmlunit 会自动确定类型并使用通过该代理进行连接的适当规则?
【问题讨论】:
标签: java http proxy htmlunit socks
我正在使用带有 htmlunit 的代理,我的代理列表包含 http 和 socks 的混合,我不知道要传递给 htmlunit 的下一个选择的代理是 http 还是 socks,htmlunit 会自动确定类型并使用通过该代理进行连接的适当规则?
【问题讨论】:
标签: java http proxy htmlunit socks
我也做了一个使用混合代理的应用程序,但那是不久前的事了。在该版本的 HtmlUnit 中,需要明确告知代理是否为 SOCKS,否则它假定它是 HTTP 代理。我简单地查看了更改日志,并没有发现任何迹象表明这已更改,所以答案应该是否定的,如果您不告诉 HtmlUnit 代理是 SOCKS,它将假定代理是 HTTP。
要检查代理是什么类型,可以使用以下内容:
SocketAddress addr = new InetSocketAddress("proxyAddress", port);
Proxy proxy = new Proxy(Proxy.Type.HTTP, addr); //or Proxy.Type.SOCKS
URL url = new URL("http://google.com");
URConnection conn = url.openConnection(proxy);
如果代码失败(即抛出异常),那么代理很可能是死机或 SOCKS。 (HtmlUnit 无论如何都会在第一种情况下抛出异常,或者如果您不确定代理是否存在,您可以使用 Proxy.Type.SOCKS 再次执行相同的测试。)
【讨论】:
查看Java Networking and Proxies。
它讨论了设置代理的多种策略。它还提供了通过代理选择器为同一连接提供多个代理的选项。
【讨论】:
另外两个答案是关于如何在 Java 程序中通用地使用代理,但它与 HtmlUnit 有点不同。在 Java 进程上设置代理什么都不做;相反,您希望模拟浏览器使用代理。
int myProxyPort=8080;
WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_8, "myproxyhost.com", myProxyPort);
【讨论】:
此框架为您检测代理类型,并可以为您实例化具有正确 Socks/Http/Https 代理配置的 HtmlUnit WebClient:https://github.com/subes/invesdwin-webproxy
本质上,它会在为您维护其代理列表时自动执行试错法。因此,您不必在自己的代码中担心这一点。
【讨论】: