在Java中利用Okhttp3简单的爬取简书作者信息
1.登录简书找到对应的api
第一步肯定是要先登录简书,然后打开浏览器的开发工具,即右键——》检查,然后查看network的所有请求,找到推荐作者的请求api,一般这种api请求的路径都是根据所请求的信息命名的,例如推荐作者的英文就是recommend,我们搜索之后就可以得到如下:
里面的状态代码304表示服务端执行了get请求,但是文件未发生变化。
我们也可以先用测试工具请求测试下,看看数据到底对不对。
可以看出来数据没问题,那么接下来就看如何利用代码获得了。
2.查看请求头
这里我们就主要看两个,一个是Accept,另外一个就是User-Agent,两个分别代表的是:浏览器能够接收和响应的数据类型;浏览器类型和版本等数据。
我们找到请求标头下面的信息有:
这两个信息先保存,等下有用。
3.代码爬取
package com.example.demo.interceptor;
import java.io.IOException;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class Main {
public static void main(String[] args){
// 创建OkHttpClient实例
OkHttpClient client = new OkHttpClient();
// 创建Request
Request request = new Request.Builder()
.url("https://www.jianshu.com/users/recommended?seen_ids=&count=5&only_unfollowed=true") // 替换为你想要抓取的URL
.addHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36")
.addHeader("Accept","application/json")
.build();
try {
Response response = client.newCall(request).execute();
if (response.isSuccessful() && response.body() != null) {
String message = response.body().string();
System.out.println(message);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
这里别忘记添加依赖
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.3</version> <!-- 请检查最新版本 -->
</dependency>
上面我们在请求头中添加了Accept和User-Agent的相关消息,因为如果我们不添加User-Agent请求头的话,那么服务器那边是认为这个请求不是浏览器发出的,就直接拒绝掉了。但是如果只添加了User-Agent也无法获取响应,这时候我们可以多添加几个请求头,如上所示,但是一般只需要在添加个Accept即可,总之多试试就行了。
我们可以使用java的hutool工具来更简单的实现。
package com.example.demo.interceptor;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
public class Main {
public static void main(String[] args) {
// 创建HTTP GET请求
HttpResponse response = HttpRequest.get("https://www.jianshu.com/users/recommended?seen_ids=&count=5&only_unfollowed=true")
.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36")
.header("Accept", "application/json")
.execute();
if (response.isOk()) { // 检查响应状态码是否为200
String body = response.body(); // 获取响应体
System.out.println(body);
} else {
System.err.println("请求失败:" + response.getStatus());
}
}
}
别忘记添加依赖
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.25</version>
</dependency>