给Jsoup设置代理

本文介绍如何给Jsoup增加代理,主要有两类原因需要增加代理:

  1. 组织提供代理控制内部访问,如果在本地代理网络中通过Jsoup访问,会抛出异常:java.net.SocketTimeoutException: connect timed out;当见到该异常时,我们需要给Jsoup设置代理,否则不能访问外部网络。

  2. 防止IP被封:另外一种情况是防止网站封锁我们的IP地址。也就是说,使用代理(多个滚动代理)可以更可靠解析HTML,避免因为封锁IP地址让代码停止运行。

增加依赖

Maven依赖:

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.13.1</version>
</dependency>

Gradle依赖:

compile 'org.jsoup:jsoup:1.13.1'

增加代理

有两种方法给Jsoup增加代理支持。

基于属性增加

给Jsoup增加代理很容易,直接在Connection对象上调用proxy(String, int)方法:

Jsoup.connect("https://spring.io/blog")
  .proxy("127.0.0.1", 1080)
  .get();

第一个参数为主机地址,另一个是端口号。

基于Proxy类增加

我们也可以通过Proxy类实现,在Connection对象上调用它的proxy(java.net.Proxy)方法:

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 1080));

Jsoup.connect("https://spring.io/blog")
  .proxy(proxy)
  .get();

此方法接受一个Proxy对象,该对象由代理类型(通常为HTTP类型)和InetSocketAddress(封装代理主机名和端口属性的包装类)组成。