在 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 中设置代理的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SOCKS 与 HtmlUnit 一起使用?

硒与 HtmlUnit? [关闭]

htmlunit 和 document.addEventListener

HtmlUnit---网页抓取工具解析及使用

利用htmlunit登陆带验证码图片的网站

零基础快速入门mini爬虫框架HtmlUnit