使用hutool包进行爬虫其实就是使用包中的HttpUtil
工具类发起网络请求,再使用ReUtil
进行正则匹配将所需要的内容保存下来。接下来详细介绍下这两个工具类的使用。在使用之前我们先导入所需要的依赖,也可以通过jar包形式下载后添加到项目依赖中。
<dependency>
<groupId>cn.hutoolgroupId>
<artifactId>hutool-allartifactId>
<version>5.7.17version>
dependency>
Hutool 包中的 HttpUtil 类提供了方便的 HTTP 客户端工具,可以用于发送 HTTP 请求并获取响应结果。
发起请求
以下方法是HttpUtil
中的
前三个方法是先构造请求的参数,包括url等,详细参数可以在下面的参数配置中设置,如请求头、编码等。注意这些方法并未发起请求,要想发起请求需要执行execute
方法·。
createGet(String):创建 HTTP GET 请求,并设置请求 URL。
createPost(String):创建 HTTP POST 请求,并设置请求 URL。
createRequest(String, HttpMethod):根据指定的请求方法创建 HTTP 请求,并设置请求 URL。
execute():发送 HTTP 请求,并返回响应结果。
如果请求不需要额外配置参数,可以直接通过HttpUtil.get(url)
发起请求,这是发起请求了,不再需要执行execute
方法。
参数配置
HttpRequest getRequest = HttpUtil.createGet("https://www.baidu.com");
以下方法是配置在HttpRequest
中的
timeout(int):设置 HTTP 请求的超时时间(单位为毫秒)。
header(String, String):设置 HTTP 请求头信息,一般都会设置"User-Agent"
。
setFollowRedirects(boolean):是否自动重定向。
form(Map
body(String):设置 HTTP 请求体的内容。
charset(Charset):设置 HTTP 请求和响应的字符集编码。
这两个方法
downloadFile(String, OutputStream):下载文件并写入到指定的输出流中。
downloadFile(String, File):下载文件并保存到指定的文件中。
upload(String, File, String):上传文件。
以下是使用 HttpUtil 类发送 HTTP 请求的示例代码:
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
public class HttpUtilExample {
public static void main(String[] args) {
// 发送 HTTP GET 请求
String getResponse = HttpUtil.get("https://www.baidu.com");
System.out.println(getResponse);
// 发送 HTTP POST 请求
HttpResponse postResponse = HttpUtil.post("https://www.example.com", "username=admin&password=123456");
System.out.println(postResponse.body());
}
}
这个工具类从名字就可以看出来是对正则表达式的封装,ReUtil类提供了以下常用方法:
public static void main(String[] args) {
HttpRequest request = HttpUtil.createGet("https://www.baidu.com/s?wd=龙猫&pn=10");
request.header("User-Agent","jwoewwewe");
HttpResponse response = request.execute();
String title_reg = "\"titleUrl\":\"(.*?)\"";
List<String> titleList = ReUtil.findAll(title_reg, response.body(),1);
for(String title: titleList){
System.out.println("---");
System.out.println(title);
}
}
上述代码中findAll
是对响应体进行正则匹配,后面参数1
是分组,如果指定为1表示不包含匹配字符,打印结果不包含titleUrl
等匹配前缀,直接返回需要(.*?)
中的匹配数据,为0表示包含titleUrl
。