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.mzph.cn/news/609469.shtml

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

相关文章

开启Android学习之旅-6-实战答题App

不经过实战&#xff0c;看再多理论&#xff0c;都是只放在笔记里&#xff0c;活学活用才是硬道理。同时开发应用需要循序渐进&#xff0c;一口气规划300个功能&#xff0c;400张表&#xff0c;会严重打击自己的自信。这里根据所学的&#xff0c;开发一个答题App。 题库需求分析…

QML 模型视图

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 对于 GUI 应用程序来说,我们通常需要格式化数据并进行显示,而 QML 提供了一种很便利的显示方式 - Model-View-Delegate(简称:MVD)。该模式是 Model-View-Controller(简称:MVC)的一种变体,常被用于分…

HackTheBox - Medium - Linux - Awkward

Awkward Awkward 是一款中等难度的机器&#xff0c;它突出显示了不会导致 RCE 的代码注入漏洞&#xff0c;而是 SSRF、LFI 和任意文件写入/追加漏洞。此外&#xff0c;该框还涉及通过不良的密码做法&#xff08;例如密码重用&#xff09;以及以纯文本形式存储密码来绕过身份验…

vue列表渲染-v-for指令,vue事件处理,数据双向绑定,表单控制

es6对象语法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"./js/vue.js"></script> </head> <body></body> <script&…

【Spring Boot 3】【数据源】自定义JPA多数据源

【Spring Boot 3】【数据源】自定义JPA多数据源 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总…

力扣:18.四数之和

一、做题链接&#xff1a;18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 二、题目分析 1.做这一道题之前本博主建议先看上一篇《三数之和》 2.题目分析 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重…

C++自增运算符与类型转换

C中的自增和自减运算符分别是"“和”–"。这些运算符可以用于递增或递减一个变量的值。 自增运算符 () int x 5; x; // 这等同于 x x 1; // 现在 x 的值为 6自减运算符 (–) int y 10; y--; // 这等同于 y y - 1; // 现在 y 的值为 9这些运算符可以前置或后置…

计算机毕业设计 基于SpringBoot的项目申报系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

程序媛的mac修炼手册-- 终端(terminal)常用命令

「终端&#xff08;terminal&#xff09;」相当于macOS的一个 App &#xff0c;它的特殊之处是&#xff0c;它是管理其它App的App&#xff0c;操作主要通过命令行界面 (CLI) 。 相比于我们日常熟悉的用户界面&#xff08;User Interface&#xff0c;UI&#xff09;&#xff0c…

Redis 主从、哨兵和分片集群简单介绍

Redis 主从集群架构 单节点 redis 并发能力有上限&#xff0c;要进一步提高 redis 并发能力&#xff0c;就要搭建主从集群&#xff0c;实现读写分离 主从同步原理 Replicaition id&#xff1a;每台 master 机器都一个 repl_id&#xff0c;是数据集的表示&#xff0c;若 salv…

软件测试|如何在Pycharm中配置文件头部信息

简介 PyCharm是一款功能强大的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;在开发过程中&#xff0c;我们经常需要在代码文件的开头添加固定的文件说明信息&#xff0c;例如版权声明、作者信息、创建日期等。手动添加这些信息可能会很繁琐&#xff0c;但是PyCh…

[Vulnhub靶机] DriftingBlues: 5

[Vulnhub靶机] DriftingBlues: 5靶机渗透思路及方法&#xff08;个人分享&#xff09; 靶机下载地址&#xff1a; https://download.vulnhub.com/driftingblues/driftingblues5_vh.ova 靶机地址&#xff1a;192.168.67.24 攻击机地址&#xff1a;192.168.67.3 一、信息收集 …

探索人工智能:深度学习、人工智能安全和人工智能

深度学习是人工智能的一种重要技术&#xff0c;它模拟了人类大脑神经网络的工作原理&#xff0c;通过建立多层次的神经元网络来实现对数据的分析和处理。这种技术的引入使得人工智能的发展进入到了一个新的阶段。 现如今&#xff0c;深度学习在各个领域都有着广泛的应用。例如…

Java设计模式-访问者模式

访问者模式 一、概述二、结构三、案例实现四、优缺点五、使用场景六、扩展 一、概述 定义&#xff1a; 封装一些作用于某种数据结构中的各元素的操作&#xff0c;它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。 二、结构 访问者模式包含以下主要角色: …

Echarts——使用graphic组件在一个option内同时设置两个饼图的背景图

使用echarts的graphic原生图形元素组件&#xff0c;为两个饼图设置对应背景。 <template><div id"app"><div class"charts" ref"charts"></div></div> </template><script> import * as echarts from…

贪心的歌手(100%用例)C卷 (JavaPythonC++Node.jsC语言)

一个歌手准备从A城去B城参加演出。 (1)按照合同,他必须在T天内赶到. (2)歌手途径N座城市 (3)歌手不能往回走 (4)每两座城市之间需要的天数都可以提前获知 (5)歌手在每座城市都可以在路边卖唱赚钱。经过调研,歌手提前获知了每座城市卖唱的收入预期: 如果在一座城市…

Spring面试整理-Spring注解

Spring框架提供了许多注解,用以简化配置和实现各种功能。这些注解主要分为几个类别:核心、数据访问、Web开发、调度和事务管理、测试等。下面是一些常用的Spring注解: 核心注解@Component: 用于类定义上,表明该类将被Spring容器作为组件管理。@Service: 用于标注服务层的组…

龙芯+RT-Thread+LVGL实战笔记(28)——电子琴准备工作

【写在前面】临近期末,笔者工作繁忙,因此本系列教程的更新频率有所放缓,还望订阅本专栏的朋友理解,请勿催更。笔者在此也简要声明几点: 有些硬件模块笔者并没有,如LED点阵、压力传感模块、RFID模块等,因此这些模块的相关任务暂时无法给出经过验证的代码。其实,教程进行…

【ROS】小车机器视觉巡线行驶

摄像头 USB摄像头是最普遍的摄像头&#xff0c;如笔记本内置的摄像头&#xff0c;在ROS中使用这类设备很简单&#xff0c;可以直接使用usb_cam功能包驱动&#xff0c;USB摄像头输出的是二维图像数据。 usb_cam是针对V4L协议USB摄像头的ROS驱动包&#xff0c;核心节点是usb_cam…

2024年跨境电商上半年营销日历最全整理

2024年伊始&#xff0c;跨境电商开启新一轮的营销竞技&#xff0c;那么首先需要客户需求&#xff0c;节假日与用户需求息息相关&#xff0c;那么接下来小编为大家整理2024上半年海外都有哪些节日和假期&#xff1f;跨境卖家如何见针对营销日历选品&#xff0c;助力卖家把握2024…