Java网络爬虫--HttpClient

目录标题

  • 技术介绍
    • 有什么优点?
    • 怎么在项目中引入?
  • 请求URL
    • EntityUtils 类
    • GET请求
    • 带参数的GET请求
    • POST请求
  • 总结

技术介绍

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

网络爬虫就是用程序帮助我们访问网络上的资源,我们一直以来都是使用HTTP协议访问互联网的网页,网络爬虫需要编写程序,在这里使用同样的HTTP协议访问网页。 这里我们使用Java的HTTP协议客户端 HttpClient这个技术,来实现抓取网页数据。

有什么优点?

  1. 易用性和灵活性: HttpClient 提供了更简洁、易读的 API,使得发送 HTTP 请求和处理响应变得更加直观和容易。其面向对象的设计和灵活的配置选项使得开发者能够更容易地进行定制和扩展。
  2. 功能丰富: HttpClient 提供了丰富的功能和扩展,包括但不限于请求和响应拦截器、连接池管理、Cookie 管理、身份验证、代理支持等。这些功能大大简化了复杂任务的处理,例如处理会话、保持持久连接等。
  3. 性能优越: HttpClient 的设计注重性能和效率,内部采用了连接池等机制,减少了连接的建立和关闭次数,提高了系统的整体性能。同时,HttpClient 采用了并发处理机制,允许多个请求并行执行,提高了系统的吞吐量。
  4. 协议支持: HttpClient 支持多种协议,不仅仅局限于 HTTP 和 HTTPS,还包括 FTP、HTTP/2 等。这使得 HttpClient 成为一个通用的网络编程工具,适用于各种场景。
  5. 错误处理和异常管理: HttpClient 提供了详细的错误处理和异常管理机制,使得开发者能够更容易地诊断和处理网络请求中可能出现的问题。这对于构建健壮的爬虫系统非常重要。

怎么在项目中引入?

环境准备:会使用Maven新建项目,在pom.xml中导入依赖:

      <!-- HttpClient --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency>

请求URL

HttpClient 的重要功能是执行 HTTP 请求方法,获取响应资源。在执行具体的请求方法之前,需要实例化 HttpClient
HttpClient 的重要功能是执行 HTTP 请求方法,获取响应资源。在执行具体的请求方法之前,需要实例化 HttpClient。

基本步骤

  1. 创建 HttpClient 实例

    CloseableHttpClient httpClient4 = HttpClients.createDefault();

  2. 创建请求方法实例

    在网络爬虫中,常用的类是 HttpGet 与 HttpPost。

  3. 执行请求

    基于实例化的 HttpClient,可以调用 execute(HttpUriRequest request)方法执行数据请求,返回 HttpResponse

  4. 获取响应信息

       //获取具体响应信息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("输出头信息为:");

EntityUtils 类

EntityUtils 类的作用是操作响应实体

//可以设置编码
public static String toString(final HttpEntity entity, final String 
defaultCharset) 
//可以设置编码
public static String toString(final HttpEntity entity, final
Charset defaultCharset) 
//使用默认编码ISO-8859-1 
public static String toString(final HttpEntity entity)

另外,EntityUtils 类还提供了将响应实体转化成字节数组的方法,如下:
针对图片、PDF 和压缩包等文件,可以先将响应实体转化成字节数组,之后,利用缓冲流的方式写入指定文件,

public static byte[] toByteArray(final HttpEntity entity)

GET请求

public class GetTest {public static void main(String[] args) throws Exception {// 创建HttpClient对象CloseableHttpClient httpClient = HttpClients.createDefault();// 声明访问地址HttpGet httpGet = new HttpGet("https://www.autohome.com.cn/bestauto/");CloseableHttpResponse response = null;try {// 发起请求response = httpClient.execute(httpGet);// 判断状态码是否是200if (response.getStatusLine().getStatusCode() == 200) {// 解析数据String content = EntityUtils.toString(response.getEntity(), "UTF-8");System.out.println(content.length());}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {// 释放连接if (response != null) {try {response.close();} catch (IOException e) {e.printStackTrace();}httpClient.close();}}}}

在这里插入图片描述

使用Apache HttpClient库进行HTTP GET请求的Java程序。下面是代码的详细解释:

  1. 创建HttpClient对象:使用HttpClients.createDefault()方法来创建一个CloseableHttpClient实例,这个实例可以用来发送HTTP请求和处理HTTP响应。
  2. 声明访问地址:通过HttpGet对象,指定要请求的URL地址("https://www.autohome.com.cn/bestauto/")。
  3. 发起请求:使用httpClient.execute(httpGet)来发送HTTP GET请求。这个方法会返回一个CloseableHttpResponse对象来表示服务器的响应。
  4. 判断状态码:通过response.getStatusLine().getStatusCode()获取HTTP响应的状态码,并判断是否等于200,即HTTP OK状态。状态码200表示请求已成功被服务器接收、理解,并接受。
  5. 解析数据:如果状态码为200,则使用EntityUtils.toString(response.getEntity(), "UTF-8")将响应实体转换为字符串。这里指定了字符集为UTF-8,以确保正确处理字符。
  6. 输出内容长度:输出解析后的内容长度,通过content.length()获取。
  7. 异常处理:如果在请求过程中发生异常,异常会被捕获并打印堆栈跟踪。
  8. 释放资源:在finally块中,确保关闭响应和HttpClient实例,以释放系统资源。
  9. 异常处理:如果关闭响应或HttpClient时发生IOException异常,异常同样会被捕获并打印堆栈跟踪。

带参数的GET请求

public static void main(String[] args) throws Exception {// 创建HttpClient对象CloseableHttpClient httpClient = HttpClients.createDefault();// 声明访问地址// https://www.baidu.com/s?wd=汽车之家URI uri = new URIBuilder("https://www.baidu.com/s").setParameter("wd", "汽车之家").build();// 创建HttpGet请求对象HttpGet httpGet = new HttpGet(uri);CloseableHttpResponse response = null;try {// 发起请求response = httpClient.execute(httpGet);// 判断状态码是否是200if (response.getStatusLine().getStatusCode() == 200) {// 解析数据String content = EntityUtils.toString(response.getEntity(), "UTF-8");System.out.println(content.length());}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {// 释放连接if (response != null) {try {response.close();} catch (IOException e) {e.printStackTrace();}httpClient.close();}}
}

在构造HTTP GET请求时使用了URIBuilder来构建请求的URI。主要区别在于如何构造和设置请求的URL,以及如何传递查询参数:

  1. 使用URIBuilder:在这段代码中,URIBuilder类被用来构造带有查询参数的URI。new URIBuilder("https://www.baidu.com/s")创建了一个指向百度搜索的URIBuilder实例,然后通过.setParameter("wd", "汽车之家")方法设置了一个查询参数wd,其值为"汽车之家"。这个参数是用于百度搜索的关键词参数。build()方法用来生成最终的URI对象。
  2. 创建HttpGet对象时使用URI:在创建HttpGet对象时,直接使用uri对象,而不是之前的代码中直接传递URL字符串。这种方式更加灵活,因为可以在不改变基础URL的情况下动态地添加或修改查询参数。
  3. 其他部分相同:除了构建请求的URL部分以外,其他的代码逻辑和处理方式与上一段代码基本一致。都是创建HttpClient对象,发起请求,检查响应状态码,解析响应内容,并在最后释放资源。

POST请求

public static void main(String[] args) throws Exception {// 创建HttpClient对象CloseableHttpClient httpClient = HttpClients.createDefault();// 声明访问地址HttpPost httpPost = new HttpPost("https://www.oschina.net");// 设置User-Agent属性,解决开源中国限制的问题httpPost.setHeader("User-Agent", "");CloseableHttpResponse response = null;try {// 发起请求response = httpClient.execute(httpPost);// 判断状态码是否是200if (response.getStatusLine().getStatusCode() == 200) {// 解析数据String content = EntityUtils.toString(response.getEntity(), "UTF-8");System.out.println(content.length());}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {// 释放连接if (response != null) {try {response.close();} catch (IOException e) {e.printStackTrace();}httpClient.close();}}
}

在这里插入图片描述

response.getEntity() 是Apache HttpClient库中HttpResponse对象的一个方法,用于获取HTTP响应中的实体部分
服务器可能会根据User-Agent判断请求是否来自真正的用户还是爬虫。例如,一些网站可能会限制爬虫的访问,只允许真正的用户访问。此时,爬虫需要设置一个可以被服务器接受的User-Agent,才能成功获取数据。在实际应用中,应该根据目标服务器的要求设置合适的User-Agent。

总结

HttpClient是Apache Common下的子项目,提供了高效、功能丰富的HTTP客户端编程工具包。相比于java.net中的URLConnection和HttpURLConnection,HttpClient增加了易用性和灵活性。它具有以下优点:易用性和灵活性、功能丰富、性能优越、协议支持、错误处理和异常管理。在使用HttpClient进行网络爬虫时,首先需要创建HttpClient实例,然后执行请求,获取响应信息。
HttpClient提供了详细的错误处理和异常管理机制,方便构建健壮的爬虫系统。在使用HttpClient进行HTTP请求时,可以使用HttpGet和HttpPost方法,并在发起请求之前设置请求方法和参数。还可以使用EntityUtils类来操作响应实体,并将响应实体转化为字节数组或写入指定文件。
在发起GET请求时,可以使用URIBuilder类构建带参数的URI,并使用HttpGet对象发送请求。在发起POST请求时,可以使用HttpPost对象发送请求,并设置User-Agent属性来解决限制问题。

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

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

相关文章

八分钟了解一致性算法 -- Raft算法

前言 #### 分布式一致性在分布式环境中,一致性是指数据在多个副本之间是否能够保持一致的特性。 #### 分布式一致性算法比较常见的一致性算法包括Paxos算法,Raft算法,ZAB算法等• Paxos是Leslie Lamport提出的一种基于消息传递的分布式一致性算法。很多分布式一致性算法都由…

机器学习根据金标准标记数据-九五小庞

根据金标准标记数据是一种在机器学习和数据科学中常见的操作&#xff0c;主要用于评估分类模型的性能。其基本步骤如下&#xff1a; 收集数据&#xff1a;首先需要收集相关领域的原始数据&#xff0c;这些数据通常来自不同的来源和渠道。数据清洗和预处理&#xff1a;在这一步…

什么是Modbus协议?

Modbus协议是一种在工业自动化领域广泛应用的通信协议&#xff0c;它允许不同设备之间进行可靠的数据交换和控制。该协议最初由Modicon公司于1979年创建&#xff0c;旨在提供一种简单而有效的方法&#xff0c;使PLC&#xff08;可编程逻辑控制器&#xff09;和其他自动化设备能…

四搭建dockerhub私有仓库

搭建dockerhub私有仓库 很多场景下&#xff0c;我们需使用私有仓库管理Docker镜像。相比Docker Hub&#xff0c;私有仓库有以下优势&#xff1a; 节省带宽&#xff0c;对于私有仓库中已有的镜像&#xff0c;无需从Docker Hub下载&#xff0c;只需从私有仓库中下载即可&#x…

Vue学习笔记五--路由

1、什么是路由 2、VueRouter 2、1VueRouter介绍 2、2使用步骤 2、3路由封装 3、router-link 3.1两个类名 3.2声明式导航传参 4、路由重定向、404 当找不到路由时&#xff0c;跳转配置到404页面 5、路由模式 6、通过代码跳转路由---编程式导航&传参 路由跳转时传参 跳转方式…

【漏洞复现】大华 DSS 数字监控系统 itcBulletin SQL 注入

漏洞描述 大华 DSS存在SQL注入漏洞,攻击者 pota/services/itcBuletin 路由发送特殊构造的数据包,利用报错注入获取数据库敏感信息。攻击者除了可以利用 SQL注入漏词获取数据库中的信息例如,管理员后台密码、站点的用户人人信息)之外,甚至在高权限的情况可向服务器中写入木…

【Python数据可视化】matplotlib之绘制高级图形:散点图、热力图、等值线图、极坐标图

文章传送门 Python 数据可视化matplotlib之绘制常用图形&#xff1a;折线图、柱状图&#xff08;条形图&#xff09;、饼图和直方图matplotlib之设置坐标&#xff1a;添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…

嘴尚绝卤味:健康卤味风潮来袭,引领卤味市场新变革!

随着生活水平的提高&#xff0c;人们对食品的需求已不再满足于基本的口感和饱腹&#xff0c;健康、营养成为越来越多人关注的焦点。在这种背景下&#xff0c;健康卤味理念应运而生&#xff0c;并迅速在卤味市场引发了一场深刻的变革。 健康卤味理念强调选用优质、健康的食材&am…

SpringBoot3 WebFlux 可观测最佳实践

前言 链路追踪是可观测性软件系统的一个非常好的工具。它使开发人员能够了解应用程序中和应用程序之间不同交互发生的时间、地点和方式。同时让观测复杂的软件系统变得更加容易。 从Spring Boot 3开始&#xff0c;Spring Boot 中用于链路追踪的旧 Spring Cloud Sleuth 解决方…

反射助你无痛使用Semantic Kernel接入离线大模型

本文主要介绍如何使用 llama 的 server 部署离线大模型&#xff0c;并通过反射技术修改 Semantic Kernel 的 OpenAIClient 类&#xff0c;从而实现指定端点的功能。最后也推荐了一些学习 Semantic Kernel 的资料&#xff0c;希望能对你有所帮助。 封面图片&#xff1a; Dalle3 …

docker/华为云cce 部署nacos 2.3.0 集群模式

镜像地址 https://hub.docker.com/r/nacos/nacos-server 版本 nacos/nacos-server:v2.3.0-slim 关键环境变量 使用mysql数据源 变量值备注MODEcluster启用集群模式MYSQL_SERVICE_DB_NAME数据库名MYSQL_SERVICE_USER数据库用户名MYSQL_SERVICE_PASSWORD数据库密码SPRING_D…

WPF 布局

了解 WPF中所有布局如下&#xff0c;我们一一尝试实现&#xff0c;本文档主要以图形化的形式展示每个布局的功能。 布局&#xff1a; Border、 BulletDecorator、 Canvas、 DockPanel、 Expander、 Grid、 GridView、 GridSplitter、 GroupBox、 Panel、 ResizeGrip、 Separat…

API设计:从基础到最佳实践

1*vWvkkgG6uvgmJT8GkId98A.png 在这次深入探讨中&#xff0c;我们将深入了解API设计&#xff0c;从基础知识开始&#xff0c;逐步进阶到定义出色API的最佳实践。 作为开发者&#xff0c;你可能对许多这些概念很熟悉&#xff0c;但我将提供详细的解释&#xff0c;以加深你的理解…

13、Redis高频面试题

1、项目中为什么用Redis 我们项目中之所以选择Redis&#xff0c;主要是因为Redis有下面这些优点&#xff1a; 操作速度快&#xff1a;Redis的数据都保存在内存中&#xff0c;相比于其它硬盘类的存储&#xff0c;速度要快很多数据类型丰富&#xff1a;Redis支持 string&#x…

【题解】—— 每日一道题目栏

2024.1 【题解】—— LeetCode一周小结1 1. 1599. 经营摩天轮的最大利润 2. 466. 统计重复个数 3. 2487. 从链表中移除节点 4. 2397. 被列覆盖的最多行数 5. 1944. 队列中可以看到的人数 6. 2807. 在链表中插入最大公约数 7. 383. 赎金信 【题解】—— LeetCode一周小…

易安联参与制定的《面向云计算的零信任体系》行业标准即将实施

中华人民共和国工业和信息化部公告2023年第38号文件正式发布行业标准&#xff1a;YD/T 4598.2-2023《面向云计算的零信任体系 第2部分&#xff1a;关键能力要求》及YD/T 4598.3-2023《面向云计算的零信任体系 第3部分&#xff1a;安全访问服务边缘能力要求》&#xff0c;并于20…

代码随想录 Leetcode242. 有效的字母异位词

题目&#xff1a; 代码&#xff08;首刷看解析 2024年1月14日&#xff09;&#xff1a; class Solution { public:bool isAnagram(string s, string t) {int hash[26] {0};for(int i 0; i < s.size(); i) {hash[s[i] - a];}for(int i 0; i < t.size(); i) {hash[t[i]…

【零基础入门Python数据分析】Anaconda3 JupyterNotebookseaborn版

目录 一、安装环境 python介绍 anaconda介绍 jupyter notebook介绍 anaconda3 环境安装 解决JuPyter500&#xff1a;Internal Server Error问题-CSDN博客 Jupyter notebook快捷键操作大全 二、Python基础入门 数据类型与变量 数据类型 变量及赋值 布尔类型与逻辑运算…

【2024】OAK智能深度相机校准教程

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是Ash…

求幸存数之和 - 华为OD统一考试

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 给一个正整数列nums,一个跳数jump,及幸存数量left。运算过程为:从索引为0的位置开始向后跳,中间跳过 J 个数字,命中索引为 J+1 的数字,该数被敲出,并从该点起跳,以此类推,直到幸存left个数为止。…