【学习笔记】Java网络爬虫实战——使用HttpClient执行请求与获取响应信息

        由于博主昨天已经学习完了Jsoup的相关知识,所以今天开始学习HttpClient的操作使用。但是在学习HttpClient时,因为是刚入门,尽管网上资料一搜一大把但是博主发现这些资料都是思路混乱、较难理解(可能是因为我原来是文科生的缘故?)。

HttpClient是什么?

        HttpClient(HTTP协议客户端→网络请求框架)是Apache Jakarta Common下的子项目,用来提供高效的、功能丰富的、支持HTTP协议的客户端编程工具包。相比于java.net包中提供的URLConnection与HttpURLConnection,HttpClient增加了易用性和灵活性。在Java网络爬虫中,经常使用HttpClient向服务器发送请求以获取相应资源。

下载HttpClient的jar包

<dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
      <version>4.4</version>
</dependency>

执行请求与获取响应信息

package com.test.study;

import java.io.IOException;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.ParseException;
import org.apache.http.ProtocolVersion;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;

public class TestHttpClient {

	public static void main(String[] args) throws ParseException, IOException {
		// 初始化HttpContext
		HttpContext localContext = new BasicHttpContext();
		String url = "http://www.hakutaku.club";
		// 初始化HttpClient
		HttpClient httpClient = HttpClients.custom().build();
		HttpGet httpGet = new HttpGet(url);
		// 执行请求获取HttpResponse
		HttpResponse httpResponse = null;
		try {
			httpResponse = httpClient.execute(httpGet, localContext);   // 执行请求,获取响应信息
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		// 获取具体响应信息
		System.out.println("response: " + httpResponse);
		// 响应状态
		String status = httpResponse.getStatusLine().toString();
		System.out.println("status: " + status);
		// 获取响应状态码
		int StatusCode = httpResponse.getStatusLine().getStatusCode();
		System.out.println("StatusCode: " + StatusCode);
		// 获取协议的版本号
		ProtocolVersion protocolVersion = httpResponse.getProtocolVersion();
		System.out.println("protocolVersion: " + protocolVersion);
		// 是否OK
		String phrase = httpResponse.getStatusLine().getReasonPhrase();
		System.out.println("phrase: " + phrase);
		// 头信息
		Header[] headers = httpResponse.getAllHeaders();
		System.out.println("==========输出头信息==========");
		for(int i = 0; i < headers.length; i++) {
			System.out.println(headers[i]);
		}
		System.out.println("=========头信息输出结束=========");
		// 实体内容
		if(StatusCode == HttpStatus.SC_OK) {   // 状态码200表示响应成功
			// 获取实体内容
			HttpEntity entity = httpResponse.getEntity();
			// 注意设置编码
			String entityString = EntityUtils.toString(entity, "gbk");
			// 输出实体内容
			System.out.println(entityString);
			EntityUtils.consume(httpResponse.getEntity());   // 消耗实体
		}else {
			// 关闭HttpEntity的流实体
			EntityUtils.consume(httpResponse.getEntity());   // 消耗实体
		}
	}
}

        在上述代码中,我使用的测试网站是我的个人博客(http://www.hakutaku.club)。具体的语句实现功能我在代码中标注的也很清楚,只说一下最后的语句**EntityUtils.consume()**吧。

        EntityUtils.consume(): 释放实体。实体是资源,在不需要资源时应将其释放。

输出结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42506411/article/details/106955451