问题背景
最近工作上有开发爬虫的任务,对目标网站数据进行抓取,由于大部分网站都在国外,无法直接访问,需要通过代理才能登录。爬虫部署的服务器在香港,所以爬虫部署到服务器后,是可以访问目标网站的,但本地开发调试程序时,需要通过代理才能访问。
这篇文章就带大家了解一下如何在Java程序中使用代理访问网络。
解决方案
-
你需要一个代理服务器,和一个可以连接到此服务器的客户端。
花点银子买一个稳定的账号,或者自己搭建一个。
这里我使用自己搭建的Shadowsocks
代理服务器,使用Shadowsocks-Windows
作为本地代理的客户端,并开启默认的1080
端口,以供本地其他程序通过代理访问网络。
-
指定 Java 程序的代理服务器地址和端口
有两种指定方式:-
通过 命令行参数 指定
如果只需要考虑代理 HTTP 协议请求,只需添加如下命令行参数:- 1
想要 HTTP 和 HTTPS 协议的请求都通过代理访问网络,可以追加上:
- 1
最终填写的值为:
- 1
-
在程序中使用System.setProperty(String, String)
同样很简单,这里直接上代码:- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
推荐使用第一种方案,通过VM Option 的方式,对代码没有任何侵入,绿色环保。
-
测试
这里我在Eclipse中使用第一种方法进行测试。
-
测试代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 测试结果,可以正常访问Google等网站。
总结
除了上述 http.proxyHost
和 http.proxyPort
,以及 https.proxyHost
和 https.proxyPort
在代理时比较有用外,还有一个属性也比较有用,那就是 http.nonProxyHosts
,它用来指定哪些主机不使用代理,如果有多个,用英文竖线(|
)分隔,可以使用星号 (*
)作为通配符。
下表是常用协议对应的代理属性:
协议 | 属性(代理主机/代理端口/不使用代理的主机列表) | 默认值 |
---|---|---|
HTTP | http.proxyHost | <none> |
http.proxyPort | 80 | |
http.nonProxyHosts | <none> | |
HTTPS | https.proxyHost | <none> |
https.proxyPort | 443 | |
https.nonProxyHosts | <none> | |
FTP | ftp.proxyHost | <none> |
ftp.proxyPort | 80 | |
ftp.nonProxyHosts | <none> | |
SOCKS | socksProxyHost | <none> |
socksProxyPort | 1080 |
详细介绍请参考官方说明:Java Networking and Proxies
转载自:https://xueliang.org/article/detail/20170116145848852