我们来详细讲解一下如何使用 Java 中的 OkHttp 完成一款 JSONP 爬虫。
OkHttp
什么是 OkHttp
OkHttp
是一个开源的 HTTP
网络请求库,具有以下特点:
- 支持
HTTPS
和HTTP/2
。 - 支持同步和异步请求。
- 支持连接池和头部验证缓存等常见的
HTTP
功能。 - 网络请求封装简单,使用方便。
安装和引入
使用 OkHttp
需要在项目中引入其依赖,可以通过以下方式:
Maven 实例:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.0</version>
</dependency>
Gradle 实例:
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
OkHttp 网络请求
我们可以使用 OkHttp
完成以下几种网络请求操作:
- GET 请求
- POST 请求
- PUT 请求
- DELETE 请求
- HEAD 请求
以 GET 请求为例,使用 OkHttp
发送一个网络请求,获取 https://www.baidu.com
页面的 HTML 内容:
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://www.baidu.com")
.build();
Response response = client.newCall(request).execute();
String result = response.body().string();
OkHttp JSONP 爬虫
这里我们使用 OkHttp
实现一个可以抓取 JSONP 数据的爬虫。
步骤一:发送网络请求
构造一个 Request
对象,设置好请求的地址和请求头部:
OkHttpClient client = new OkHttpClient();
String url = "https://api.douban.com/v2/book/search?q=java&fields=title,image";
Request request = new Request.Builder()
.url(url)
.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3")
.build();
步骤二:发送网络请求并获取响应
使用 OkHttpClient
发送请求,并在回调函数中处理响应结果:
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String jsonpData = response.body().string();
String jsonData = jsonpData.substring(jsonpData.indexOf("(") + 1, jsonpData.lastIndexOf(")"));
// 解析 jsonData...
}
});
这里我们通过 substring
方法将 jsonpData
中的 JSONP 数据提取出来。
步骤三:解析 JSON 数据
这里我们使用 Gson
这个开源库来解析 JSON 数据。
首先,在项目中引入 com.google.code.gson:gson
包的依赖:
Maven 实例:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.7</version>
</dependency>
Gradle 实例:
implementation 'com.google.code.gson:gson:2.8.7'
然后可以使用 Gson
的 fromJson
方法将 JSON 数据转换为 Java 对象:
Gson gson = new Gson();
BookList bookList = gson.fromJson(jsonData, BookList.class);
BookList
类是一个自定义的 Java 类,用于映射 JSON 数据解析后的 Java 对象。这里省略了该类的定义。
示例一:爬取豆瓣图书列表数据
完整代码:
import com.google.gson.Gson;
import okhttp3.*;
import java.io.IOException;
import java.util.List;
public class DoubanSpider {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
String url = "https://api.douban.com/v2/book/search?q=java&fields=title,image";
Request request = new Request.Builder()
.url(url)
.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String jsonpData = response.body().string();
String jsonData = jsonpData.substring(jsonpData.indexOf("(") + 1, jsonpData.lastIndexOf(")"));
Gson gson = new Gson();
BookList bookList = gson.fromJson(jsonData, BookList.class);
for (Book book : bookList.books) {
System.out.println(book.title);
System.out.println(book.image);
}
}
});
}
static class BookList {
int start;
int count;
int total;
List<Book> books;
}
static class Book {
String title;
String image;
}
}
示例二:爬取 iqiyi 视频列表数据
完整代码:
import com.google.gson.Gson;
import okhttp3.*;
import java.io.IOException;
import java.util.List;
public class IqiyiSpider {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
String url = "https://pcw-api.iqiyi.com/search/recommend/list?apiKey=76b02528b873404bb8708a3865b6ca36&size=6&area=kr&channel_name=한국예능&pageNum=1";
Request request = new Request.Builder()
.url(url)
.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String jsonpData = response.body().string();
String jsonData = jsonpData.substring(jsonpData.indexOf("(") + 1, jsonpData.lastIndexOf(")"));
Gson gson = new Gson();
TvList tvList = gson.fromJson(jsonData, TvList.class);
for (Tv tv : tvList.data) {
System.out.println(tv.shortTitle);
System.out.println(tv.imageUrl);
}
}
});
}
static class TvList {
List<Tv> data;
}
static class Tv {
String id;
String timeLength;
String videoUrl;
String imageUrl;
String latestOrder;
String latestVideoCount;
String imageId;
String pubTime;
String contentType;
String shortTitle;
String title;
}
}
以上就是使用 OkHttp
完成 JSONP 爬虫的示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java中的OkHttp JSONP爬虫 - Python技术站