使用hutool包进行爬虫其实就是使用包中的HttpUtil
工具类发起网络请求,再使用ReUtil
进行正则匹配将所需要的内容保存下来。接下来详细介绍下这两个工具类的使用。在使用之前我们先导入所需要的依赖,也可以通过jar包形式下载后添加到项目依赖中。
<!--hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.17</version>
</dependency>
HttpUtil
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
方法。
- get():发起get请求
- post():发起post请求
参数配置
HttpRequest getRequest = HttpUtil.createGet("https://www.baidu.com");
以下方法是配置在HttpRequest
中的
-
timeout(int):设置 HTTP 请求的超时时间(单位为毫秒)。
-
header(String, String):设置 HTTP 请求头信息,一般都会设置
"User-Agent"
。 -
setFollowRedirects(boolean):是否自动重定向。
-
form(Map<String, Object>):设置 HTTP POST 请求的表单数据。
-
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
这个工具类从名字就可以看出来是对正则表达式的封装,ReUtil类提供了以下常用方法:
- get: 根据指定正则表达式从字符串中获取匹配的结果,返回一个List集合。
- getFirstNumber: 从字符串中提取第一个匹配的数字。
- getNumbers: 从字符串中提取所有匹配的数字,返回一个List集合。
- replace: 使用正则表达式替换字符串中匹配的部分。
- replaceAll: 使用正则表达式替换字符串中所有匹配的部分。
- contains: 判断字符串中是否包含匹配的部分。
- isMatch: 判断字符串是否与指定的正则表达式匹配。
正则匹配中用得最多的还是查找有关的,下面举个示例:
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
。