当前位置: 首页 > news >正文

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属性来解决限制问题。

相关文章:

Java网络爬虫--HttpClient

目录标题 技术介绍有什么优点&#xff1f;怎么在项目中引入&#xff1f; 请求URLEntityUtils 类GET请求带参数的GET请求POST请求 总结 技术介绍 HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、功能丰富的、支持 HTTP 协议的客户端编程工具包。相…...

若依项目的table列表中对每一个字段增加排序按钮(单体版和前后端分离版)

一、目标:每一个字段都添加上下箭头用来排序 只需要更改前端代码,不需要更改后端代码,后面会讲解原理 二、单体版实现方式: 1.在options中添加sortable:true 2.在需要排序的字段中添加sortable:true 三、前后端分离版 1.el-table上添加@sort-change=“handleSortChange”…...

Linux自动化部署脚本

1:最近项目部署比较频繁终于熬不住了 就有下面的这东西 #!/bin/sh #报错停止运行 set -e # 获取tomcat的PID TOMCAT_PID$(ps -ef | grep tomcat | grep -v grep | awk {print $2}) # tomcat的启动文件位置 START_TOMCAT/mnt/tomcat/bin/startup.sh # 项目文件部署位置 PROJECT…...

lvgl修改图片大小上限

在lvgl中读取图片文件时&#xff0c;被读取的图片具有上限&#xff0c;也就是2048像素。这会造成两个非预期的结果&#xff1a; 超过2048像素的部分会被裁去。表示图片的结构体lv_img_t中的w和h变量值是图片像素被2048求余。例如&#xff0c;当一个图片高为2048像素时&#xf…...

阻止持久性攻击改善网络安全

MITRE ATT&CK框架是一个全球可访问的精选知识数据库&#xff0c;其中包含基于真实世界观察的已知网络攻击技术和策略。持久性是攻击者用来访问系统的众多网络攻击技术之一;在获得初始访问权限后&#xff0c;他们继续在很长一段时间内保持立足点&#xff0c;以窃取数据、修改…...

MFC与Qt多个控件响应统一响应消息处理

就目前使用C开发框架来说&#xff0c;今天来讲述下MFC框架下与Qt框架下&#xff0c;如何让多个控件响应统一消息处理方法。 功能&#xff1a;假设有5个按钮&#xff0c;需要响应同一个处理函数&#xff0c;该如何实现呢&#xff1f; Qt方式 开发环境&#xff1a;win10 VS201…...

Camunda rest api鉴权

对于rest api 不能没有限制的任何人随意调用&#xff0c;需要提供账号信息。 一&#xff1a;工作流引擎增加过滤器 /*** 对/engine-rest/*进行鉴权&#xff0c;防止非法攻击* 客户端调用需要配置用户凭证否则报错401* camunda.bpm.client.basic-auth.username* camunda.bpm.cl…...

【PostgreSQL】在DBeaver中实现序列、函数、视图、触发器设计

【PostgreSQL】在DBeaver中实现序列、函数、触发器、视图设计 基本配置一、序列1.1、序列使用1.1.1、设置字段为主键&#xff0c;数据类型默认整型1.1.2、自定义序列&#xff0c;数据类型自定义 1.2、序列延申1.2.1、理论1.2.2、测试1.2.3、小结 二、函数2.1、SQL直接创建2.1.1…...

PyQt5-小总结

之前学习PyQt5&#xff0c;然后那段时间想做一个桌面小程序&#xff0c;后来由于学习内容较多就做了一小部分&#xff0c;但是可以进行页面跳转。大家如果是初学者对Python感兴趣而且刚学数据库时可以看看代码&#xff0c;可能会有点启发。 效果&#xff1a; 登录进来是这&…...

vue父组件给子组件传值,子组件不渲染的原因及解决方法

父组件传递给子组件的数据&#xff0c;如果是一个复杂对象&#xff08;例如一个数组或对象&#xff09;&#xff0c;那么子组件只会监听对象的引用而不是对象的内容。这意味着当对象的内容发生变化时&#xff0c;子组件不会更新。 解决&#xff1a; 1、在子组件使用 watch 监听…...

【数据库】MySQL锁

一、锁的基本概念 1、锁的定义 锁是协调多个进程或线程并发访问数据库资源的一种机制。 MySQL中的锁是在服务器层或者存储引擎层实现的&#xff0c;保证了数据访问的一致性与有效性。但加锁是消耗资源的&#xff0c;锁的各种操作&#xff0c;包括获得锁、检测锁是否已解除、…...

mongodb学习篇

目录 前言基本概念数据库-database集合-collection文档-document 部署mongodblinux安装mongodbdocker安装mongodb MongoDB Shell (mongosh)命令行工具mongodb可视化-mongodb-compass、mongo-expressmongodb配置文件mongodb库、集合、文档库基本操作集合基本操作文档的增删改查C…...

kubernetes存储类迁移-备份恢复

背景介绍 kubernetes集群最开始使用了nfs作为存储&#xff0c;随着后续使用过程中数据量逐渐增加&#xff0c;nfs存储性能逐步出现不足&#xff0c;现增加了基于csi的分布式块存储后&#xff0c;需要对原有基于nfs存储类下的pv迁移到新的存储类下。 测试环境 k8s集群版本&am…...

python智能手机芯片

在未来&#xff0c;python智能手机芯片的发展方向可能包括以下几个方面&#xff1a; 强化处理能力&#xff1a;随着智能手机功能的不断扩展和用户需求的增加&#xff0c;处理器的性能需求也在不断提升。未来的python智能手机芯片可能会加强处理器的核心数量和频率&#xff0c;以…...

混淆技术概论

混淆技术概论 引言 在逆向工程领域&#xff0c;混淆技术是一种非常重要的技术手段&#xff0c;通过打破人们的思维惯性&#xff0c;使得逆向分析变得更加困难。本文将会介绍混淆技术的概念、分类及其应用&#xff0c;以及如何使用IPA Guard进行iOS IPA重签名。 混淆技术概述…...

pytest安装失败,报错Could not find a version that satisfies the requirement pytest

问题 安装pytest失败&#xff0c;尝试使用的命令有 pip install pytest pip3 install pytest pip install -U pytest pip install pytest -i https://pypi.tuna.tsinghua.edu.cn/simple但是都会报同样的错&#xff1a; 解决方案 发现可能是挂了梯子的原因&#xff0c;关掉…...

使用 Maven 的 dependencyManagement 管理项目依赖项

使用 Maven 的 dependencyManagement 管理项目依赖项 介绍 在开发 Java 项目时&#xff0c;管理和协调依赖项的版本号是一项重要而繁琐的任务。 而 Maven 提供了 <dependencyManagement> 元素&#xff0c;用于定义项目中所有依赖项的版本。它允许您指定项目中每个依赖…...

三英战吕布web3游戏项目启动全流程

项目是一个学习相关的很好的例子并且开源&#xff0c;原本的项目是连接goerli网络&#xff0c;但我把它修改为可连接ganache网络的项目了&#xff0c;更方便启动。 智能合约部分 进入文件 hardhat.config.js &#xff0c;增加一个钱包私钥 2.执行npm install 3.测试合约 npx ha…...

TS中的类

目录 ES6的类 类的概念 类的构成 类的创建 声明 构造函数 定义内容 创建实例 TS中的类 类声明 构造函数 属性和方法 实例化类 继承 访问修饰符 public private protected 成员访问修饰符的使用原则 访问器 只读成员与静态成员 readonly static 修饰符总…...

玩转硬件之玩改朗逸中控设备

这是一个有关一件被拆卸的朗逸中控设备的故事。这个设备已经闲置多年&#xff0c;但是它的命运发生了转变。它被改装成了一台收音机和MP3播放器。 这个设备曾经是一辆朗逸的中控屏幕&#xff0c;就是因为它没有倒车影像&#xff0c;它就被拆了下来&#xff0c;被扔在了一个角落…...

根据MySql的表名,自动生成实体类,模仿ORM框架

ORM框架可以根据数据库的表自动生成实体类&#xff0c;以及相应CRUD操作 本文是一个自动生成实体类的工具&#xff0c;用于生成Mysql表对应的实体类。 新建Winform窗体应用程序AutoGenerateForm&#xff0c;框架(.net framework 4.5)&#xff0c; 添加对System.Configuration的…...

Mac上安装tensorflow介绍留存

此预版本为 macOS 11.0 提供了硬件加速的 TensorFlow 和 TensorFlow 插件。M1 Mac 和基于 Intel 的 Mac 通过 Apple 的 ML 计算框架支持本机硬件加速。 TensorFlow r2.4rc0TensorFlow Addons 0.11.2 TensorFlow 插件 0.11.2 REQUIREMENTS 要求 macOS 11.0Python 3.8 (requir…...

【赠书第16期】码上行动:用ChatGPT学会Python编程

文章目录 前言 1 ChatGPT简介 2 Python编程简介 3 使用ChatGPT学习Python编程 4 如何使用ChatGPT学习Python编程 5 推荐图书 6 粉丝福利 前言 随着人工智能技术的不断发展&#xff0c;聊天机器人已经成为我们日常生活和工作中不可或缺的一部分。其中&#xff0c;ChatGP…...

LeetCode 每日一题 2024/1/1-2024/1/7

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 1/1 1599. 经营摩天轮的最大利润1/2 466. 统计重复个数1/3 2487. 从链表中移除节点1/4 2397. 被列覆盖的最多行数1/5 1944. 队列中可以看到的人数1/6 2807. 在链表中插入最…...

7+单细胞+空转+实验验证,如何根据内容开展相关经验给你启发

导语 今天给同学们分享一篇生信文章“CD8 tissue-resident memory T cells induce oral lichen planus erosion via cytokine network”&#xff0c;这篇文章发表在Elife期刊上&#xff0c;影响因子为7.7。 结果解读&#xff1a; 单细胞RNA测序揭示了具有不同临床亚型的OLP的细…...

Verifiable Credentials可验证证书 2023 终极指南

1. 引言 Dock公司为去中心化数字身份领域的先驱者&#xff0c;其自2017年以来&#xff0c;已知专注于构建前沿的可验证证书&#xff08;Verifiable Credentials&#xff09;技术。本文将阐述何为电子证书、电子证书工作原理、以及其对组合和个人的重要性。 伪造实物证书和数字…...

R语言【sp】——SpatialPoints():创建类SpatialPoints或SpatialPointsDataFrame的对象

Package sp version 1.5-0 Description 从坐标或数据帧的坐标创建类 SpatialPoints-class 或 SpatialPointsDataFrame-class 的对象。 Usage SpatialPoints(coords, proj4stringCRS(as.character(NA)), bbox NULL)SpatialPointsDataFrame(coords, data, coords.nrs numeric…...

【Verilog】期末复习——简要说明仿真时阻塞赋值和非阻塞赋值的区别。always语句和initial语句的关键区别是什么?能否相互嵌套?

系列文章 数值&#xff08;整数&#xff0c;实数&#xff0c;字符串&#xff09;与数据类型&#xff08;wire、reg、mem、parameter&#xff09; 运算符 数据流建模 行为级建模 结构化建模 组合电路的设计和时序电路的设计 有限状态机的定义和分类 期末复习——数字逻辑电路分…...

分享一个idea插件MyBatisX的Bug

分享一个idea插件MyBatisX的Bug The plugin com.baomidou.plugin.idea. mybatisx failed to save settings and has been disabled. Please restart IntelliJ IDEAjava.lang.Throwableat com.intellij.openapi.project.DumbServiceImpl.queueTask(DumbServiceImpl.java:293)at…...

Linux网络

一、Linux网络 查看基础的网络配置 网关、路由&#xff1a;route —n 网关、路由route —nIP地址ifconfig ip aDNS 服务器cat /etc/resolv.conf主机名hostname网络连接状态ss、netstat、syn—sent域名解析nalookup、host 1.1 ifconfig 网络接口配置 临时性修改网卡 …...

淘宝客如何做免费的网站/下载百度 安装

在 Linux 下用 grep 时高亮显示匹配的部分 用 grep 匹配文件时&#xff0c;显示结果黑压压的一片,在你执行find命令前&#xff0c;先执行一下这条命令&#xff0c;重新 grep 试试看 export GREP_OPTIONS--colorauto 好看多了&#xff0c;不是吗&#xff1f; 也可以这命令加入…...

吴桥做网站价格/舆情网站

将新插入磁盘的Frimware state修改为unconfig good 找到unconfig bad的磁盘 # ./MegaCli64 -pdlist -a0 Adapter #0 Enclosure Device ID: 252 Slot Number: 0 Drives position: DiskGroup: 0, Span: 0, Arm: 0 Enclosure position: N/A Device Id: 2 WWN: 5000C50098BAA7…...

花生壳 做网站/免费引流app下载

本节介绍如何使用SSH与远程MySQL服务器建立加密连接。该信息由David Carlson dcarlsonmplcomm.com提供。启动Windows SSH客户端。设置Host_Name yourmysqlserver_URL_or_IP。设置useridyour_userid 登录到您的服务器。该值可能与您的MySQL帐户的用户名 userid不同。设置端口转…...

如何建设国际网站首页/网站在线客服系统 免费

文章目录*线程安全性**2.1什么是线程安全性**2.2原子性**2.2.1竞态条件**2.2.2示例&#xff1a;延迟初始化中的竞态条件**2.2.3符合操作**2.3加锁机制**2.3.1内置锁**2.3.2重入**2.4用锁来保护状态**2.5活跃性与性能*线程安全性 要编写线程安全的代码&#xff0c;其核心在于要对…...

常州网站建设公司市场/网络推广有效果吗

本来想用分享的&#xff0c;可是却没有权限。无奈&#xff0c;只能写到这里 开源中国社区 http://www.oschina.net/ 找到您想要的开源软件&#xff0c;分享和交流 InfoQ http://www.infoq.com/cn/ 时刻关注企业软件开发领域的变化与创新 OphoneSDN http://www.ophonesdn.c…...

石家庄网站排名/网络推广外包公司干什么的

1.查看系统中文字体 #fc-list :langzh 2.如果提示commont not fount 说明为安装fontconfig 3.安装fontconfig #yum -y install fontconfig 4.再次查看系统中文字体 #fc-list :langzh 5.确认是否存在字体 -->> simhei.ttf 6.创建目录&#xff1a; #mkdir -p /usr/share/fo…...