如何将 SOCKS 与 HtmlUnit 一起使用?

Posted

技术标签:

【中文标题】如何将 SOCKS 与 HtmlUnit 一起使用?【英文标题】:How can I use SOCKS with HtmlUnit? 【发布时间】:2010-03-08 22:55:11 【问题描述】:

是否可以通过 SOCKS 代理使用 htmlUnit?谁能提供代码示例?

====

所以我已经挖掘了 webclient 资源,这是我能想到的最好的方法:

    子类 MultiThreadedHttpConnectionManager 以便它允许设置 SOCKS 信息,如果已设置,则在返回连接之前设置 SOCKS 参数

    子类 WebConnection - 重写 createHttpClient 以便它使用第 1 步中的管理器并添加一个方法来直接获取该管理器或首先获取 http 客户端(它现在是受保护的 - 太糟糕了...)

    要使用 1) 创建一个WebClient 实例 2) 创建子类WebConnection 3) 将其设置为由WebClient 使用 4) 访问连接的管理器并使用它的方法来使用socks

【问题讨论】:

您是如何最终解决为不同的 webclient 实例使用不同的 socks 代理的问题的? @XCoder,自从 htmlunit 2.8 出来后我就不必这样做了,而且从那个版本开始就可以配置了 是的!我也找到了,谢谢及时回复。 【参考方案1】:

您需要做的就是在创建WebClient 对象之前设置appropriate system properties。例如:

System.setProperty("socksProxyHost", "localhost"); // replace "localhost" with your proxy server
System.setProperty("socksProxyPort", "9999"); // replace "9999" with your proxy port number

WebClient client = new WebClient();

此时,HttpClient(由 HtmlUnit 在幕后使用)将获取设置并使用 SOCKS 代理进行所有网络通信。

更新:我阅读了您修改后的问题(和您的评论),我认为您的思路是正确的。问题是,如果您使用上述系统属性实现第 1 步,那么您的代码不是线程安全的(因为这些系统属性是全局的)。一种解决方案是在某些东西上进行同步,但这当然会引入性能问题(可能对您而言并不重要)。

如果您真的想在每个套接字的基础上控制它,那么我认为您需要执行以下操作:

    创建一个自定义ProtocolSocketFactory,将java.net.Proxy 对象传递给Socket 构造函数(如this example)。 创建一个使用此ProtocolSocketFactory 的自定义Protocol。 使用 HttpConnection.setProtocol() 将此 Protocol 应用于自定义连接管理器中的新连接。

我还没有实际测试过这个,但是基于对 HttpClient 3.1 源代码的快速浏览,我认为这就是它的完成方式。我很想听听你最终如何解决这个问题:-)。祝你好运!

【讨论】:

这样我将为所有 WebClient 实例设置 SOCKS 属性。我希望能够为不同的实例设置不同的代理服务器【参考方案2】:

HtmlUnit 使用 HttpClient 作为底层连接库,我对此进行了一些调查,但是:

1- Couldn't find a way to configure HttpClient (except by the generic Java Socks mechanism defined in http://java.sun.com/javase/6/docs/technotes/guides/net/proxies.html)
2- Do not have access to a public Socks Proxy to test against

【讨论】:

在 2.8 中工作,因为 httpclient 较新。你是开发者之一,对吧?感谢您的工作。 是的,我是团队中的一员。 2.8 支持 SOCKS,即使在请求级别,享受 :)

以上是关于如何将 SOCKS 与 HtmlUnit 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SOCKS 5 代理与 cURL 一起使用?

在 HtmlUnit 中设置代理

将 urllib2 与 SOCKS 代理一起使用

如何使用 socks 配置 Android SDK 管理器?

如何在 selenium Firefox/Chrome 中使用 SOCKS5

HtmlUnit - 将 HtmlPage 转换为 HTML 字符串?