解析与使用 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,一经查实,立即删除!

相关文章

扣子平台音频功能:让声音也能“智能”起来。扣子免费系列教程(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 (新老的属性/状态)会做一…

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;使你更加适应高级…

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

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

使用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…

软件工程经济学-日常作业+大作业

目录 一、作业1 作业内容 解答 二、作业2 作业内容 解答 三、作业3 作业内容 解答 四、大作业 作业内容 解答 1.建立层次结构模型 (1)目标层 (2)准则层 (3)方案层 2.构造判断矩阵 (1)准则层判断矩阵 (2)方案层判断矩阵 3.层次单排序及其一致性检验 代码 …

小程序的协同工作与发布

1.小程序API的三大分类 2.小程序管理的概念&#xff0c;以及成员管理两个方面 3.开发者权限说明以及如何维护项目成员 4.小程序版本

架构技能(六):软件设计(下)

我们知道&#xff0c;软件设计包括软件的整体架构设计和模块的详细设计。 在上一篇文章&#xff08;见 《架构技能&#xff08;五&#xff09;&#xff1a;软件设计&#xff08;上&#xff09;》&#xff09;谈了软件的整体架构设计&#xff0c;今天聊一下模块的详细设计。 模…

基于微信小程序的实习记录系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

B-树:解锁大数据存储和与快速存储的密码

在我们学习数据结构的过程中&#xff0c;我们会学习到二叉搜索树、二叉平衡树、红黑树。 这些无一例外&#xff0c;是以一个二叉树展开的&#xff0c;那么对于我们寻找其中存在树中的数据&#xff0c;这个也是一个不错的方法。 但是&#xff0c;如若是遇到了非常大的数据容量…

【视频+图文详解】HTML基础4-html标签的基本使用

图文教程 html标签的基本使用 无序列表 作用&#xff1a;定义一个没有顺序的列表结构 由两个标签组成&#xff1a;<ul>以及<li>&#xff08;两个标签都属于容器级标签&#xff0c;其中ul只能嵌套li标签&#xff0c;但li标签能嵌套任何标签&#xff0c;甚至ul标…

网络工程师 (8)存储管理

一、页式存储基本原理 &#xff08;一&#xff09;内存划分 页式存储首先将内存物理空间划分成大小相等的存储块&#xff0c;这些块通常被称为“页帧”或“物理页”。每个页帧的大小是固定的&#xff0c;例如常见的页帧大小有4KB、8KB等&#xff0c;这个大小由操作系统决定。同…

LabVIEW无人机航线控制系统

介绍了一种无人机航线控制系统&#xff0c;该系统利用LabVIEW软件与MPU6050九轴传感器相结合&#xff0c;实现无人机飞行高度、速度、俯仰角和滚动角的实时监控。系统通过虚拟仪器技术&#xff0c;有效实现了数据的采集、处理及回放&#xff0c;极大提高了无人机航线的控制精度…