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

Selenium控制已运行的Edge和Chrome浏览器——在线控制 | 人机交互(详细启动步骤和bug记录)

文章目录

  • 前期准备
  • 1. 浏览器开启远程控制指令
    • (1)Edge
    • (2)Chrome
  • 2. 执行python代码
    • (1)先启动浏览器后执行代码
    • (2)通过代码启动浏览器
    • (3)Bug问题记录
      • 1)python可读取浏览器所有标签标题,但检索网页元素失败
      • 2)浏览器开启程序,但python程序无法链接浏览器进行自动控制
  • 3. 爬取效果
  • 3. 完整代码共享
    • 3.1 包含Excel部分的完整代码
    • 3.2 爬虫部分的完整代码


说明:本记录是在Windows系统上执行的!
起因是:博导要求统计一下国内某个领域的专家情况,统计主持国家自然科学基金的副教授和教授都有哪些大牛!
于是:本人去[NSFC]:https://kd.nsfc.cn/ 下载全部的历史基金项目书。。。。工作量太大就……半自动化实现吧!!!


前期准备

1. python Selenium库
2. Edge浏览器 或 Chrome浏览器

1. 浏览器开启远程控制指令

  1. 无论是哪种浏览器,都需要使用终端独立运行浏览器的远程调试模式。
  2. 开启方式:加入指令(–remote-debugging-port=9222 --user-data-dir=“D:\selenium\AutomationProfile”)

需要进入目标浏览器的根目录! 不然就输入全路径!

(1)Edge

.\msedge.exe --remote-debugging-port=9222 --user-data-dir=“D:\selenium\AutomationProfile”

(2)Chrome

 .\chrome.exe --remote-debugging-port=9222 --user-data-dir=“D:\selenium\AutomationProfile”

在这里插入图片描述

2. 执行python代码

(1)先启动浏览器后执行代码

  • 必须是先执行上述步骤,开启了浏览器的远程调试端口后,才能通过下方代码进行控制。

  • add_experimental_option("debuggerAddress", "127.0.0.1:9222") 这句话是关键!

from selenium import webdriver
from selenium.webdriver.edge.options import Optionsclass Test:def edge(self):edge_driver_path = executable_path=r'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe'chrome_options = Options()# chrome_options.binary_location = edge_driver_path  #  传入驱动地址chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")  # "127.0.0.1:9222"其中,9222是浏览器的运行端口# 让浏览器带着这个配置运行# chrome_options.add_experimental_option('detach', True)  # 通过option参数,设置浏览器不关闭driver = webdriver.Edge(options=chrome_options, keep_alive=True)driver.implicitly_wait(10)  # 页面元素查找的等待时间self.driver = driverpassdef chrome_drive(self, drive='chrome'):edge_driver_path = executable_path = r'D:\Program Files\Google\Chrome\Application'if drive == 'chrome':chrome_options = webdriver.ChromeOptions()# chrome_options.binary_location = edge_driver_path    #  传入驱动地址# chrome_options.add_experimental_option('detach', True)  # 通过option参数,设置浏览器不关闭chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")driver = webdriver.Chrome(options=chrome_options, keep_alive=False)driver.implicitly_wait(10)  # 页面元素查找的等待时间self.driver = driverpass

(2)通过代码启动浏览器

  • 这个时候被注释掉的 .binary_location = edge_driver_path 是关键!
  • 这种情况下,需要下载对应的驱动软件(.exe)
  • 博主在笔记本电脑上首次尝试Selenium时就下载了驱动软件!但后来在台式电脑使用相同代码时发现,压根不需要下载什么驱动软件!
  • 只需要使用终端提前启动浏览器的调试模型即可。 (这是弯路、坑)
  • 因为,如果是通过代码启动浏览器的调试模型,需要配置路径,然后保证程序关闭后浏览器依旧运行!麻烦!!!

(3)Bug问题记录

1)python可读取浏览器所有标签标题,但检索网页元素失败

  • 部分网页不支持爬取!特别是当网页开启F12的开发人选项后,会出现无法查找元素的问题。
  • 此时,关闭 “开发人选项” 即可。

2)浏览器开启程序,但python程序无法链接浏览器进行自动控制

  • 关闭原有浏览器,重新打开浏览器(需搭配命令:–remote-debugging-port=9222 --user-data-dir=“xxx folder”

3. 爬取效果

![(https://img-blog.csdnimg.cn/direct/492fe54da6c24809a654191a43365f14.png)

3. 完整代码共享

以下代码主要实现了:

  • 浏览器标签页的翻动和选择
  • 爬取 – 青塔网检索”国家自然科学基金项目“的作者信息,并保存到表格。
  • 爬取 – NSFC”国家自然科学基金项目“的作者信息,并保存到表格。
  • 爬取 – 国际某个领域专家的作者信息,并保存到表格。

3.1 包含Excel部分的完整代码

包含Excel部分的完整代码见:资源文件

3.2 爬虫部分的完整代码

import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.action_chains import ActionChains# '.\chrome.exe --remote-debugging-port=9222 --user-data-dir=“D:\selenium\AutomationProfile”             n "*" --ws --allow-insecure-unlock --nodiscover --authrpc.addr 127.0.1.2 --authrpc.port 8545'
# '.\chrome.exe --remote-debugging-port=9222 --user-data-dir=“D:\selenium\AutomationProfile”'class Web_Browser:def __init__(self, drive='chrome'):self.driver = None# self.edge()self.chrome_drive()def edge(self):# edge_driver_path = executable_path=r'D:\Program Files\Google\Chrome\Application\chromedriver.exe'edge_driver_path = executable_path=r'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe'chrome_options = Options()# chrome_options.binary_location = edge_driver_path# 配置浏览器# 添加User-Agent到Chrome选项中# chrome_options.add_argument("--user-agent=windows 10 Edge")# "127.0.0.1:9222"其中,9222是浏览器的运行端口chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")# 让浏览器带着这个配置运行# chrome_options.add_experimental_option('detach', True)  # 通过option参数,设置浏览器不关闭driver = webdriver.Edge(options=chrome_options, keep_alive=True)# driver = webdriver.Chrome( options=chrome_options)print('===================')# driver.get('www.baidu.com')driver.implicitly_wait(10)self.driver = driverdef chrome_drive(self, drive='chrome'):edge_driver_path = executable_path = r'D:\Program Files\Google\Chrome\Application\chromedriver.exe'if drive == 'chrome':chrome_options = webdriver.ChromeOptions()# chrome_options.binary_location = edge_driver_path# chrome_options.add_experimental_option('detach', True)  # 通过option参数,设置浏览器不关闭chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")driver = webdriver.Chrome(options=chrome_options, keep_alive=False)self.driver = driverdriver.implicitly_wait(10)self.opened_windows_dict = Nonepassdef get_all_opened_windows(self):driver = self.drivercw = driver.current_window_handleres = {}# 获取已打开的标签页的信息tabs = driver.window_handlesfor t in tabs:driver.switch_to.window(t)res[str(driver.title)] = str(t)self.opened_windows_dict = resdriver.switch_to.window(cw)print('已打开的标签页的信息:',)for k in res: print(f"\t{k}: {res[k]}")return resdef switch_window(self, key):driver = self.drivercw = driver.current_window_handle# 获取已打开的标签页的信息tabs = driver.window_handlesfor t in tabs:driver.switch_to.window(t)if key in str(driver.title): cw = tbreak# driver.switch_to.window(cw)self.driver = driverpassdef open_new_window(self, driver=None, url=None, delay_t=0.6):'''# 打开新标签页'''driver = self.driver if not driver else driverold_handle = driver.window_handles  # 获取已打开的标签页的信息# driver.find_element("body").send_keys(Keys.CONTROL + 't')  # 没有实体会报错# driver.execute_script("window.open('','_blank');")  # 可能被拦截driver.switch_to.new_window('tab')time.sleep(delay_t)if len(driver.window_handles) >len(old_handle): return Truedriver.execute_script(f"window.open('{url if url else ''}');")time.sleep(delay_t)if len(driver.window_handles) >len(old_handle): return Truereturn Falsedef func1(self, xlsx):""" 学术网 """for p in range(50):# self.switch_window('故障诊断')driver = self.driverweb = driver.find_element(by=By.XPATH, value='//*[@id="search_body"]/div[2]/div[3]/div[1]/div[2]/div[1]/div[3]/div[2]/div/div[2]/div[2]/div/div')web1 = web.find_elements(by=By.CLASS_NAME, value='inner-content')print('web1 len=', len(web1))num = 0for i, w in enumerate(web1):try:# '//*[@id="search_body"]/div[2]/div[3]/div[1]/div[2]/div[1]/div[3]/div[2]/div/div[2]/div[2]/div/div'#a = w.find_element(by=By.XPATH, value=f'//div[{1+i}]/div/div[2]/div[1]/div[1]/div/a/strong/span/span').texttry:b = w.find_element(by=By.XPATH, value=f'//div[{1 + i}]/div/div[2]/div[3]/p[2]').textschool = str(b).split(',')for s in school:if 'university' in s.lower(): b = s[1:]except: b = Nonec = w.find_element(by=By.XPATH, value=f'//div[{1 + i}]/div/div[2]/div[3]/p[1]').textd = Nonee = Nonef = Nonetry:h_index = w.find_element(by=By.XPATH, value=f'//div[{1 + i}]/div/div[2]/div[2]/div/span[1]/span[3]').textpaper = w.find_element(by=By.XPATH, value=f'//div[{1 + i}]/div/div[2]/div[2]/div/span[2]/span[3]').textcite = w.find_element(by=By.XPATH, value=f'//div[{1 + i}]/div/div[2]/div[2]/div/span[3]/span[3]').textf = f"H-index: {h_index},  papers: {paper}, cites: {cite}"except: passg = Noneh = w.find_element(by=By.XPATH, value=f'//div[{1 + i}]/div/div[2]/div[1]/div[1]/div/a')h = 'https://www.aminer.cn/' + h.get_attribute('href')print(a, b ,c, g)xlsx.input_data(a,b,c,d,e,f,g, h)num += 1except: passprint('记录:', num)# aa = driver.find_elements(by=By.XPATH, value='//*[@id="search_body"]/div[2]/div[3]/div[1]/div[2]/div[1]/div[3]/div[2]/div/div[2]/div[3]/ul/li')# aa = aa[-1]aa = driver.find_element(by=By.CLASS_NAME, value='ant-pagination-next')# v = '#search_body > div.ant-tabs.ant-tabs-top.a-aminer-core-search-index-searchPageTab.ant-tabs-line.ant-tabs-no-animation > div.ant-tabs-content.ant-tabs-content-no-animated.ant-tabs-top-content > div.ant-tabs-tabpane.ant-tabs-tabpane-active > div.a-aminer-core-search-index-componentContent > div.a-aminer-core-search-c-search-component-temp-searchComponent > div.view > div:nth-child(2) > div > div:nth-child(2) > div.paginationWrap > ul > li.ant-pagination-next'# aa = driver.find_element(by=By.CSS_SELECTOR, value=v)# 创建一个ActionChains对象,用于执行鼠标动作action_chains = ActionChains(driver)# 将鼠标移动到链接元素上并点击action_chains.move_to_element(aa).click().perform()print(f'第{p+1}页 --> 第{p+2}页')try:xlsx.make_frame()xlsx.save_excel()except: passtime.sleep(5)passdef func2(self, xlsx=None):for p in range(50):self.switch_window('青塔')driver = self.driverweb = driver.find_element(by=By.XPATH,value='//*[@id="app"]/div[2]/div[1]/div/div[2]/div[2]/div/div[2]')web1 = web.find_elements(by=By.CLASS_NAME, value='list-item')print('web1 len=', len(web1))num = 0for i, w in enumerate(web1):# try:# //*[@id="app"]/div[2]/div[1]/div/div[2]/div[2]/div/div[2]# '//*[@id="app"]/div[2]/div[1]/div/div[2]/div[2]/div/div[2]/div/div[2]/div[2]/div[2]/div[1]/div[2]'# //*[@id="app"]/div[2]/div[1]/div/div[2]/div[2]/div/div[2]/div/div[1]/div[2]/div[2]/div[1]/div[1]b = w.find_element(by=By.XPATH, value=f'//div[2]/div[1]/div[1]/div[2]')print(b)b = b.textprint('b=', b)a = w.find_element(by=By.XPATH, value=f'//div[2]/div[2]/div[1]/div[2]').textprint('a=', a)c = Noned = Nonee = w.find_element(by=By.XPATH, value=f'//div[1]/div[1]').textprint('e=', e)year = w.find_element(by=By.XPATH, value=f'//div[2]/div[2]/div[2]/div[2]').textmoney = w.find_element(by=By.XPATH, value=f'//div[2]/div[1]/div[2]/div[2]').textprint('year=', year, 'money=', money)e = f"{e}, 立项: {year}, 资助: {money}"jijin = w.find_element(by=By.XPATH, value=f'//div[2]/div[3]/div[1]/div[2]').textdomain = w.find_element(by=By.XPATH, value=f'//div[2]/div[3]/div[2]/div[2]').textprint('jijin=',jijin, 'domain=', domain)f = f"{jijin}, 领域: {domain}"g = Noneh = Noneprint(i, '-----------', i)print(a, b, c, d, e, f)xlsx.input_data(a, b, c, d, e, f, g, h)num += 1break# except: passprint('记录:', num)breakaa = driver.find_element(by=By.XPATH, value=f'//*[@id="app"]/div[2]/div[1]/div/div[2]/div[2]/div/div[3]/button[2]')# 创建一个ActionChains对象,用于执行鼠标动作action_chains = ActionChains(driver)# 将鼠标移动到链接元素上并点击action_chains.move_to_element(aa).click().perform()print(f'第{p + 1}页 --> 第{p + 2}页')try:xlsx.make_frame()xlsx.save_excel()except:passtime.sleep(5)passdef func3(self, xlsx=None):for p in range(50):self.switch_window('大数据知识管理服务门户')driver = self.driverd = driver.find_element(by=By.CLASS_NAME, value='container_list_right')print('d==', d)# web = driver.find_element(by=By.XPATH,#                           value='//*[@id="app"]/div[1]/div[3]/div/div[3]/div[1]/div')web = d.find_element(by=By.XPATH, value='//div[1]/div')# web1 = web.find_elements(by=By.CLASS_NAME, value='list-item')# print('web1 len=', len(web1))num = 0for i, w2 in enumerate(range(6)):w = webtry:# //*[@id="app"]/div[1]/div[3]/div/div[3]/div[1]/div# //*[@id="app"]/div[1]/div[3]/div/div[3]# //*[@id="app"]/div[1]/div[3]/div/div[3]/div[1]/div/div[2]/div[2]/div[1]b = w.find_element(by=By.XPATH, value=f'//div[{i+1}]/div[3]/div[4]/a')b = b.text# print('b=', b)a = w.find_element(by=By.XPATH, value=f'//div[{i+1}]/div[2]/div[4]/a').text# print('a=', a)c = Noned = Nonee = w.find_element(by=By.XPATH, value=f'//div[{i+1}]/div[1]/div[1]/p/a').text# print('e=', e)year = w.find_element(by=By.XPATH, value=f'//div[{i+1}]/div[3]/div[3]').textmoney = w.find_element(by=By.XPATH, value=f'//div[{i+1}]/div[3]/div[1]').text# print('year=', year, 'money=', money)e = f"{e}, {year}, {money}"jijin = w.find_element(by=By.XPATH, value=f'//div[{i+1}]/div[2]/div[3]').textdomain = w.find_element(by=By.XPATH, value=f'//div[{i+1}]/div[2]/div[1]').text# print('jijin=',jijin,  domain)f = f"{jijin}, {domain}"g = Noneh = Noneprint(i+1, '-----------', i+1)print(a, b, c, d, e, f)xlsx.input_data(a, b, c, d, e, f, g, h)num += 1# breakexcept: passprint('记录:', num)# break# aa = driver.find_element(by=By.CLASS_NAME, value=f'btn-next')# # 创建一个ActionChains对象,用于执行鼠标动作# action_chains = ActionChains(driver)# # 将鼠标移动到链接元素上并点击# action_chains.move_to_element(aa).click().perform()print(f'第{p + 1}页 --> 第{p + 2}页')try:xlsx.make_frame()xlsx.save_excel()except:passbreak# time.sleep(5)passdef func4(self, xlsx=None, key='Google2'):if key == 'Google': self.switch_window('Google')else: self.switch_window('必应')driver = self.driverdata = xlsx.read_excel()# print(data['姓名'])for i, name in enumerate(data['姓名']):school = data['学校'][i]text = f'{school}{name}是不是教授'print(f'search [{i+1}]:  {name} -》 ', text)if key == 'Google': web = driver.find_element(by=By.XPATH, value='//*[@id="APjFqb"]')else: web = driver.find_element(by=By.XPATH, value='//*[@id="sb_form_q"]')web.clear()web.send_keys(text)if key == 'Google': web = driver.find_element(by=By.XPATH, value='//*[@id="tsf"]/div[1]/div[1]/div[2]/button')else: web = driver.find_element(by=By.XPATH, value='//*[@id="sb_form_go"]')# try:web.click()# except: passtime.sleep(5)num = 0if __name__ == '__main__':from temp import Make_Excel, input_data_list, input_dataxlsx = Make_Excel()web = Web_Browser()web.get_all_opened_windows()# web.switch_window('故障诊断')''' 学术网 '''web.func1(xlsx)  # 学术网# web.func2(xlsx)  #  青塔网# web.func3(xlsx)  #  NSFC官网# web.func4(xlsx, )    # goole搜索网# xlsx.make_frame()# xlsx.save_excel()pass

相关文章:

Selenium控制已运行的Edge和Chrome浏览器——在线控制 | 人机交互(详细启动步骤和bug记录)

文章目录 前期准备1. 浏览器开启远程控制指令(1)Edge(2)Chrome 2. 执行python代码(1)先启动浏览器后执行代码(2)通过代码启动浏览器(3)Bug问题记录1&#xff…...

【Miniconda】Linux系统中 .condarc 配置文件的位置一般在哪里

【Miniconda】Linux系统中 .condarc 配置文件的位置一般在哪里 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到…...

数据结构——动态顺序表

数据结构的动态顺序表有以下几个操作:创建,销毁,初始化,增删查改和打印以及内存空间不够时的扩容 本文的宏定义: #define SeqTypeData int 1.动态顺序表的创建 typedef struct SeqListInit{//动态顺序表的创建SeqT…...

Android Studio实现内容丰富的安卓宠物医院管理系统

获取源码请点击文章末尾QQ名片联系,源码不免费,尊重创作,尊重劳动 项目编号128 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端: 1.注册登录 2.系统公告 3.宠物社区(可发布宠物帖子&#xf…...

华为OD机试真题-启动多任务排序-2024年OD统一考试(C卷)

题目描述: 一个应用启动时,会有多个初始化任务需要执行,并且任务之间有依赖关系,例如A任务依赖B任务,那么必须在B任务执行完成之后,才能开始执行A任务。 现在给出多条任务依赖关系的规则,请输入任务的顺序执行序列,规则采用贪婪策略,即一个任务如果没有依赖的任务,则…...

在没有推出硬盘的情况下,重启mac电脑,外接移动硬盘无法加载显示?

一、mac磁盘工具显示未装载 1.打开终端,输入 diskutil list查看当前硬盘列表,大多数时候,可以解决。 二、使用命令行装载硬盘 执行上面命令后,仍不起作用,则手动挂载,在命令行输入如下内容: …...

C++笔记:从零开始一步步手撕高阶数据结构AVL树

文章目录 高度平衡二叉搜索树实现一颗AVL树结点与树的描述——定义类AVL树的插入操作步骤1:按照二叉搜索树的方法插入结点步骤2:自底向上调整平衡因子步骤3:触发旋转操作(AVL树平衡的精髓)右单旋左单旋左右双旋右左双旋…...

CodeSys通过C函数接口调用Qt

文章目录 1.背景介绍2.修改makefile2.1.将编译器由c改成c2.2.使能opencv库2.3.使能Qt库 3.在代码中使用Qt库函数 1.背景介绍 建议先查看之前的文章【CodeSys中调用C语言写的动态库】,了解如何创建一个能够被codesys调用的动态库。 假如想要在函数中使用Qt或者第三方…...

线性代数笔记18--行列式公式、代数余子式

1. 行列式公式推导 二阶行列式推导 [ a b c d ] [ a 0 c d ] [ 0 b c d ] [ a 0 0 d ] [ a 0 c 0 ] [ 0 b c 0 ] [ 0 b 0 d ] [ a 0 0 d ] − [ b 0 0 c ] a d − b c \begin{align} \begin{bmatrix} a & b \\ c & d \end{bmatrix}& \begin{bmatrix} a &…...

最新2024年项目基金撰写与技巧及GPT融合应用

随着社会经济发展和科技进步,基金项目对创新性的要求越来越高。申请人需要提出独特且有前瞻性的研究问题,具备突破性的科学思路和方法。因此,基金项目申请往往需要进行跨学科的技术融合。申请人需要与不同领域结合,形成多学科交叉…...

Java八股文(Element Plus)

Java八股文のElement Plus Element Plus Element Plus 什么是Element UI 和 Element Plus? Element UI 和 Element Plus 是基于 Vue.js 的一套非常受欢迎的开源 UI 组件库,用于快速构建具有现代化设计和丰富交互效果的前端界面。 Element UI 和 Element…...

【Hadoop】Hadoop概述与核心组件

目录 Hadoop概述Hadoop 发展历史Hadoop 三大发行版本1.Apache Hadoop(常用)2.Cloudera Hadoop3.Hortonworks Hadoop优势优势总结——4高(高可靠、高扩展、高效、高容错) Hadoop组成1.HDFS管理者:NameNode(n…...

3D地图在BI大屏中的应用实践

前言 随着商业智能的不断发展,数据可视化已成为一项重要工具,有助于用户更好地理解数据和分析结果。其中,3D地图作为一种可视化工具,已经在BI大屏中得到了广泛地应用。 3D地图通过将地理信息与数据相结合,以更加直观…...

JavaScript 进阶(二)

一、深入对象 1.1创建对象三种方式 1. 利用对象字面量创建对象 2. 利用 new Object 创建对象 3.利用构造函数创建对象 1.2 构造函数 构造函数 : 是一种特殊的函数,主要用来初始化对象。 使用场景: 常规的 {...} 语法允许创建一个对象。…...

基于ssm+layui的图书管理系统

基于ssmlayui的图书管理系统 账户类型分为:管理员,用户管理员私有功能用户私有功能公共功能技术栈功能实现图 视频演示 账户类型分为:管理员,用户 图书管理系统主要登录账户类型为管理员账户与用户账户 管理员私有功能 账户管理…...

2024年最新阿里云和腾讯云云服务器价格租用对比

2024年阿里云服务器和腾讯云服务器价格战已经打响,阿里云服务器优惠61元一年起,腾讯云服务器61元一年,2核2G3M、2核4G、4核8G、4核16G、8核16G、16核32G、16核64G等配置价格对比,阿腾云atengyun.com整理阿里云和腾讯云服务器详细配…...

双指针算法_复写零

题目: 给一个固定长度的数组arr,将数组中出现的每一个0都复写一遍,并且将其余元素都往右移动 且不要再超过数组长度的位置写入元素,在数组上直接修改 示例: 双数组模拟操作: 从示例来看,因为…...

自习室预订系统|基于springboot框架+ Mysql+Java+B/S架构的自习室预订系统设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 学生功能模块 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参…...

基于Java+SpringMVC+vue+element宠物管理系统设计实现

基于JavaSpringMVCvueelement宠物管理系统设计实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源…...

用miniconda建立PyTorch、Keras、TensorFlow三个环境

一、配置清华镜像conda源 由于网络问题,直接使用conda默认的源下载包可能会非常慢。为了解决这个问题,可以配置国内镜像源来加速包的下载。清华大学TUNA协会提供了一个常用的conda镜像源。下面是如何配置清华镜像源的步骤: 1. 配置清华conda…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作&#xff1a; 压缩包下载&#xff1a;http://download.redis.io/releases 1. 上传压缩包&#xff0c;并进入压缩包所在目录&#xff0c;解压到目标…...

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中&#xff0c;发票不能重用的限制&#xff0c;发票上传后&#xff0c;希望能读出发票号&#xff0c;并记录发票号已用&#xff0c;下次不再可用于报销。 基于上面的需求&#xff0c;研究了OCR 的方式和读PDF的方式&#xff0c;实际是可行的&#xff…...