详解Java中的OkHttp JSONP爬虫

我们来详细讲解一下如何使用 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日

相关文章

  • redis 字符串基本操作

    基础操作1.set xxx aaa 设置xxx2.get xxx 获取xxx3.del xxx 删除xxx4.exists xxx 查看是否存在5.expire aaa 10 设置过期时间(秒)6.pexpire yyy 10000 设置过期时间(毫秒)7.persist user 删除过期时间(在过期之前做)8.keys u* 查找符合某个模式的key k…

    Redis 2023年4月11日
    00
  • Mysql查看版本号的几种方式

    下面是Mysql查看版本号的几种方式的完整攻略: 几种查看 Mysql 版本的方式 1. 使用命令行查询 在命令行输入以下命令即可查询 Mysql 的版本: mysql –version 示例如下: $ mysql –version mysql Ver 14.14 Distrib 5.7.34, for Linux (x86_64) using Edit…

    database 2023年5月22日
    00
  • sql高级技巧几个有用的Sql语句

    针对”SQL高级技巧几个有用的SQL语句”这一话题,我们可以从以下几个方面进行讲解: 一、SQL高级技巧概述 在SQL中,我们经常会用到SELECT、UPDATE、DELETE等基本的SQL语句,但是除了这些基础的语句,SQL还有很多高级的用法,如多表关联、数据分组、子查询等等。这些技巧的应用可以让我们更加高效地完成数据处理和分析任务。 二、几个有用的SQL…

    database 2023年5月21日
    00
  • springboot中通过lua脚本来获取序列号的方法

    来讲一下 Spring Boot 中通过 Lua 脚本来获取序列号的方法。 1. 确定需求和思路 在开始实现前,我们需要确定需求和大致思路。根据需求,我们需要在 Spring Boot 应用中通过 Lua 脚本来获取序列号。而大致思路如下: 首先,我们需要在 Spring Boot 应用中引入 LuaJ 库,通过该库来运行 Lua 脚本。 然后,我们需要编写…

    database 2023年5月22日
    00
  • 小练习-把MySQL数据库中的数据存入redis

    #pymysql、json、redis#1、连数据库,查到数据库里面所有的数据,游标类型要用pymysql.curosrs.DictCour#2、查到所有数据 [ {“id”:1,”passwd”:”49487dd4f94008a6110275e48ad09448″,”username”:”niuhayang”,”is_admin”:1}]#3、循环这个li…

    Redis 2023年4月11日
    00
  • SQL2005CLR函数扩展-深入环比计算的详解

    SQL2005CLR函数扩展-深入环比计算的详解 前言 在数据分析领域中,环比计算是一个非常常见的计算方法,通过对比相邻周期同一数据维度的数据变化,帮助分析师更好的发现数据背后的规律,及时发现异常。对于大多数数据库而言,都有着自己的应用程序编程接口(API),可通过这些接口实现函数的扩展,进而能够方便地进行复杂的计算操作。SQL Server SQLCLR是…

    database 2023年5月21日
    00
  • ORACLE11g随RHEL5系统自动启动与关闭的设置方法

    接下来我将详细讲解“ORACLE11g随RHEL5系统自动启动与关闭的设置方法”的完整攻略。 1. 确认Oracle 11g是否已安装 在设置ORACLE11g在RHEL5系统自动启动与关闭之前,我们需要确认Oracle 11g已经是成功安装并已经启动运行。 2. 编写Oracle 11g服务脚本 要实现Oracle 11g的自动启动与关闭,我们需要先创建一…

    database 2023年5月22日
    00
  • Redis缓存高可用集群

    在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般。 作者:京东零售 王雷 1、Redis集群方案比较 • 哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sen…

    Redis 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部