通过爬取HTML网页的源码,我们可以获取到网页中内容的基本信息,进而通过程序实现对数据的处理以及获取我们想要的数据。
那么如何使用Java爬取HTML网页的源码呢?
针对的是静态的、少量的服务器端数据,主要使用了URL类来访问互联网资源,通过GET方法请求HTTP/HTTPS协议。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.net.URL;
public class Main {
public static void main(String[] args)
throws Exception {
URL url = new URL("https://www.baidu.com");
BufferedReader reader = new BufferedReader
(new InputStreamReader(url.openStream()));
BufferedWriter writer = new BufferedWriter
(new FileWriter("data.html"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
writer.write(line);
writer.newLine(); }
reader.close();
writer.close();
}
}
如果想要发送其他请求或想要对网络请求有更深入的控制,我们就需要用到HttpURLConnection类。这时候,在释放资源的时候,需要调用disconnect方法断开http链接,防止线程溢出。
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class Main {
public static void main(String[] args) {
try {
// 创建一个URL对象,指定要爬取的网址
URL url = new URL("https://www.baidu.com");
// 打开与该网址对应的HTTP连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置请求方法为GET
conn.setRequestMethod("GET");
// 检查响应状态码,如果为HTTP_OK,则继续执行下面的代码
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
// 获取响应输入流
InputStream in = conn.getInputStream();
// 创建一个BufferedReader对象,用于读取输入流中的内容
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
// 创建一个StringBuilder对象,用于存放读取到的内容
StringBuilder response = new StringBuilder();
// 创建一个String对象,用于存放每一行读取到的内容
String line;
// 循环读取输入流中的每一行,直到读取到空行
while ((line = reader.readLine()) != null) {
// 将读取到的每一行添加到StringBuilder对象中
response.append(line);
}
// 关闭输入流
in.close();
// 关闭与该网址对应的HTTP连接
conn.disconnect();
// 输出读取到的内容
System.out.println(response.toString());
} else {
// 如果响应状态码不为HTTP_OK,则输出错误信息
System.out.println("Error retrieving web page");
}
} catch (Exception e) {
// 捕获并输出异常信息
e.printStackTrace();
}
}
}
如果还要对网页进行更加高效的操作,还需要使用到 jsoup 第三方库。😶🌫️
(限于作者水平等各种条件有限,jsoup库的使用还在探索中......)