爬虫 — App 爬虫(二)

目录

  • 一、Appium介绍
  • 二、node.js 安装
  • 三、Java 的 SDK 安装以及配置
    • 1、安装步骤
    • 2、配置环境变量
  • 四、安卓环境的配置
    • 1、配置环境变量
  • 五、Appium 安装
    • 1、安装
    • 2、打开 APP
    • 3、使用
  • 六、Appium 使用
    • 1、定位数据(方法一,不常用)
    • 2、定位数据(方法二,常用)
    • 3、练习
    • 4、界面滑动
  • 七、案例

一、Appium介绍

类似于 selenium,找包比较困难,加密参数比较难解的时候使用。

所需环境

  • node.js

  • Java 的 SDK

  • 安卓的 SDK

  • Appium 应用程序

  • 模拟器

二、node.js 安装

node.js 下载官网

安装步骤

1、点击 Next;

在这里插入图片描述

2、选中勾选框后,点击 Next;

在这里插入图片描述

3、选中安装路径后,点击 Next;

在这里插入图片描述

4、点击 Next;

在这里插入图片描述

5、点击 Next;

在这里插入图片描述

6、点击 Install;

在这里插入图片描述

7、点击 Finish;

在这里插入图片描述

8、安装完成。

9、验证安装。

按 win + R,输入 cmd 后,按回车。

在这里插入图片描述

在终端窗口输入以下命令:

node -v 显示安装的 node.js 版本

npm -v 显示安装的 npm 版本

在这里插入图片描述

三、Java 的 SDK 安装以及配置

点击进入官网下载

点击进入百度网盘下载,版本:jdk-8u211-windows-x64

1、安装步骤

1、点击“下一步”;

在这里插入图片描述

2、更改安装路径后,点击“确定”;

在这里插入图片描述

3、点击“下一步”;

在这里插入图片描述

4、更改安装目录后,点击“下一步”;

在这里插入图片描述

5、点击“关闭”;

在这里插入图片描述

2、配置环境变量

1、在桌面上“此电脑”图标上右击,选择“属性”,选择“高级系统设置”;

2、选择“高级”,点击“环境变量”;

在这里插入图片描述

3、找到系统变量,点击“新建”;

在这里插入图片描述

4、填入变量名和变量值,变量值为安装路径,点击“确定”;

变量名输入:JAVA_HOME

变量值输入:E:\Install\Java\jdk1.8.0_211

在这里插入图片描述

5、还需要新建一个变量值,点击“新建”;

在这里插入图片描述

6、填入变量名和变量值,点击“确定”;

变量名输入:CLASS_PATH

变量值输入:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

在这里插入图片描述

7、选中“Path”,点击“编辑”;

在这里插入图片描述

8、点击“新建”,添加一个路径:%JAVA_HOME%\bin 后,点击“确定”;

在这里插入图片描述

9、验证是否安装成功,打开终端,输入 java -version,出现对应的版本号就可以了。

在这里插入图片描述

四、安卓环境的配置

点击进入下载地址

下载后解压到任意目录下

1、配置环境变量

1、在桌面上“此电脑”图标上右击,选择“属性”,选择“高级系统设置”;

2、选择“高级”,点击“环境变量”;

在这里插入图片描述

3、找到系统变量,点击“新建”;

在这里插入图片描述

4、填入变量名和变量值,变量值为安装路径,点击“确定”;

变量名输入:ANDROID_HOME

变量值输入:E:\Install\androidsdk

在这里插入图片描述

5、选中“Path”,点击“编辑”;

在这里插入图片描述

6、点击“新建”,编辑系统环境的 Path 后,点击“确定”;

%ANDROID_HOME%\platform-tools

%ANDROID_HOME%\tools

在这里插入图片描述

7、验证是否配置成功,打开终端,输入adb。

在这里插入图片描述

adb:安卓调试桥

Android 环境和开发环境之间桥梁

可以让用户在电脑上对手机进行全面的操作

五、Appium 安装

点击进入下载地址

1、安装

1、按需求选择后,点击“安装”;

在这里插入图片描述

2、点击“完成”;

在这里插入图片描述

2、打开 APP

方法一:使用 Appium 的内置驱动打开 APP

方法二:使用 Python 代码打开 APP

  • 在终端查看 selenium 版本

    命令:pip show selenium

  • 版本低于 4.1.1 的需要升级一下(需要先把 Python 升级到 3.7 以上版本)

    命令:pip install selenium==4.1.1

  • 安装 Appium 第三方库

    命令:pip install appium-python-client

    如果报以下错误

    WARNING: You are using pip version 20.1.1; however, version 23.1.2 is available.
    You should consider upgrading via the ‘e:\install\python37\python.exe -m pip install --upgrade pip’ command.

    可在终端输入命令:python.exe -m pip install --upgrade pip

3、使用

1、启动模拟器,新开一个模拟器(专门用来采用 Appium 来爬取数据);

2、进去模拟器后,进入“工具”,进入“设置”,进入“关于平板电脑”,不停的点击版本号,直到出现开发者选项,打开 usb 调试;

3、重启模拟器 ;

4、双击打开安装好的 Appium,输入本地 IP 地址 127.0.0.1 后,点击“Start Server v1.15.1”;

在这里插入图片描述

5、验证 Appium 是否可以操作模拟器;

命令:adb devices -l

在这里插入图片描述

如果报以下错误

adb server version (36) doesn’t match this client (41); killing…

原因:由于 SDK 里 adb 和夜神模拟器的 adb 版本不匹配导致

解决方法:

1、找到 androidsdk 文件夹所在目录下的 platform-tools 文件夹下的 adb.exe,复制到桌面,重命名为 nox_adb.exe

2、找到夜神模拟器安装文件夹所在的目录下的 bin 文件夹下的 nox_adb.exe,重命名为 nox_adb_old.exe

3、把桌面上的 nox_adb.exe 拷贝到夜神模拟器的 bin 文件夹下

4、重启模拟器

6、在模拟器里打开需要获取包名和界面名的页面;

在终端输入命令:

adb shell dumpsys window windows | findstr mFocusedApp

输出结果:

mFocusedApp=AppWindowToken{c618cec token=Token{577693eActivityRecord{3fe15f9 u0 com.android.browser/.BrowserActivity t7}}}

包名:com.android.browser

界面名:.BrowserActivity

7、运行代码;

from appium import webdriver  # 导入 appium 的 webdriver 库,用于自动化测试移动应用程序# 创建一个字典用于存储配置参数
caps = dict()
# 配置连接参数
# 设置系统为 Android
caps['platformName'] = 'Android'
# 设置平台版本为 7.1.2(模拟器-关于平板-版本号)
caps['platformVersion'] = '7.1.2'
# 设置设备名称为 Android(可以换)
caps['deviceName'] = 'Android'
# 设置应用程序的包名
caps['appPackage'] = 'com.android.browser'
# 设置应用程序的界面名
caps['appActivity'] = '.BrowserActivity'
# 有需要输入中文,需要设置为 True
caps['unicodeKeyboard'] = True
# 重置键盘设置,恢复原来的输入法
caps['resetKeyboard'] = True
# 禁用应用程序的重置,不需要重置 APP 状态,就设置为 True
caps['noReset'] = True
# 设置新命令的超时时间为 6000 毫秒
caps['newCommandTimeout'] = 6000
# 设置自动化引擎为 UiAutomator2
caps['automationName'] = 'UiAutomator2'# 创建 Appium WebDriver 实例,连接到 Appium 服务器,加载驱动
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', caps)
# 打开网址
driver.get('https://www.baidu.com/')

六、Appium 使用

1、定位数据(方法一,不常用)

1、Appium 先停止服务并且完全退出;

2、找到 androidsdk 文件夹,点击 tools 文件夹,点击 bin 文件夹,双击 uiautomatorviewer.bat 文件;

3、点击图标;

在这里插入图片描述

4、找到需要定位的数据。

在这里插入图片描述

2、定位数据(方法二,常用)

1、打开 Appium,输入本地 IP 地址 127.0.0.1 后,点击“Start Server v1.15.1”;

在这里插入图片描述

2、点击图标;

在这里插入图片描述

3、按照代码添加参数;

# 配置连接参数
# 设置系统为 Android
caps['platformName'] = 'Android'
# 设置平台版本为 7.1.2(模拟器-关于平板-版本号)
caps['platformVersion'] = '7.1.2'
# 设置设备名称为 Android(可以换)
caps['deviceName'] = 'Android'
# 设置应用程序的包名
caps['appPackage'] = 'com.android.browser'
# 设置应用程序的界面名
caps['appActivity'] = '.BrowserActivity'
# 有需要输入中文,需要设置为 True
caps['unicodeKeyboard'] = True
# 重置键盘设置,恢复原来的输入法
caps['resetKeyboard'] = True
# 禁用应用程序的重置,不需要重置 APP 状态,就设置为 True
caps['noReset'] = True
# 设置新命令的超时时间为 6000 毫秒
caps['newCommandTimeout'] = 6000
# 设置自动化引擎为 UiAutomator2
caps['automationName'] = 'UiAutomator2'

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3、练习

需求:打开浏览器,地址栏输入 www.douban.com 后按回车

分析:

1、打开浏览器

2、鼠标点击地址栏

3、输入网址

4、回车

代码实现

from appium import webdriver  # 导入 appium 的 webdriver 库,用于自动化测试移动应用程序
from appium.webdriver.extensions.android.nativekey import AndroidKey  # 导入 AndroidKey 模块,用于模拟 Android 设备的按键操作
from selenium.webdriver.common.by import By  # 导入 By 模块,用于定位元素# 创建一个字典用于存储配置参数
caps = dict()
# 配置连接参数
# 设置系统为 Android
caps['platformName'] = 'Android'
# 设置平台版本为 7.1.2(模拟器-关于平板-版本号)
caps['platformVersion'] = '7.1.2'
# 设置设备名称为 Android(可以换)
caps['deviceName'] = 'Android'
# 设置应用程序的包名--浏览器
caps['appPackage'] = 'com.android.browser'
# 设置应用程序的界面名
caps['appActivity'] = '.BrowserActivity'
# 有需要输入中文,需要设置为 True
caps['unicodeKeyboard'] = True
# 重置键盘设置,恢复原来的输入法
caps['resetKeyboard'] = True
# 禁用应用程序的重置,不需要重置 APP 状态,就设置为 True
caps['noReset'] = True
# 设置新命令的超时时间为 6000 毫秒
caps['newCommandTimeout'] = 6000
# 设置自动化引擎为 UiAutomator2
caps['automationName'] = 'UiAutomator2'# 创建 Appium WebDriver 实例,连接到 Appium 服务器,加载驱动
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', caps)
# 定位输入框元素
input_tag = driver.find_element(By.ID, 'com.android.browser:id/url')
# 进行点击操作
input_tag.click()
# 在输入框中输入指定的网址
input_tag.send_keys('www.douban.com')
# 模拟按下 ENTER 键
driver.press_keycode(AndroidKey.ENTER)

4、界面滑动

分为:

从一个元素滑动到另外一个元素

从一个位置滑动到另外一个位置

需求:进入“设置”界面,从“WLAN”滑动到“声音”

分析:

1、在模拟器里打开“设置”界面;

2、获取“设置”界面的包名和界面名;

在终端输入命令:

adb shell dumpsys window windows | findstr mFocusedApp

输出结果:

mFocusedApp=AppWindowToken{b9a8e16 token=Token{2ed7d8 ActivityRecord{a2e16bb u0 com.android.settings/.Settings t13}}}

包名:com.android.settings

界面名:.Settings

from appium import webdriver  # 导入 appium 的 webdriver 库,用于自动化测试移动应用程序# 创建一个字典用于存储配置参数
caps = dict()
# 配置连接参数
# 设置系统为 Android
caps['platformName'] = 'Android'
# 设置平台版本为 7.1.1(模拟器-关于平板-版本号)
caps['platformVersion'] = '7.1.1'
# 设置设备名称为 Android(可以换)
caps['deviceName'] = 'Android'
# 设置应用程序的包名--设置
caps['appPackage'] = 'com.android.settings'
# 设置应用程序的界面名
caps['appActivity'] = '.Settings'
# 有需要输入中文,需要设置为 True
caps['unicodeKeyboard'] = True
# 重置键盘设置,恢复原来的输入法
caps['resetKeyboard'] = True
# 禁用应用程序的重置,不需要重置 APP 状态,就设置为 True
caps['noReset'] = True
# 设置新命令的超时时间为 6000 毫秒
caps['newCommandTimeout'] = 6000
# 设置自动化引擎为 UiAutomator2
caps['automationName'] = 'UiAutomator2'# 创建 Appium WebDriver 实例,连接到 Appium 服务器,加载驱动
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', caps)

3、在 Appium 里输入配置参数,保存好后,运行;

4、定位数据“WLAN”和“声音”的位置,然后滑动;

from appium import webdriver  # 导入 appium 的 webdriver 库,用于自动化测试移动应用程序
from selenium.webdriver.common.by import By  # 导入 By 模块,用于定位元素# 创建一个字典用于存储配置参数
caps = dict()
# 配置连接参数
# 设置系统为 Android
caps['platformName'] = 'Android'
# 设置平台版本为 7.1.1(模拟器-关于平板-版本号)
caps['platformVersion'] = '7.1.1'
# 设置设备名称为 Android(可以换)
caps['deviceName'] = 'Android'
# 设置应用程序的包名--设置
caps['appPackage'] = 'com.android.settings'
# 设置应用程序的界面名
caps['appActivity'] = '.Settings'
# 有需要输入中文,需要设置为 True
caps['unicodeKeyboard'] = True
# 重置键盘设置,恢复原来的输入法
caps['resetKeyboard'] = True
# 禁用应用程序的重置,不需要重置 APP 状态,就设置为 True
caps['noReset'] = True
# 设置新命令的超时时间为 6000 毫秒
caps['newCommandTimeout'] = 6000
# 设置自动化引擎为 UiAutomator2
caps['automationName'] = 'UiAutomator2'# 创建 Appium WebDriver 实例,连接到 Appium 服务器,加载驱动
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', caps)
# 定位元素--WLAN
WLAN = driver.find_element(By.XPATH, '//*[@text="WLAN"]')
# 定位元素--声音
sy = driver.find_element(By.XPATH, '//*[@text="声音"]')
# 滑动
# 从一个元素滑动到另外一个元素
# 手的操作是往上,内容是往下加载
driver.drag_and_drop(sy, WLAN)

注意:

如果要滑动到的位置不在第一页里,直接滑动会报错

需要滑动到第一页的最后的位置,等下一页的内容加载出来,才能再滑动

七、案例

目标 APP:笔趣阁

需求:爬取排行榜的标题及简介

分析

1、打开笔趣阁 APP

2、点击榜单

3、点击热搜榜

4、获取第一页后,滑动,获取第二页数据,滑动,直到获取50条数据

5、多次滑动,可以用循环

6、不通过直接获取包名和界面名来打开笔趣阁,可以直接通过定位 APP 位置

代码实现

import json  # 导入 json 模块,用于处理 JSON 格式的数据
import time  # 导入 time 模块,用于添加延时等待
from appium import webdriver  # 导入 appium 的 webdriver 库,用于自动化测试移动应用程序
from selenium.webdriver.common.by import By  # 导入 By 模块,用于定位元素# 创建一个字典用于存储配置参数
caps = dict()
# 配置连接参数
# 设置系统为 Android
caps['platformName'] = 'Android'
# 设置平台版本为 7.1.1(模拟器-关于平板-版本号)
caps['platformVersion'] = '7.1.1'
# 设置设备名称为 Android(可以换)
caps['deviceName'] = 'Android'
# 有需要输入中文,需要设置为 True
caps['unicodeKeyboard'] = True
# 重置键盘设置,恢复原来的输入法
caps['resetKeyboard'] = True
# 禁用应用程序的重置,不需要重置 APP 状态,就设置为 True
caps['noReset'] = True
# 设置新命令的超时时间为 6000 毫秒
caps['newCommandTimeout'] = 6000
# 设置自动化引擎为 UiAutomator2
caps['automationName'] = 'UiAutomator2'# 创建 Appium WebDriver 实例,连接到 Appium 服务器,加载驱动
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', caps)
# 定位笔趣阁 App,并点击
driver.find_element(By.XPATH, '//android.widget.TextView[@content-desc="笔趣阁"]').click()
# 等待3秒
time.sleep(3)
# 点击榜单
driver.find_element(By.XPATH, '/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.TabHost/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout[1]/android.widget.LinearLayout/android.widget.LinearLayout[2]/android.widget.ImageView').click()
# 等待2秒
time.sleep(2)
# 点击热搜榜
driver.find_element(By.ID, 'com.bqg.ddnoverl:id/tvAiRkName').click()
# 创建一个空集合,用于存储数据项,自动去重
data = set()
# 获取屏幕的尺寸
window_size = driver.get_window_size()
# 高跟宽
height, width = window_size.get('height'), window_size.get('width')
while True:# 等待3秒time.sleep(3)# 获取多个榜单元素contents = driver.find_elements(By.XPATH, '/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.widget.RelativeLayout/android.widget.RelativeLayout/android.widget.LinearLayout')# 打印榜单元素数量print(len(contents))# 循环获取数据for content in contents:try:# 创建一个空字典,用于存储每个内容项的信息item = {}# 标题item['title'] = content.find_element(By.ID, 'com.bqg.ddnoverl:id/tvClTitle').text# 简介item['content'] = content.find_element(By.ID, 'com.bqg.ddnoverl:id/tvClDesc').text# 打印数据print(item)# 将数据转换为 JSON 格式并添加到集合中# 集合里面的添加是不能直接添加字典的,需要转换类型data.add(json.dumps(item, ensure_ascii=False))except:# 处理数据异常情况print('数据有误')if len(data) < 50:# 在应用中进行滑动操作,从屏幕的上部中间位置向下滑动到屏幕的下部中间位置,持续时间为1000毫秒driver.swipe(width * 0.5, height * 0.7, width * 0.5, height * 0.2, 1000)# 打印提示print("滑动成功")else:# 数据达到50个,跳出循环break
# 打印最终的数据集合
print(data)

记录学习过程,欢迎讨论交流,尊重原创,转载请注明出处~

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

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

相关文章

磁盘检测工具DiskInfo下载

网址&#xff1a;Download - Crystal Dew World [en] (crystalmark.info) PS:乍一看还以为是什么二次元网站 划到这里&#xff0c;下载zip 等待一会就会自动弹出下载了 选择合适的位置即可

token登录的实现

token登录的实现 我这种token只是简单的实现token&#xff0c;就是后端利用UUID 生成简单随机码&#xff0c;利用随机码作为在Redis中的键&#xff0c;然后存储的用户信息作为值&#xff0c;在每次合理请求的时候对token的有效时间进行刷新&#xff08;利用拦截器&#xff09;&…

FPGA project : DS18B20

本想着一天发一个实验的&#xff0c;这个ds18b20&#xff0c;耗时两天。代码写了两次&#xff0c;呜呜~ 由于第二次写代码没画时序图&#xff0c;所以代码和时序图一些参数有些不一致&#xff0c;但问题不大。 这里有几件事情值得一提&#xff1a; 1&#xff1a;关于状态机的…

ceph分布式存储

ceph特点 Ceph项目最早起源于Sage就读博士期间的工作&#xff08;最早的成果于2004年发表&#xff09;&#xff0c;并随后贡献给开源社区。在经过了数年的发展之后&#xff0c;目前已得到众多云计算厂商的支持并被广泛应用。RedHat及OpenStack都可与Ceph整合以支持虚拟机镜像的…

【C语言】求一个整数的二进制序列中1的个数的三种方法

方法一&#xff1a;逐位%2法 该方法的初步测试代码如下: int NumberOf1(int n) {int count 0;while (n){if (n % 2 1){count;}n n / 2;}return count; } 众所周知&#xff0c;数据在内存里以补码的形式存储&#xff0c;这是为了简化计算机的结构设计&#xff0c;同时也提…

【数据结构】哈希表(详)

文章目录 前言正文一、基本概念二、基本原理1.哈希函数1.1直接定址法&#xff08;常用&#xff09;1.2除留余数法&#xff08;常用&#xff09;1.3 平方取中法&#xff08;了解&#xff09;1.4 折叠法(了解)1.5 随机数法(了解)1.6数学分析法(了解) 2.哈希冲突2.1 平均查找长度2…

Python —— excel文件操作(超详细)

背景 很多公司还是用excel去管理测试用例的&#xff0c;所以为了减少重复繁琐的导出导出工作&#xff0c;学会如何用代码操作excel表格很实用~ 1、读取excel文件基本步骤 1、操作excel的一些库 1、xlrd&#xff1a;读取库&#xff0c;xlwt&#xff1a;写入&#xff0c;现在…

No servers available for service: renren…。 Gateway 网关报503错误 ,已解决

目录 环境配置问题描述loadbalancer的作用 环境配置 问题描述 配置spring cloud gateway使用端口访问就可以&#xff0c;使用lb:// 就报503 gateway:routes:- id: admin_routeuri: lb://gulimall-admin # uri: http://localhost:8080predicates:- Path/api/**filter…

蓝桥杯 题库 简单 每日十题 day7

01 啤酒和饮料 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。啤酒每罐2.3元&#xff0c;饮料每罐1.9元。小明买了若干啤酒和饮料&#xff0c;一共花了82.3元。我们还知道他买的啤酒比饮料的数量少&#xff0c;请你…

CVPR 2023 | UniMatch: 重新审视半监督语义分割中的强弱一致性

在这里和大家分享一下我们被CVPR 2023录用的工作"Revisiting Weak-to-Strong Consistency in Semi-Supervised Semantic Segmentation"。在本工作中&#xff0c;我们重新审视了半监督语义分割中的“强弱一致性”方法。我们首先发现&#xff0c;最基本的约束强弱一致性…

RHCE---时间服务器

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 Linux中的时间服务器是指NTP服务器&#xff0c;NTP是Network Time Protocol的缩写&#xff0c;即网络时间协议。NTP服务器可以提供精确的时间信息&#xff0c;从而使得网络上的所有设备都能…

C语言文件的相关操作

C语言中文件的相关操作 文件的打开 使用文件的打开函数需要引入这个头文件&#xff1a;#include <fcntl.h> open函数 int open(char const *pathname, int flags, mode_t mode) 功能&#xff1a;打开已有的文件或者创建新文件参数 pathname&#xff1a;文件路径名&…

基于Python+Tkinter实现一个贪食蛇小游戏

你是否还记得那个时代&#xff0c;当我们的手机还没有触摸屏&#xff0c;游戏也只有像“贪食蛇”这样的经典款&#xff1f;当时&#xff0c;许多人都沉迷于控制一条小蛇吃食物的乐趣中。而今&#xff0c;让我们利用Python和Tkinter&#xff0c;一起重温那个时代&#xff0c;制作…

C语言基础知识点(八)联合体和大小端模式

以下程序的输出是&#xff08;&#xff09; union myun {struct { int x, y, z;} u;int k; } a; int main() {a.u.x 4;a.u.y 5;a.u.z 6;a.k 0;printf("%d\n", a.u.x); } 小端模式 数据的低位放在低地址空间&#xff0c;数据的高位放在高地址空间 简记&#xff…

使用Java将PPT、PPTX和PDF转换为图片

从Office到图片—使用Java实现文件格式转换 PDF转图片1. 万事第一步2. 撸代码 PPT/PPTX转图片1. 万事第一步2. 撸代码验收一下 最近小雨遇到了一个需求&#xff0c;需要在前端小程序中嵌入展示Office文件的功能。然而&#xff0c;前端使用开源组件进行在线预览会导致性能消耗较…

R语言贝叶斯广义线性混合(多层次/水平/嵌套)模型GLMM、逻辑回归分析教育留级影响因素数据...

全文下载链接&#xff1a;http://tecdat.cn/?p24203 本教程使用R介绍了具有非信息先验的贝叶斯 GLM&#xff08;广义线性模型&#xff09; &#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 当前教程特别关注贝叶斯逻辑回归在二元结果和计数/比例结果场景中的…

基于SSM框架的《超市订单管理系统》Web项目开发(第四天)用户管理,增删改查(日期插件的使用)

基于SSM框架的《超市订单管理系统》Web项目开发&#xff08;第四天&#xff09;用户管理&#xff0c;增删改查&#xff08;日期插件的使用&#xff09; 昨天我们实现了多表关联查询&#xff0c;还有分页显示数据的功能。那么今天我们要继续完善用户管理这一模块。 今天要完成的…

clickhouse简单安装部署

目录 前言(来源于官方文档)&#xff1a; 一.下载并上传 1.下载地址&#xff1a;点我跳转下载 2.上传至Linux 二.解压和配置 1.解压顺序 注意&#xff1a;必须按照以下顺序解压&#xff0c;并且每解压一个都要执行该解压后文件的install/doinst.sh文件 解压步骤&#xff…

玩玩“小藤”开发者套件 Atlas 200I DK A2 之VSCode远程连接

玩玩“小藤”开发者套件 Atlas 200I DK A2 之VSCode远程连接 0. 背景1. VSCode 安装 Remote - SSH 插件2. 安装 OpenSSH 组件3. VSCode SSH 连接 Atlas 200I DK A24. 打开远程文件夹 0. 背景 总所周知&#xff0c;英伟达的GPU供不应求&#xff0c;还各种限制。华为推出了升腾A…

数据结构与算法:排序算法(2)

目录 堆排序 使用步骤 代码实现 计数排序 适用范围 过程 代码实现 排序优化 桶排序 工作原理 代码实现 堆排序 二叉堆的特性&#xff1a; 1. 最大堆的堆顶是整个堆中的最大元素 2. 最小堆的堆顶是整个堆中的最小元素 以最大堆为例&#xff0c;如果删除一个最大堆的…