http(2)

如何在 Java 中使用 HTTP 代理,代理也是爬虫技术中的重要一项。你如果要大规模的爬别人网页上的内容,必然会对人家的网站造成影响,如果你太拼了,就会遭人查封。要防止别人查封我 们,我们要么将自己的程序分布到大量机器上去,但是对于资金和资源有限的我们来说这是很奢侈的;要么就使用代理技术,从网上捞一批代理,免费的也好收费的 也好,或者购买一批廉价的 VPS 来搭建自己的代理服务器。关于如何搭建自己的代理服务器,后面有时间的话我再写一篇关于这个话题的博客。现在有了一大批代理服务器之后,就可以使用我们这 篇博客所介绍的技术了。

一、简单的 HTTP 代理

我们先从最简单的开始,网上有很多免费代理,直接上百度搜索 “免费代理” 或者 “HTTP 代理” 就能找到很多(虽然网上能找到大量的免费代理,但它们的安全性已经有很多文章讨论过了,也有专门的文章对此进行调研的,譬如这篇文章,我在这里就不多作说明,如果你的爬虫爬取的信息并没有什么特别的隐私问题,可以忽略之,如果你的爬虫涉及一些例如模拟登录之类的功能,考虑到安全性,我建议你还是不要使用网上公开的免费代理,而是搭建自己的代理服务器比较靠谱)。

1.1 HttpURLConnection 使用代理

HttpURLConnection 的 openConnection() 方法可以传入一个 Proxy 参数,如下:

1
3
Proxy proxy =  Proxy(Proxy.Type.HTTP,  InetSocketAddress( ));
URL obj =  URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection(proxy);

OK 了,就这么简单!

不仅如此,我们注意到 Proxy 构造函数的第一个参数为枚举类型 Proxy.Type.HTTP ,那么很显然,如果将其修改为 Proxy.Type.SOCKS 即可以使用 SOCKS 代理。

1.2 HttpClient 使用代理

由于 HttpClient 非常灵活,使用 HttpClient 来连接代理有很多不同的方法。最简单的方法莫过于下面这样:

1
3
new  "127.0.0.1" 9876 "HTTP" new 
new  "127.0.0.1" 1080 "SOCKS"
2
4
6
2
4
6
8
10
CloseableHttpClient httpclient = HttpClients.createDefault();      
HttpGet request =  HttpGet(url);
RequestConfig.custom()
         new  "45.32.21.237" 8888 "HTTP" .build()
);
         
CloseableHttpResponse response = httpclient.execute(request);

第二种写法是使用 RoutePlanner 类,如下:

1
3
5
7
HttpHost proxy =  HttpHost( );
DefaultProxyRoutePlanner routePlanner =  DefaultProxyRoutePlanner(proxy);
CloseableHttpClient httpclient = HttpClients.custom()
         .build();
HttpGet request =  HttpGet(url);
CloseableHttpResponse response = httpclient.execute(request);

二、使用系统代理配置

我们在调试 HTTP 爬虫程序时,常常需要切换代理来测试,有时候直接使用系统自带的代理配置将是一种简单的方法。以前在做 .Net 项目时,程序默认使用 Internet 网络设置中配的代理,遗憾的是,我这里说的系统代理配置指的 JVM 系统,而不是操作系统,我还没找到简单的方法来让 Java 程序直接使用 Windows 系统下的代理配置。

尽管如此,系统代理使用起来还是很简单的。一般有下面两种方式可以设置 JVM 的代理配置:

2.1 System.setProperty

Java 中的 System 类不仅仅是用来给我们 System.out.println() 打印信息的,它其实还有很多静态方法和属性可以用。其中 System.setProperty() 就是比较常用的一个。

可以通过下面的方式来分别设置 HTTP 代理,HTTPS 代理和 SOCKS 代理:

1
3
5
7
9
11
"http.proxyHost""127.0.0.1""http.proxyPort""9876" 
// HTTPS 代理,只能代理 HTTPS 请求
System.setProperty( );
System.setProperty( );
"socksProxyHost""127.0.0.1""socksProxyPort""1080"
2
"proxyHost""127.0.0.1""proxyPort""9876"<code plain"="">);
2.2 JVM 命令行参数

可以使用 System.setProperty() 方法来设置系统代理,也可以直接将这些参数通过 JVM 的命令行参数来指定。如果你使用的是 Eclipse ,可以按下面的步骤来设置:

  1. 按顺序打开:Window -> Preferences -> Java -> Installed JREs -> Edit

  1. 在 Default VM arguments 中填写参数: -DproxyHost=127.0.0.1 -DproxyPort=9876jvm-arguments.jpg
  2. 2.3 使用系统代理

    上面两种方法都可以设置系统,下面要怎么在程序中自动使用系统代理呢?

    对于 HttpURLConnection 类来说,程序不用做任何变动,它会默认使用系统代理。但是 HttpClient 默认是不使用系统代理的,如果想让它默认使用系统代理,可以通过 SystemDefaultRoutePlanner 和 ProxySelector 来设置。示例代码如下:

    1
    3
    5
    new  .setRoutePlanner(routePlanner)
             new <code plain"="">CloseableHttpResponse response = httpclient.execute(request);

    参考

    1. HttpClient Tutorial
    2. 评测告诉你:那些免费代理悄悄做的龌蹉事儿
    3. How to use Socks 5 proxy with Apache HTTP Client 4?
    4. 使用ProxySelector选择代理服务器
    5. Java Networking and Proxies

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值