Java中如何在不使用任何外部库的情况下读取网页内容?

1. 背景介绍

对于Java开发者而言,经常需要从网页抓取信息并进行处理。在此过程中,程序需要读取网页的内容。本文将介绍如何在Java中,不使用任何外部库的情况下读取网页内容。

2. 使用URLConnection

2.1 URLConnection介绍

JAVA中的java.net包中提供了URLConnection类实现如下的功能

打开连接到指定地址

读取网页内容

获取HTTP响应码

获取HTTP响应头信息

上传数据到指定地址等

2.2 实现代码

下面的代码实现通过Java的URLConnection读取网页内容的主要过程。

这个代码示例演示了如何使用URLConnection读取一个网站的内容并打印到控制台。

try {

// 创建URL对象

URL url = new URL("https://www.example.com");

// 打开URLConnection连接

URLConnection conn = url.openConnection();

// 设置连接主机超时时间

conn.setConnectTimeout(5000);

// 设置从主机读取数据超时

conn.setReadTimeout(5000);

// 设置通用的请求属性

conn.setRequestProperty("Accept", "*/*");

conn.setRequestProperty("Connection", "keep-alive");

conn.setRequestProperty("User-Agent",

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36");

// 建立连接

conn.connect();

// 获取所有响应头字段

Map> map = conn.getHeaderFields();

// 输出响应头的长度

System.out.println("Header size:" + map.size());

for (String key : map.keySet()) {

System.out.println(key + ": " + map.get(key));

}

// 定义BufferedReader输入流来读取URL的响应

BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));

String line;

StringBuilder sb=new StringBuilder();

while ((line = in.readLine()) != null) {

sb.append(line).append("\n");

}

System.out.println(sb.toString());

in.close();

} catch (Exception e) {

e.printStackTrace();

}

2.3 代码解析

在上述代码示例中,首先创建URL对象,将其作为参数传递给URLConnection类的openConnection()方法。通过openConnection()方法打开URLConnection连接,并设置连接主机超时时间和读取数据超时时间。接下来,通过设置通用的请求属性,如“User-Agent”、“Accept”等。此处的“User-Agent”是浏览器发送请求时的“User-Agent”字符串,告诉服务器客户端的浏览器环境和版本。最后,使用connect()方法建立连接。此时,系统会建立TCP连接,并发送HTTP请求到URL所指向的地址。

当服务器响应请求后,会把响应状态码、响应头等信息返回。在此示例中,通过getResponseCode()、getHeaderField()等方法可获取响应码、响应头等信息。

在获取响应内容时,可以使用getInputStream()方法获取输入流,再使用BufferedReader读取该输入流。BufferedReader的readLine()方法会一行一行地读取网页内容。

3. HttpURLConnection

3.1 HttpURLConnection介绍

JAVA中的HttpURLConnection继承自URLConnection类,提供更多的HTTP请求和响应抽象。HttpURLConnection可以方便地建立连接,并向服务器发送请求。因为HttpURLConnection的方法和属性都是针对HTTP的,所以它非常适用于使用HTTP协议访问Web服务的情况。

3.2 实现代码

下面的代码实现了如何使用HttpURLConnection读取网页内容的主要过程。这个代码示例演示了如何使用HttpURLConnection读取一个网站的内容并打印到控制台。

try {

// 创建URL对象

URL url = new URL("https://www.example.com");

// 打开HttpURLConnection连接

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

// 设置连接主机超时时间

conn.setConnectTimeout(5000);

// 设置从主机读取数据超时

conn.setReadTimeout(5000);

// 设置通用的请求属性

conn.setRequestProperty("Accept", "*/*");

conn.setRequestProperty("Connection", "keep-alive");

conn.setRequestProperty("User-Agent",

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36");

// 建立连接

conn.connect();

// 获取所有响应头字段

Map> map = conn.getHeaderFields();

// 输出响应头的长度

System.out.println("Header size:" + map.size());

for (String key : map.keySet()) {

System.out.println(key + ": " + map.get(key));

}

// 定义BufferedReader输入流来读取URL的响应

BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));

String line;

StringBuilder sb=new StringBuilder();

while ((line = in.readLine()) != null) {

sb.append(line).append("\n");

}

System.out.println(sb.toString());

in.close();

} catch (Exception e) {

e.printStackTrace();

}

3.3 代码解析

在上述代码示例中,首先创建URL对象,将其作为参数传递给HttpURLConnection类的openConnection()方法。

与URLConnection不同的是,HttpURLConnection在连接服务器时,会直接发送HTTP请求,因此,无需手动调用connect()方法建立连接。

由于HttpURLConnection继承自URLConnection,因此可以使用URLConnection的方法和属性。但是,由于HttpURLConnection的方法和属性都是针对HTTP的,因此HttpURLConnection更易于操作HTTP协议。

4. 总结

本文介绍了如何在Java中使用URLConnection和HttpURLConnection两个类读取网页内容。其中,URLConnection提供了更抽象的网络连接,可用于与Web服务器交互,并且可根据需要自定义网络请求。而HttpURLConnection则继承自URLConnection,并在此之上扩展了一些HTTP协议相关的方法和属性,使得更方便地发送HTTP请求。

需要注意的是,当读取大量数据时,代码示例中的读取方式可能会导致内存使用过多。为避免这种情况,可以使用按块读取的方式。但是,本文的示例着重于演示如何使用Java读取网页内容,因此没有涉及此部分。

在实际开发应用中,可以根据不同的需求,选择使用URLConnection或HttpURLConnection。同时,可以根据实际情况,灵活使用这些类的方法和属性,实现更加完善的网络编程逻辑。

后端开发标签