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 一下原作者项目。