1. 为什么选择Jsoup+OkHttp组合
在Java生态中做爬虫开发,工具选型直接影响开发效率和项目成败。经过多年实战验证,Jsoup+OkHttp的组合已经成为Java爬虫领域的黄金搭档。这个组合的巧妙之处在于:OkHttp专注网络请求处理,Jsoup专注HTML解析,两者各司其职又完美互补。
OkHttp作为Square公司开发的HTTP客户端,其优势在于:
- 连接池复用机制降低延迟(实测比HttpURLConnection快3倍以上)
- 透明的GZIP压缩处理
- 完善的Cookie持久化支持
- 灵活的拦截器机制
而Jsoup作为HTML解析利器,其核心价值在于:
- 类似jQuery的DOM操作API(用过前端开发的会非常熟悉)
- 内置的HTML清理机制(自动修正残缺标签)
- 强大的CSS选择器支持
- 白名单机制的XSS防护
我曾在电商价格监控项目中对比过多种方案,最终这个组合的代码可维护性和运行效率都完胜其他方案。比如用纯HttpClient+正则表达式的方式,开发一个商品详情页解析器需要200行代码,而用Jsoup+OkHttp只需50行,且后期需求变更时修改量减少80%。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础配置
2.1 Maven依赖配置
建议使用最新稳定版本(截至2023年8月):
xml复制<dependencies>
<!-- OkHttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.11.0</version>
</dependency>
<!-- Jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.16.1</version>
</dependency>
</dependencies>
注意:实际项目中建议结合Spring Boot的dependency-management统一管理版本号,避免依赖冲突。
2.2 基础工具类封装
先创建一个HttpUtil工具类处理通用逻辑:
java复制public class HttpUtil {
private static final OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.build();
public static String get(String url, Map<String, String> headers) throws IOException {
Request.Builder builder = new Request.Builder().url(url);
if (headers != null) {
headers.forEach(builder::addHeader);
}
Request request = builder.build
