解析与使用 Apache HttpClient 进行网络请求和数据抓取

目录

1. 什么是 HttpClient?

2. 基本使用

3. 使用 HttpClient 爬取腾讯天气的数据

4. 爬取拉勾招聘网站的职位信息

5. 总结


前言

        Apache HttpClient 是 Apache 提供的一个用于处理 HTTP 请求和响应的工具类库。它提供了一种便捷、功能强大的方式来发送 HTTP 请求,并解析 HTTP 响应。HttpClient 适用于多种网络请求场景,能够帮助我们高效地与 Web 服务进行交互。

1. 什么是 HttpClient?

        HttpClient 是在 JDK 的基础类库基础上进行封装和增强的一个 HTTP 请求工具库。它提供了更强大、更灵活的功能,比如支持连接池、认证机制、重定向、请求重试等,帮助我们提高开发效率和代码质量。

HttpClient 的核心功能包括:

  • 连接池管理:提高性能,减少资源消耗,复用 TCP 连接。
  • 自动化处理 HTTP 头、请求和响应数据
  • 支持多种认证方式,如 Basic 认证、Digest 认证等。
  • 重定向处理:自动处理 HTTP 重定向。
  • 支持 Cookie 管理
  • 支持并发请求

2. 基本使用

2.1 引入依赖

首先,你需要在项目中引入 HttpClient 的 Maven 依赖。以下是 Apache HttpClient 的 Maven 依赖配置:

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version> <!-- 请使用最新版本 -->
</dependency>

2.2 发送 HTTP GET 请求

下面是一个简单的使用示例,展示如何通过 HttpClient 发送一个 HTTP GET 请求:

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;public class HttpClientExample {public static void main(String[] args) throws IOException {// 创建一个 HttpClient 实例try (CloseableHttpClient httpClient = HttpClients.createDefault()) {// 创建一个 HttpGet 请求对象HttpGet request = new HttpGet("https://www.baidu.com/");// 执行请求并获取响应HttpResponse response = httpClient.execute(request);// 如果请求成功,返回 200 状态码if (response.getStatusLine().getStatusCode() == 200) {// 将响应实体转换为字符串String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");// 输出响应内容System.out.println(responseBody);}}}
}

在上面的代码中,我们使用 HttpClients.createDefault() 创建了一个默认的 HttpClient 实例,然后通过 HttpGet 对象发送了一个请求,并打印了百度主页的 HTML 源码。

可以看到请求的结果为百度源代码 

3. 使用 HttpClient 爬取腾讯天气的数据

接下来,展示如何使用 HttpClient 来爬取 JSON 格式的天气数据。我们通过发送 HTTP GET 请求,获取腾讯天气 API 返回的 JSON 数据,并进行解析。

3.1 查询天气的json格式数据

 

我们构造一个 HTTP GET 请求,访问腾讯的天气 API:

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.util.EntityUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;public class WeatherDemo {public static void main(String[] args) {// 创建 HttpClient 实例CloseableHttpClient httpClient = HttpClients.createDefault();try {// 设置请求 URL,查询河北省保定市的天气信息HttpGet httpGet = new HttpGet("https://wis.qq.com/weather/common?source=pc&weather_type=observe|forecast_1h|forecast_24h&province=%E6%B2%B3%E5%8C%97%E7%9C%81&city=%E4%BF%9D%E5%AE%9A%E5%B8%82&county=");// 设置请求头httpGet.setHeader("Accept", "*/*");httpGet.setHeader("User-Agent", "Mozilla/5.0");// 执行请求,获取响应CloseableHttpResponse response = httpClient.execute(httpGet);// 获取响应的字符串内容String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");// 解析 JSON 数据String jsonString = responseBody.substring(42, responseBody.length() - 1);JSONObject json = JSON.parseObject(jsonString);JSONObject data = json.getJSONObject("data");JSONObject forecast = data.getJSONObject("forecast_24h");JSONObject day0 = forecast.getJSONObject("0");// 输出天气信息System.out.println("夜间风向: " + day0.get("night_wind_direction"));// 关闭响应对象response.close();} catch (Exception e) {e.printStackTrace();} finally {try {// 关闭 HttpClienthttpClient.close();} catch (IOException e) {e.printStackTrace();}}}
}

在这个示例中,我们通过解析返回的 JSON 数据,提取了天气信息,并输出了夜间风向。

 

3.2 JSON 解析

通过使用 fastjson 库,我们能够方便地解析 JSON 数据。JSONObject 类提供了 get()getJSONObject()getJSONArray() 方法,方便我们提取对应的值:

  • get():获取某个键对应的值,返回 Object 类型。
  • getJSONObject():获取某个键对应的 JSON 对象,返回 JSONObject 类型。
  • getJSONArray():获取某个键对应的 JSON 数组,返回 JSONArray 类型。

整体代码:

 


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.util.StringUtils;import java.io.IOException;public class XXDemo {public static void main(String[] args) {CloseableHttpClient httpClient = HttpClients.createDefault();try {HttpGet httpGet = new HttpGet("https://wis.qq.com/weather/common?source=pc&weather_type=observe%7Cforecast_1h%7Cforecast_24h%7Cindex%7Calarm%7Climit%7Ctips%7Crise&province=%E6%B2%B3%E5%8C%97%E7%9C%81&city=%E4%BF%9D%E5%AE%9A%E5%B8%82&county=&callback=jQuery111307985983701500603_1730452291491&_=1730452291493");// 设置请求头httpGet.setHeader("Accept", "*/*");httpGet.setHeader("Accept-Encoding",  "gzip, deflate, br, zstd");httpGet.setHeader("Accept-Language", "zh-CN,zh;q=0.9");httpGet.setHeader("Cache-Control", "max-age=0");httpGet.setHeader("Connection", "keep-alive");httpGet.setHeader("Cookie", "pgv_pvid=7587513344; RK=viMJj838H2; ptcz=410fc81f9ad1719db0b83d1ae0b767a81c43f89b4d79b4f22f0f04bf476c4e44; qq_domain_video_guid_verify=50ba34f244950f77; _qimei_uuid42=17c02140117100fd9f4a0a8f7ddb1d4eb0eef0fe2b; _qimei_q36=; _qimei_h38=2db835139f4a0a8f7ddb1d4e02000003017c02; tvfe_boss_uuid=9dd0f4ca6252467b; _qimei_fingerprint=a8fdf4f9656a2285f66b7f0bb5dbefc2; fqm_pvqid=bfdb0333-6586-490e-9451-7e4628f24f32; pgv_info=ssid=s390182559; pac_uid=0_sBk6e1R1P4Zpc");httpGet.setHeader("Host", "wis.qq.com");httpGet.setHeader("Upgrade-Insecure-Requests", "1");httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36");// 执行请求CloseableHttpResponse response = httpClient.execute(httpGet);// 获取响应实体String responseBody = EntityUtils.toString(response.getEntity(),"UTF-8");//获取中间json数据String subStringA = responseBody.substring(0,42);String str = responseBody.replace(subStringA,"");String newStr = str.substring(0, str.length()-1);//JSON解析----》JSONObject:处理json对象,根据可以值获取value值JSONObject json =  JSON.parseObject(newStr); //将字符串转换成json数组JSONObject data =  json.getJSONObject("data");JSONObject forecast_24h =  data.getJSONObject("forecast_24h");JSONObject data0 =  forecast_24h.getJSONObject("0");System.out.println(data0.get("night_wind_direction"));// 关闭响应对象response.close();} catch (Exception e) {e.printStackTrace();} finally {try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}}
}
public class HttpClient {public static void main(String[] args) throws IOException {try (CloseableHttpClient httpClient = HttpClients.createDefault()) {HttpGet request = new HttpGet("https://cdn.mdeer.com/data/yqstaticdata.js");CloseableHttpResponse response = httpClient.execute(request);  //发送请求,获取响应if (response.getStatusLine().getStatusCode() == 200) {String responseBody = EntityUtils.toString(response.getEntity(),"utf-8");//获取中间json数据String subStringA = responseBody.substring(0, 19);String str = responseBody.replace(subStringA, "");String newStr = str.substring(0, str.length() - 1);//System.out.println(newStr);JSONObject json = JSON.parseObject(newStr); //将字符串转换成json数据JSONArray cityLists = json.getJSONArray("cityLists");for (int i = 0;i<cityLists.size();i++){JSONObject jsonObject = cityLists.getJSONObject(i);if(!jsonObject.getString("city").equals("待确认地区")){System.out.println("城市:"+jsonObject.getString("city")+" 当前确认:"+jsonObject.getString("currentConfirm"));}}}}}
}

 

4. 爬取拉勾招聘网站的职位信息

除了获取天气数据,我们还可以利用 HttpClient 抓取其他网站的数据。例如,我们可以爬取拉钩招聘网站的职位信息。以下是一个爬取拉钩招聘职位的简单示例:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class ParseUtils {public static final String url = "https://www.lagou.com/wn/zhaopin?kd=Java&city=%E5%8C%97%E4%BA%AC";private static List<Job> jobs = new ArrayList<>();public static void main(String[] args) throws IOException {// 使用 Jsoup 连接拉钩招聘网站Document scriptHtml = Jsoup.connect(url).header("User-Agent", "Mozilla/5.0").timeout(50000).get();// 获取职位列表Elements list = scriptHtml.getElementsByClass("item__10RTO");for (Element element : list) {String jobName = element.getElementById("openWinPostion").text();String experience = element.getElementsByClass("p-bom__JlNur").text();String salary = element.getElementsByClass("money__3Lkgq").text();String company = element.getElementsByClass("company-name__2-SjF").text();// 将职位信息添加到列表中Job job = new Job(jobName, experience, salary, company);jobs.add(job);}// 输出所有职位信息for (Job job : jobs) {System.out.println(job);}}
}

4.1 数据清洗

爬取到的数据往往需要进行清洗处理,以符合我们需要的格式。例如,在拉钩招聘爬虫中,我们提取了职位名称、经验要求、薪资信息等,并进行清洗和格式化。

public static void cleanData(Job job) {// 薪资清洗String salary = job.getSalary().substring(0, job.getSalary().indexOf("-"));job.setSalary(salary);// 清洗经验要求String experience = job.getExperience().substring(job.getExperience().indexOf("经验"), job.getExperience().indexOf(" "));job.setExperience(experience);jobs.add(job);
}

5. 总结

        HttpClient 是一个强大的工具,适用于多种网络请求场景,特别是爬虫和数据抓取。通过它,我们可以轻松发送 HTTP 请求,解析返回的 JSON 或 HTML 数据,并提取出有用的信息。对于复杂的网络请求场景,HttpClient 还提供了丰富的功能,如连接池、认证、请求重试等,帮助我们提高效率和性能。

        通过本文的介绍,你已经掌握了如何使用 HttpClient 发送 HTTP 请求,如何解析 JSON 数据,并能在实践中抓取和清洗网页数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/69867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣【416. 分割等和子集】详细Java题解(背包问题)

首先我们可以求出数组和&#xff0c;当我们找到一个子集中元素的和为数组和的一半时&#xff0c;该就说明可以分割等和子集。 对于该问题我们可以转换成背包问题&#xff0c;求 数组里的元素 装入 数组和的一半大小的背包 能取得的最大值。 然后注意可以剪枝的地方。 代码&…

机器学习优化算法:从梯度下降到Adam及其实验改进

机器学习优化算法&#xff1a;从梯度下降到Adam及其实验改进 在机器学习和深度学习领域&#xff0c;模型的训练过程本质上是一个优化问题。优化算法的作用是通过调整模型参数&#xff0c;使得模型在给定的数据 集上实现最优性能。而优化算法的效率和效果直接决定了模型的收敛速…

扣子平台音频功能:让声音也能“智能”起来。扣子免费系列教程(14)

在数字化时代&#xff0c;音频内容的重要性不言而喻。无论是在线课程、有声读物&#xff0c;还是各种多媒体应用&#xff0c;音频都是传递信息、增强体验的关键元素。扣子平台的音频功能&#xff0c;为开发者和内容创作者提供了一个强大而灵活的工具&#xff0c;让音频的使用和…

【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具01

1、开发背景 大家都很熟悉&#xff0c;Oracle提供了Impdp和ExpDp工具&#xff0c;功能很强大&#xff0c;可以进行db的导入导出的处理。但是对于Sqlserver数据库只是提供了简单的图形化的导出导入工具&#xff0c;在实际的开发和生产环境不太可能让用户在图形化的界面选择移行…

上手DeepSeek大模型:本地化安装部署,确保数据不泄露

摘要&#xff1a;过年前DeepSeek横空出世&#xff0c;在世界范围内掀起AI狂潮&#xff0c;成了大家茶余饭后的话题。对于普通人怎样使用这个大模型呢&#xff1f;这篇文章来上手实践。 使用DeepSeek最简单的办法就是使用在线版或者手机版。 - 1 - 使用在线版 在浏览器中输…

蓝桥杯刷题DAY1:前缀和

所谓刷题&#xff0c;讲究的就是细心 帕鲁服务器崩坏【算法赛】 “那个帕鲁我已经观察你很久了&#xff0c;我对你是有些失望的&#xff0c;进了这个营地&#xff0c;不是把事情做好就可以的&#xff0c;你需要有体系化思考的能力。” 《幻兽帕鲁》火遍全网&#xff0c;成为…

【React】PureComponent 和 Component 的区别

前言 在 React 中&#xff0c;PureComponent 和 Component 都是用于创建组件的基类&#xff0c;但它们有一个主要的区别&#xff1a;PureComponent 会给类组件默认加一个shouldComponentUpdate周期函数。在此周期函数中&#xff0c;它对props 和 state (新老的属性/状态)会做一…

【Java异步编程】CompletableFuture综合实战:泡茶喝水与复杂的异步调用

文章目录 一. 两个异步任务的合并&#xff1a;泡茶喝水二. 复杂的异步调用&#xff1a;结果依赖&#xff0c;以及异步执行调用等 一. 两个异步任务的合并&#xff1a;泡茶喝水 下面的代码中我们实现泡茶喝水。这里分3个任务&#xff1a;任务1负责洗水壶、烧开水&#xff0c;任…

ZZNUOJ(C/C++)基础练习1021——1030(详解版)

目录 1021 : 三数求大值 C语言版 C版 代码逻辑解释 1022 : 三整数排序 C语言版 C版 代码逻辑解释 补充 &#xff08;C语言版&#xff0c;三目运算&#xff09;C类似 代码逻辑解释 1023 : 大小写转换 C语言版 C版 1024 : 计算字母序号 C语言版 C版 代码逻辑总结…

此虚拟机的处理器所支持的功能不同于保存虚拟机状态的虚拟机的处理器所支持的功能

1.问题&#xff1a;今天记录下自己曾经遇到的一个问题&#xff0c;就是复制别人虚拟机时弹出来的一个报错&#xff1a; 如图&#xff0c;根本原因就在于虚拟机版本的问题&#xff0c;无法对应的上&#xff0c;所以必须升级虚拟机。 2.问题解决&#xff1a; 1.直接点击放弃,此时…

高温环境对电机性能的影响与LabVIEW应用

电机在高温环境下的性能可能受到多种因素的影响&#xff0c;尤其是对于持续工作和高负荷条件下的电机。高温会影响电机的效率、寿命以及可靠性&#xff0c;导致设备出现过热、绝缘损坏等问题。因此&#xff0c;在设计电机控制系统时&#xff0c;特别是在高温环境下&#xff0c;…

C++ Primer 处理类型

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

第26节课:内容安全策略(CSP)—构建安全网页的防御盾

目录 CSP基础CSP的作用CSP的主要属性 配置CSP通过响应头配置CSP通过HTML <meta>标签配置CSP属性设置详解指定多个来源 配置示例说明 常见错误配置实践&#xff1a;CSP与XSS防护示例1&#xff1a;防止内联脚本和样式说明示例2&#xff1a;限制图片来源说明 限制与注意事项…

「Unity3D」在Unity中使用C#控制显示Android的状态栏

Unity打包的Android默认都是全屏&#xff0c;如果想要在真机上显示状态栏&#xff0c;就需要额外设置&#xff0c;有两种方式&#xff1a; 第一种&#xff0c;使用Android的Java代码去控制&#xff0c;然后以插件的方式放到Unity中&#xff0c;被C#调用。第二种&#xff0c;使…

Kafka SASL/PLAIN介绍

文章目录 Kafka SASL/PLAIN介绍1. SASL/PLAIN 简介2. 配置步骤&#xff08;1&#xff09;Kafka 服务器端配置&#xff08;2&#xff09;Kafka 客户端配置&#xff08;3&#xff09;测试连接 3. 认证过程3.1 SASL/PLAIN 认证工作原理3.2 认证过程描述 4. 安全性考虑4.1 SASL/PLA…

本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操

本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操 Janus-Pro-7B介绍 Janus-Pro-7B 是由 DeepSeek 开发的多模态 AI 模型&#xff0c;它在理解和生成方面取得了显著的进步。这意味着它不仅可以处理文本&#xff0c;还可以处理图像等其他模态的信息。 模型主要特点:Permalink…

JavaScript 入门教程

JavaScript 入门教程 JavaScript 入门教程引言学习 JavaScript 的好处常见的 JavaScript 框架和库 安装开发环境下载并安装 Node.js 和 npm安装常用开发工具&#xff08;如 VS Code&#xff09;配置本地开发环境 基础语法入门数据类型变量与常量运算符算术运算符比较运算符 条件…

使用LLaMA-Factory对AI进行认知的微调

使用LLaMA-Factory对AI进行认知的微调 引言1. 安装LLaMA-Factory1.1. 克隆仓库1.2. 创建虚拟环境1.3. 安装LLaMA-Factory1.4. 验证 2. 准备数据2.1. 创建数据集2.2. 更新数据集信息 3. 启动LLaMA-Factory4. 进行微调4.1. 设置模型4.2. 预览数据集4.3. 设置学习率等参数4.4. 预览…

three.js+WebGL踩坑经验合集(6.2):负缩放,负定矩阵和行列式的关系(3D版本)

本篇将紧接上篇的2D版本对3D版的负缩放矩阵进行解读。 (6.1):负缩放&#xff0c;负定矩阵和行列式的关系&#xff08;2D版本&#xff09; 既然three.js对3D版的负缩放也使用行列式进行判断&#xff0c;那么&#xff0c;2D版的结论用到3D上其实是没毛病的&#xff0c;THREE.Li…

webrtc协议详细解释

### 一、概述与背景 WebRTC&#xff08;Web Real-Time Communication&#xff09;最早由 Google 在 2011 年开源&#xff0c;旨在为浏览器与移动端应用提供客户端直连&#xff08;点对点&#xff09;方式进行实时音视频及数据传输的能力。传统的网络应用在进行高实时性音视频通…