1. 概述

本文将介绍 如何为 Jsoup 添加代理(Proxy)支持,解决在特定网络环境下请求失败或被目标网站封禁 IP 的问题。

Jsoup 作为 Java 中最流行的 HTML 解析库,虽然使用简单,但在实际项目中经常会遇到网络限制。合理配置代理,是保障爬虫稳定运行的关键一环。

2. 使用代理的常见场景

在实际开发中,使用代理主要有两个典型场景,踩过坑的都懂 😅。

2.1. 企业内网环境访问受限

很多公司或机构的网络环境会通过 代理服务器 控制对外访问权限。如果你直接在内网运行 Jsoup 请求外网地址,大概率会遇到超时异常:

java.net.SocketTimeoutException: connect timed out

解决方案:在发起请求前,必须显式为 Jsoup 配置代理,否则无法穿透内网防火墙。

2.2. 防止 IP 被封禁

当你用 Jsoup 做网页抓取(Web Scraping)时,目标网站可能会根据请求频率或行为特征封禁你的公网 IP。

使用代理(尤其是轮换代理池)可以:

  • ✅ 分散请求来源 IP
  • ✅ 降低被识别为爬虫的概率
  • ✅ 提高抓取任务的稳定性与持续性

⚠️ 注意:即使使用代理,也建议合理控制请求频率,遵守 robots.txt,避免对目标服务造成压力。

3. 环境准备

使用 Maven 的项目,在 pom.xml 中添加 Jsoup 依赖:

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

Gradle 用户,在 build.gradle 中添加:

implementation 'org.jsoup:jsoup:1.17.2'

✅ 推荐使用最新稳定版本,避免已知网络层 Bug。

4. 通过主机和端口配置代理

最简单粗暴的方式是直接传入代理的 host 和 port。

Jsoup 提供了 .proxy(String host, int port) 方法,只需在构建连接时调用即可:

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

📌 说明:

  • "127.0.0.1":代理服务器地址
  • 1080:代理服务监听端口(常见于 Shadowsocks、Socks5 等)
  • 此方式适用于 HTTP 和 SOCKS 代理(具体取决于底层实现)

⚠️ 注意:该方法默认使用 Proxy.Type.HTTP,若需使用 SOCKS 代理,请参考下一节。

5. 通过 Proxy 对象配置代理

更灵活的方式是使用标准的 java.net.Proxy 类来构建代理配置,适用于复杂场景,比如指定代理类型。

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

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

📌 核心组件说明:

  • Proxy.Type.HTTP:指定代理类型,常见值有:
    • HTTP:HTTP 代理
    • SOCKS:SOCKS 代理(如 Shadowsocks)
  • InetSocketAddress:封装代理服务器的 IP 和端口

✅ 优势:

  • 可精确控制代理类型
  • 更符合 Java 网络编程规范
  • 易于与代理池、认证逻辑集成

❌ 缺点:代码略多,简单场景略显冗余。

6. 总结

本文介绍了为 Jsoup 添加代理支持的两种方式:

方式 适用场景 推荐指数
.proxy(host, port) 快速配置 HTTP 代理 ⭐⭐⭐⭐
.proxy(Proxy) 需要指定代理类型(如 SOCKS) ⭐⭐⭐⭐⭐

📌 实际项目建议:

  • 内网穿透:优先配置公司代理地址
  • 爬虫任务:结合代理池 + 随机延时,提升稳定性
  • 调试技巧:配合 Charles/Fiddler 抓包验证代理是否生效

所有示例代码均已上传至 GitHub:https://github.com/eugenp/tutorials/tree/master/jsoup
欢迎 clone 学习,也可以 star 一下原作者项目。


原始标题:How to Add Proxy Support to Jsoup?