用Selenium开启自动化网页交互与数据抓取之旅
用Selenium开启自动化网页交互与数据抓取之旅
在当今数字化时代,数据的价值不言而喻,而网页作为海量数据的重要载体,如何高效获取其中的关键信息成为众多开发者和数据爱好者关注的焦点。Selenium这一强大工具,为我们打开了自动化操作网页和精准抓取数据的大门。今天,就来和大家深入聊聊Selenium的使用。
一、Selenium是什么
Selenium本质上是一款用于Web应用程序测试的工具,但它的用途远不止于此。简单来说,它可以驱动各种浏览器,像Chrome、Firefox、Edge等,按照我们编写的脚本代码去执行一系列操作,比如点击按钮、输入文本、打开网页以及验证页面元素等,模拟真实用户在浏览器上的行为。这意味着我们可以借助它实现网页操作的自动化,无论是繁琐的重复性任务,还是复杂的数据采集工作,都能轻松应对。
二、Selenium的工作原理
浏览器能够被Selenium驱动,关键在于webdriver驱动程序。不同的浏览器需要对应不同版本的webdriver,例如Chrome浏览器就有专门为其开发的chromedriver。webdriver就像是浏览器的“遥控器”,通过与浏览器内核进行交互,控制浏览器执行我们设定的命令。这就要求在使用Selenium时,务必确保下载的webdriver版本与所使用的浏览器版本相匹配,否则可能会出现各种兼容性问题。
三、Selenium的使用方法
(一)使用前的准备工作
- 安装Selenium库:安装Selenium非常简单,使用pip命令即可。在命令行中输入
pip install selenium -i https://pypi.mirrors.ustc.edu.cn/simple/
,就能快速完成安装。如果使用的是PyCharm等集成开发环境,也可以在其界面中轻松完成安装操作。 - 下载浏览器内核驱动:以Chrome浏览器为例,其内核驱动地址为
https://chromedriver.storage.googleapis.com/index.html
。下载后,根据不同的操作系统进行相应的配置。在Windows系统中,解压下载的文件,并将其放置在Python安装目录的Scripts文件夹下;Linux和Mac系统类似,但要注意系统中可能存在多个Python版本,需确保配置的是当前运行的Python版本的环境变量。
(二)基本操作示例
- 打开网页并进行搜索:下面这段代码展示了如何使用Selenium打开苏宁易购网站,并搜索“手机”。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys__browser_url = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
chrome_options = Options()
chrome_options.binary_location = __browser_url
driver = webdriver.Chrome(options=chrome_options) driver.get('https://www.suning.com/')
driver.find_element_by_id("searchKeywords").send_keys("手机" + Keys.RETURN)
在这段代码中,首先创建了一个Options
对象,用于配置浏览器的相关参数,然后指定Chrome浏览器的安装路径,初始化Chrome
驱动。接着使用get
方法打开苏宁易购网站,再通过find_element_by_id
找到搜索框元素,并使用send_keys
方法输入“手机”并回车,完成搜索操作。
- 获取网页元素信息:在网页数据抓取中,获取元素信息是关键步骤。比如,我们可以获取网页上某个元素的文本内容、属性值、位置、标签名以及大小等信息。下面以获取苏宁易购手机商品评论为例:
from selenium import webdriver
from selenium.webdriver.edge.options import Options
import time__browser_url = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
chrome_options = Options()
chrome_options.binary_location = __browser_url
driver = webdriver.Edge(options=chrome_options) from selenium.webdriver.common.by import By
driver.get('https://review.suning.com/cluster_cmmdty_review/cluster-38249278-000000012389328846-0000000000-1-good.htm?originalCmmdtyType=general&safp=d488778a.10004.loverRight.166')yzpj_file = open('优质评价1.txt','w')
def get_py_content(file):pj_elments_content = driver.find_elements(by=By.CLASS_NAME,value= 'body-content')for i in range(len(pj_elments_content)):file.write(pj_elments_content[i].text+'\n')
get_py_content(yzpj_file)next_elements = driver.find_elements_by_xpath('//*[@class="next rv-maidian "]')
print(next_elements)
while next_elements !=[]:next_element = next_elements[0]time.sleep(1)next_element.click()get_py_content(yzpj_file)next_elements = driver.find_elements_by_xpath('//*[@class="next rv-maidian "]')
yzpj_file.close()
这段代码实现了从苏宁易购手机商品评价页面抓取优质评价的功能。首先打开指定的评价页面,然后定义了一个函数get_py_content
,通过find_elements
方法根据类名查找所有评价内容的元素,并将其文本写入文件。接着,使用find_elements_by_xpath
方法查找“下一页”按钮元素,通过循环点击“下一页”按钮,持续获取并保存多页的评价内容。
(三)其他常用操作
- 前进、后退与刷新:在浏览网页时,前进、后退和刷新是常见操作,Selenium同样支持这些功能。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time__browser_url = r"D:\Program Files (x86)\360Roaming\360se6\Application\360se.exe"
chrome_options = Options()
chrome_options.binary_location = __browser_urldriver = webdriver.Chrome(chrome_options=chrome_options)
driver.get('http://www.taobao.com')
driver.get('http://www.baidu.com')
driver.get('http://www.qq.com')
driver.back()
time.sleep(5)
driver.forward()
time.sleep(5)
driver.refresh()
driver.quit()
上述代码展示了如何在不同网页之间切换,以及进行后退、前进和刷新操作,最后关闭浏览器。
- 操作Cookies:Cookies在网页交互中用于存储用户信息等数据,Selenium也能对其进行操作。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options__browser_url = r"D:\Program Files (x86)\360Roaming\360se6\Application\360se.exe"
chrome_options = Options()
chrome_options.binary_location = __browser_urldriver = webdriver.Chrome(chrome_options=chrome_options)
driver.get('http://www.taobao.com')
print(driver.get_cookies())
driver.add_cookie({'name': 'zhangsan', 'value' : '98'})
print(driver.get_cookies())
这段代码获取了淘宝网站的Cookies,并添加了一个自定义的Cookie,再次获取Cookies以查看添加效果。
四、项目实战 - 苏宁易购医用口罩信息抓取
下面通过一个实际项目,展示Selenium在数据抓取方面的强大功能。我们要从苏宁易购网站获取医用口罩的价格、名称、评价数和店铺名称信息。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import time__browser_url = r"D:\Program Files (x86)\360Roaming\360se6\Application\360se.exe"
chrome_options = Options()
# chrome_options.add_argument('--headless')
chrome_options.binary_location = __browser_urldriver = webdriver.Chrome(chrome_options = chrome_options)
driver.get('http://www.suning.com')
element = driver.find_element_by_xpath("//div/input[@tabindex='0']")
element.send_keys("医用口罩" + Keys.RETURN)
time.sleep(20)
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
time.sleep(20)
price_elements = driver.find_elements_by_xpath('//span[@class="def-price"]')
title_elements = driver.find_elements_by_xpath('//div[@class="title-selling-point"]')
evaluate_elements = driver.find_elements_by_xpath('//div[@class="info-evaluate"]')
store_elements = driver.find_elements_by_xpath('//div[@class="store-stock"]')
f = open('医用口罩.txt','w',encoding='utf-8')
for i in range(len(price_elements)):f.write(price_elements[i].text + '\t')f.write(title_elements[i].text + '\t')f.write(evaluate_elements[i].text + '\t')f.write(store_elements[i].text + '\n')
f.close()
在这个项目中,首先打开苏宁易购网站,通过XPath找到搜索框并输入“医用口罩”进行搜索。然后使用execute_script
方法将页面滚动到底部,以便加载更多商品信息。接着,通过XPath分别获取价格、名称、评价数和店铺名称的元素,并将这些信息写入文件中。
Selenium为我们提供了丰富的功能,让网页自动化操作和数据抓取变得更加高效便捷。无论是进行网页测试、数据采集还是自动化任务处理,它都是一个不可多得的好帮手。希望通过这篇博客,大家能对Selenium的使用有更深入的了解,在实际项目中充分发挥它的优势。
相关文章:
用Selenium开启自动化网页交互与数据抓取之旅
用Selenium开启自动化网页交互与数据抓取之旅 在当今数字化时代,数据的价值不言而喻,而网页作为海量数据的重要载体,如何高效获取其中的关键信息成为众多开发者和数据爱好者关注的焦点。Selenium这一强大工具,为我们打开了自动化…...
RabbitMQ的交换机
一、三种交换机模式 核心区别对比 特性广播模式(Fanout)路由模式(Direct)主题模式(Topic)路由规则无条件复制到所有绑定队列精确匹配 Routing Key通配符匹配…...
多模态大语言模型arxiv论文略读(五十五)
MoMA: Multimodal LLM Adapter for Fast Personalized Image Generation ➡️ 论文标题:MoMA: Multimodal LLM Adapter for Fast Personalized Image Generation ➡️ 论文作者:Kunpeng Song, Yizhe Zhu, Bingchen Liu, Qing Yan, Ahmed Elgammal, Xiao…...
TMI投稿指南(四):投稿相关网址
TMI官网:https://ieeetmi.org/ 模版选择器:选择合适的latex模版 IEEE-Template Selector 评审过程状态查看:ScholarOne Manuscripts AE assigns reviewers:副编辑已经开始选择和邀请审稿人,但同意审稿…...
Oracle无法正常OPEN(三)
在Oracle数据库中,如果几个数据文件丢失,导致数据库无法启动,报错“ORA-01157: cannot identify/lock data file 2 - see DBWR trace file”,如果没有物理备份的情况下,位于丢失数据文件的数据是无法找回的,…...
SQL语句练习 自学SQL网 在查询中使用表达式 统计
目录 Day 9 在查询中使用表达式 Day 10 在查询中进行统计 聚合函数 Day 11 在查询中进行统计 HAVING关键字 Day12 查询执行顺序 Day 9 在查询中使用表达式 SELECT id , Title , (International_salesDomestic_sales)/1000000 AS International_sales FROM moviesLEFT JOIN …...
当LLM遇上Agent:AI三大流派的“复仇者联盟”
你一定听说过ChatGPT和DeepSeek,也知道它们背后的LLM(大语言模型)有多牛——能写诗、写代码、甚至假装人类。但如果你以为这就是AI的极限,那你就too young too simple了! 最近,**Agent(智能体&a…...
模拟开发授权平台
这次只是实现应用的curd和公私钥的校验以及第三方的通知dmeo项目,大家可以拓开视野来编写 进入主题 项目链接:桌角的眼镜/develop_auth_platform 直接下拉并运行就行 回调应用代码在test包中 回调应用测试代码 package mainimport ("encoding/…...
python数据分析(八):Pandas 文本数据处理
Pandas 文本数据处理全面指南 1. 引言 在数据分析中,文本数据是常见的数据类型之一。Pandas 提供了强大的字符串处理方法,可以方便地对文本数据进行各种操作。本文将详细介绍 Pandas 中的文本处理功能,包括字符串连接(cat)、分割(split)、替…...
Spring AI:简化人工智能功能应用程序开发
Spring AI:简化人工智能功能应用程序开发 一、项目简介 Spring AI 项目致力于简化包含人工智能功能的应用程序的开发工作,并且不会引入不必要的复杂性。该项目从著名的 Python 项目(如 LangChain 和 LlamaIndex)中获取灵感&#…...
【算法基础】三指针排序算法 - JAVA
一、基础概念 1.1 什么是三指针排序 三指针排序是一种特殊的分区排序算法,通过使用三个指针同时操作数组,将元素按照特定规则进行分类和排序。这种算法在处理包含有限种类值的数组时表现出色,最经典的应用是荷兰国旗问题(Dutch …...
从实列中学习linux shell9 如何确认 服务器反应迟钝是因为cpu还是 硬盘io 到底是那个程序引起的。cpu负载多高算高
在 Linux 系统中,Load Average(平均负载) 是衡量系统整体压力的关键指标,但它本身没有绝对的“高/低”阈值,需要结合 CPU 核心数 和 其他性能指标 综合分析。以下是具体判断方法: 一、Load Average 的基本含义 定义:Load Average 表示 单位时间内处于可运行状态(R)和不…...
[面试]SoC验证工程师面试常见问题(三)
SoC验证工程师面试常见问题(三) 在 SoC 验证工程师的面试中,面试官可能会要求候选人现场编写 SystemVerilog、UVM (Universal Verification Methodology) 或 SystemC 代码,以评估其编程能力、语言掌握程度以及解决实际验证问题的能力。这种随机抽题写代码的环节通常…...
架构进阶:深入学习企业总体架构规划(Oracle 战略专家培训课件)【附全文阅读】
本文主要讨论了企业总体技术架构规划的重要性与实施建议。针对Oracle战略专家培训课件中的内容,文章强调了行业面临的挑战及现状分析、总体技术架构探讨、SOA集成解决方案讨论与问题解答等方面。文章指出,为了消除信息孤岛、强化应用系统,需要…...
stm32教程:软件I2C通信协议 代码模板提供
早上好啊大伙,这一期也是stm32的基础教学,这一期说的是 —— I2C通信协议。 文章目录 一、I2C协议概述二、物理层特性硬件结构速率模式 三、协议层机制起始与停止信号数据帧结构应答机制时钟同步与仲裁 四、通信协议1. 起始信号(START Condit…...
Java零基础入门Day4:数组与二维数组详解
一、为什么需要数组? 当程序需要处理批量同类型数据时,使用多个变量存储会非常繁琐。例如存储70个学生姓名时,需定义70个变量,而数组可以简化这一过程,提高代码可维护性。 示例:变量存储的弊端 String n…...
一条 SQL 查询语句是如何执行的(MySQL)
第一讲:一条 SQL 查询语句是如何执行的 总览图示 MySQL 查询的执行流程可以大致分为以下步骤(如图所示): 连接器(Connection)查询缓存(Query Cache,MySQL 8.0 已废弃)…...
IntelliJ IDEA
文章目录 一、集成开发环境(IDE, Integrated Development Environment)二、IntelliJ IDEAIDEA 安装 三、IDEA 管理 Java 程序的结构四、IDEA 开发 HelloWorld 程序 一、集成开发环境(IDE, Integrated Development Environment) 把代码编写,编译,执行等多…...
详细说明StandardCopyOption.REPLACE_EXISTING参数的作用和使用方法
StandardCopyOption.REPLACE_EXISTING 是 Java java.nio.file.StandardCopyOption 枚举类中的一个常量,它主要用于在文件复制或移动操作中处理目标文件已存在的情况。下面详细介绍其作用和使用方法。 作用 在使用 java.nio.file.Files 类的 copy() 或 move() 方法时…...
Linux 下使用tcpdump进行网络分析原
简介 tcpdump 是一个命令行数据包分析器,可实时捕获和检查网络流量。它通常用于网络故障排除、性能分析和安全监控。 安装 Debian/Ubuntu sudo apt update && sudo apt install tcpdump -yCentOS/RHEL sudo yum install tcpdump -ymacOS brew install…...
人车交叉作业防撞系统介绍
一、技术原理与核心功能 UWB脉冲测距技术 系统基于UWB技术,通过纳秒级非正弦窄脉冲(脉冲宽度0.21.5ns)实现实时测距,精度可达1030厘米。 工作原理:人员佩戴防撞标签(A)与车载基站(B&…...
移动端开发中设备、分辨率、浏览器兼容性问题
以下是针对移动端开发中设备、分辨率、浏览器兼容性问题的 系统化解决方案,按开发流程和技术维度拆解,形成可落地的执行步骤: 一、基础环境适配:从「起点」杜绝兼容性隐患 1. Viewport 元标签标准化 <meta name"viewpor…...
Git 基本操作(二)
目录 撤销修改操作 情况一 情况二 情况三 删除文件 升级git 撤销修改操作 在日常编码过程中,有些时候,我们可能写着写着发现目前的版本的代码越写越挫,越不符合标准,想让我们当前的文件去恢复到上一次提交的版本…...
多模态大模型轻量化探索-开源SmolVLM模型架构、数据策略及其衍生物PDF解析模型SmolDocling
在《多模态大模型轻量化探索-视觉大模型SAM的视觉编码器》介绍到,缩小视觉编码器的尺寸,能够有效的降低多模态大模型的参数量。再来看一个整体的工作,从视觉侧和语言模型侧综合考量模型参数量的平衡模式,进一步降低参数量…...
gRPC学习笔记记录以及整合gin开发
gprc基础 前置环境准备 grpc下载 项目目录下执行 go get google.golang.org/grpclatestProtocol Buffers v3 https://github.com/protocolbuffers/protobuf/releases/download/v3.20.1/protoc-3.20.1-linux-x86_64.zip go语言插件: go install google.golang.…...
Linux diff 命令使用详解
简介 Linux 中的 diff 命令用于逐行比较文件。它以各种格式报告差异,广泛应用于脚本编写、开发和补丁生成。 基础语法 diff [OPTION]... FILES常用选项 -i:忽略大小写 -u:打印输出时不包含任何多余的上下文行 -c:输出不同行周…...
非对称加密算法(RSA、ECC、SM2)——密码学基础
对称加密算法(AES、ChaCha20和SM4)Python实现——密码学基础(Python出现No module named “Crypto” 解决方案) 这篇的续篇,因此实践部分少些; 文章目录 一、非对称加密算法基础二、RSA算法2.1 RSA原理与数学基础2.2 RSA密钥长度…...
【安装指南】Chat2DB-集成了AI功能的数据库管理工具
一、Chat2DB 的介绍 Chat2DB 是一款开源的、AI 驱动的数据库工具和 SQL 客户端,提供现代化的图形界面,支持 MySQL、Oracle、PostgreSQL、DB2、SQL Server、SQLite、H2、ClickHouse、BigQuery 等多种数据库。它旨在简化数据库管理、SQL 查询编写、报表生…...
【C++】认识map和set
目录 前言: 一:认识map和set 二:map和set的使用 1.set的使用 2.map的使用 三:map的insert方法返回值 四:map的[ ]的使用 五:multiset和multimap 六:map和set的底层数据结构 七&#x…...
LWIP带freeRTOS系统移植笔记
以正点原子学习视频为基础的文章 LWIP带freeRTOS系统移植 准备资料/工程 1、lwIP例程1 lwIP裸机移植 工程 , 作为基础工程 改名为LWIP_freeRTOS_yizhi工程 2、lwIP例程6 lwIP_FreeRTOS移植 工程 3、freeRTO源码 打开https://www.freertos.org/网址下载…...
【MinerU技术原理深度解析】大模型时代的文档解析革命
目录 一、MinerU概述 获取MinerU 二、核心功能与技术亮点 1. 多模态解析能力 2. 高效预处理能力 3. 多场景适配性 4. API服务 三、技术架构解析 3.1 概述 1. 模块化处理流程 2. 关键模型与技术 3.2 核心组件技术原理 3.2.1 布局检测(Layout Detection) 3.2.2 公式…...
rabbitMQ如何确保消息不会丢失
rabbitmq消息丢失的三种情况 生产者将消息发送到RabbitMQ的过程中时,消息丢失。消息发送到RabbitMQ,还未被持久化就丢失了数据。消费者接收到消息,还未处理,比如服务宕机导致消息丢失。 解决方案 生产者发送过程中,…...
数字智慧方案5970丨智慧农业大数据服务建设方案(69页PPT)(文末有下载方式)
详细资料请看本解读文章的最后内容。 资料解读:智慧农业大数据服务建设方案 在当今数字化时代,农业领域也正经历着深刻变革,智慧农业大数据服务建设方案应运而生。这一方案对推动农业现代化进程意义非凡,下面让我们深入剖析其核心…...
英一真题阅读单词笔记 22-23年
2022年真题阅读单词 2022 年 Text 1 第一段 1 complain [kəmˈpleɪn] v. 抱怨,投诉;诉说(病痛) 2 plastic [ˈplstɪk] n. 塑料;信用卡 a. 造型的,塑造的;塑料制的 3 durable [ˈd…...
Java大师成长计划之第10天:锁与原子操作
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在多线程编程中,锁与原子…...
2025大模型安全研究十大框架合集(10份)
2025大模型安全研究十大框架合集的详细介绍: Anthropic AI信任研究框架 Anthropic于2024年10月更新的《安全责任扩展政策》(RSP),提出了一个灵活的动态AI风险治理框架。该框架规定当AI模型达到特定能力时,将自动升级安全措施,如…...
溯因推理思维——AI与思维模型【92】
一、定义 溯因推理思维模型是一种从结果出发,通过分析、推测和验证,寻找导致该结果的可能原因的思维方式。它试图在已知的现象或结果基础上,逆向追溯可能的原因,构建合理的解释框架,以理解事物的本质和内在机制。 二、由来 溯因推理的思想可以追溯到古希腊哲学家亚里士…...
系统架构设计师:设计模式——结构型设计模式
一、结构型设计模式 结构型设计模式涉及如何组合类和对象以获得更大的结构。结构型类模式采用继承机制来组合接口或实现。一个简单的例子是采用多重继承方法将两个以上的类组合成一个类,结果这个类包含了所有父类的性质。 这一模式尤其有助于多个独立开发的类库协…...
接口测试实战指南:从入门到精通的质量保障之道
为什么接口测试如此重要? 在当今快速迭代的软件开发环境中,接口测试已成为质量保障体系中不可或缺的一环。据统计,有效的接口测试可以发现约70%的系统缺陷,同时能将测试效率提升3-5倍。本指南将从实战角度出发,系统性…...
对第三方软件开展安全测评,如何保障其安全使用?
对第三方软件开展安全测评,能够精准找出软件存在的各类安全隐患,进而为软件的安全使用给予保障。此次会从漏洞发现、风险评估、测试环境等多个方面进行具体说明。 漏洞发现情况 在测评过程中,我们借助专业技术与工具,对第三方软…...
计算方法实验四 解线性方程组的间接方法
【实验性质】 综合性实验。 【实验目的】 掌握迭代法求解线性方程组。 【实验内容】 应用雅可比迭代法和Gauss-Sediel迭代法求解下方程组: 【理论基础】 线性方程组的数值解法分直接算法和迭代算法。迭代法将方程组的求解转化为构造一个向量序列&…...
Qt 中基于 QTableView + QSqlTableModel 的分页搜索与数据管理实现
Qt 中基于 QTableView QSqlTableModel 的分页搜索与数据管理实现 一、组件说明 QTableView:一个基于模型的表格视图控件,支持排序、选择、委托自定义。QSqlTableModel:与数据库表直接绑定的模型类,可用于展示和编辑数据库表数据…...
云计算-容器云-服务网格Bookinfo
服务网格:创建 Ingress Gateway 将 Bookinfo 应用部署到 default 命名空间下,请为 Bookinfo 应用创建一个网 关,使外部可以访问 Bookinfo 应用。 上传ServiceMesh.tar.gz包 [rootk8s-master-node1 ~]# tar -zxvf ServiceMesh.tar.gz [rootk…...
PostgreSQL自定义函数
自定义函数 基本语法 //建一个名字为function_name的自定义函数create or replace function function_name() returns data_type as //returns 返回一个data_type数据类型的结果;data_type 是返回的字段的类型;$$ //固定写法......//方法体$$ LANGUAGE …...
学习记录:DAY22
我的重生开发之旅:优化DI容器,git提交规范,AOP处理器,锁与并发安全 前言 我重生了,重生到了五一开始的一天。上一世,我天天摆烂,最后惨遭实习生优化。这一世,我要好好内卷… 今天的…...
HarmonyOS NEXT第一课——HarmonyOS介绍
一、什么是HarmonyOS 万物互联时代应用开发的机遇、挑战和趋势 随着万物互联时代的开启,应用的设备底座将从几十亿手机扩展到数百亿IoT设备。全新的全场景设备体验,正深入改变消费者的使用习惯。 同时应用开发者也面临设备底座从手机单设备到全场景多设…...
数据库系统概论|第五章:数据库完整性—课程笔记1
前言 在前文介绍完数据库标准语言SQL之后,大家已经基本上掌握了关于数据库编程的基本操作,那我们今天将顺承介绍关于数据库完整性的介绍,数据库的完整性是指数据的正确性和相容性。数据的完整性是为了防止数据库中存在不符合语义的数据&…...
开源无人机地面站QGroundControl安卓界面美化与逻辑优化实战
QGroundControl作为开源无人机地面站软件,其安卓客户端界面美化与逻辑优化是提升用户体验的重要工程。 通过Qt框架的界面重构和代码逻辑优化,可以实现视觉升级与性能提升的双重目标。本文将系统讲解QGC安卓客户端的二次开发全流程,包括开发环境搭建、界面视觉升级、多分辨率…...
工作记录 2017-12-12 + 在IIS下发布wordpress
工作记录 2017-12-12 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 在IIS下发布wordpress。 郝 服务器更新 RD服务器更新了,更新的文件放在190的D:\Temp\CHTeam\fnehr_update_20171212\下了。 数据库更新: 数据库没有更新 更新的文件…...
BBR 之 ProbeRTT 新改
早在 1981 年,Jaffe 在 Flow Control Power is Nondecentralizable 中就给出过论证,测量 maxbw 必然引入队列,而获得 minrtt 时带宽必然欠载,这确定了后面 30 年的拥塞控制算法基调,但 BBR 在 35 年后非常聪明地在两者…...