详解Java中的OkHttp JSONP爬虫

yizhihongxing

我们来详细讲解一下如何使用 Java 中的 OkHttp 完成一款 JSONP 爬虫。

OkHttp

什么是 OkHttp

OkHttp 是一个开源的 HTTP 网络请求库,具有以下特点:

  • 支持 HTTPSHTTP/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'

然后可以使用 GsonfromJson 方法将 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技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • 轻松解决 Linux操作系统故障恢复技巧

    轻松解决 Linux 操作系统故障恢复技巧攻略 Linux 是一种高度可定制的操作系统,但是在使用过程中也难免会遇到一些故障,例如系统崩溃、服务停止等等。为了保证系统的正常运行,处理这些故障是十分重要的。这里提供几个轻松解决 Linux 操作系统故障恢复技巧。 1. 查看日志文件 在排除 Linux 故障时,查看相关日志文件是非常有用的。Linux 系统的日…

    database 2023年5月22日
    00
  • MariaDB 和 PostgreSQL 的区别

    MariaDB和PostgreSQL都是流行的关系型数据库管理系统。它们都有类似的特征,如ACID(原子性、一致性、隔离性和持久性)事务支持,完整性约束,外键约束等等。但是在某些方面它们又有很大的不同。下面我们来一一比较它们的不同点。 数据库版本和执照 MariaDB和PostgreSQL都是开源数据库。而MariaDB是MySQL的一个分支,是由MySQL…

    database 2023年3月27日
    00
  • PHP与SQL语句常用大全

    PHP与SQL语句常用大全 PHP的SQL语句通常用于与数据库交互,包括数据查询、数据更新、数据插入等操作。下面是一些常用的SQL语句及其PHP实现。 数据库连接 连接数据库是操作数据库的第一步,可以使用mysqli或PDO扩展连接数据库。 mysqli扩展 $mysqli = new mysqli("localhost", "…

    database 2023年5月21日
    00
  • MySQL函数详解

    MySQL函数是一种可以被调用的特定代码段,它可以接收输入参数并返回处理结果。MySQL中包含了多种内置函数,这些函数可以被用于各种不同的场景,例如计算、格式化、比较等。下面是MySQL函数的种类以及作用和使用范围的详细介绍: 数学函数 MySQL中内置了多种用于数学计算的函数,例如ABS、CEILING、FLOOR、ROUND、TRUNCATE等。这些函数…

    MySQL 2023年3月9日
    00
  • Linux执行.sh文件时提示No such file or directory该怎么办(三种解决办法)

    当在Linux中执行一个.sh文件时,有时会遇到”No such file or directory”的错误提示,这可能是由于文件不存在或者权限问题导致的。以下是三种常见的解决办法: 解决方法一:检查文件是否存在 首先,应该检查文件是否确实存在。可以使用ls命令查看当前目录下的所有文件。如果找不到该文件,可以尝试使用绝对路径来执行该文件。 例如,如果文件名为…

    database 2023年5月22日
    00
  • Mysql 5.7.9 shutdown 语法实例详解

    MySQL 5.7.9 shutdown 语法实例详解 1. 关闭 MySQL 服务器 要关闭 MySQL 服务器,可以使用以下命令: mysqladmin -u root -p shutdown 当你运行这条命令时,系统将提示输入 MySQL root 用户的密码。输入正确密码后,MySQL 服务器将被正常关闭。 2. 设置 MySQL 服务器关闭模式 可…

    database 2023年5月22日
    00
  • linux下mysql数据库单向同步配置方法分享

    下面是“linux下mysql数据库单向同步配置方法分享”的完整攻略。 一、背景介绍 数据库同步是数据库管理中常用的技术,对于一些具有业务拓展需求的网站来说,同步数据库数据是非常重要的。本文介绍在Linux系统下,如何进行MySQL数据库单向同步配置。 二、具体步骤 1. 安装需要的软件 要进行数据库同步,需要在两个数据库之间建立同步关系。建议在一台中央服务…

    database 2023年5月22日
    00
  • MySQL修改和删除索引(DROP INDEX)方法详解

    修改索引 1.修改单个索引列: ALTER TABLE table_name MODIFY INDEX index_name(column_name_new); 2.修改多列组成的联合索引列: ALTER TABLE table_name DROP INDEX index_name, ADD INDEX index_name(column_name_new1…

    MySQL 2023年3月10日
    00
合作推广
合作推广
分享本页
返回顶部