在 HtmlUnit 中设置代理
Posted
技术标签:
【中文标题】在 HtmlUnit 中设置代理【英文标题】:Setting proxies in HtmlUnit 【发布时间】:2011-07-26 08:53:12 【问题描述】:我正在使用带有 htmlunit 的代理,我的代理列表包含 http 和 socks 的混合,我不知道要传递给 htmlunit 的下一个选择的代理是 http 还是 socks,htmlunit 会自动确定类型并使用通过该代理进行连接的适当规则?
【问题讨论】:
【参考方案1】:我也做了一个使用混合代理的应用程序,但那是不久前的事了。在该版本的 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 再次执行相同的测试。)
【讨论】:
你知道如何在使用 htmlunit 之前检查代理类型吗? 我只知道试错法;测试两者。我将在答案中附加一个示例。【参考方案2】:查看Java Networking and Proxies。
它讨论了设置代理的多种策略。它还提供了通过代理选择器为同一连接提供多个代理的选项。
【讨论】:
【参考方案3】:另外两个答案是关于如何在 Java 程序中通用地使用代理,但它与 HtmlUnit 有点不同。在 Java 进程上设置代理什么都不做;相反,您希望模拟浏览器使用代理。
int myProxyPort=8080;
WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_8, "myproxyhost.com", myProxyPort);
【讨论】:
【参考方案4】:此框架为您检测代理类型,并可以为您实例化具有正确 Socks/Http/Https 代理配置的 HtmlUnit WebClient:https://github.com/subes/invesdwin-webproxy
本质上,它会在为您维护其代理列表时自动执行试错法。因此,您不必在自己的代码中担心这一点。
【讨论】:
以上是关于在 HtmlUnit 中设置代理的主要内容,如果未能解决你的问题,请参考以下文章