Selenium入门必备:学会用代码控制浏览器,打开网页、找到元素和退出浏览器

news2025/1/19 10:17:15

目录

一、前期准备

1、概述

2、学习目标

3、安装

二、selenium的基本使用

1、加载网页:

2、定位和操作:

3、查看请求信息:

4、退出

小结

三、元素定位的方法

学习目标

1、selenium的定位操作

2、元素的操作

小结

四、selenium的其他操作

学习目标

1、无头浏览器

1、selenium 处理cookie

2、页面等待

3、switch方法切换的操作

4、selenium的优缺点

小结

5、selenium的配置

五、实战案例


大家好,我是凡哥。

作为一个想要学习Web自动化测试的小白,刚开始接触Selenium时可能会有些迷茫和不知所措。但是,不用担心,通过本文的学习,你将能够初步掌握Selenium的基础应用技能,包括如何用代码控制浏览器,打开并加载网页,找到并操作其中的元素,以及最后如何优雅地退出浏览器!

相信随着不断的实践和学习,你定能成为一名出色的Web自动化测试工程师。接下来,就让我们一起开始这段“陪伴式”学习之旅吧!

一、前期准备

1、概述

selenium本身是一个自动化测试工具。它可以让python代码调用浏览器。并获取到浏览器中加载的各种资源。 我们可以利用selenium提供的各项功能。 帮助我们完成数据的抓取。

2、学习目标

  1. 掌握 selenium发送请求,加载网页的方法
  2. 掌握 selenium简单的元素定位的方法
  3. 掌握 selenium的基础属性和方法
  4. 掌握 selenium退出的方法

2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂!!

【留言:selenium丨免费获取教程】

3、安装

安装:pip install selenium

它与其他库不同的地方是他要启动你电脑上的浏览器, 这就需要一个驱动程序来辅助.

这里推荐用chrome浏览器

chrome驱动地址:http://chromedriver.storage.googleapis.com/index.html

根据你电脑的不同自行选择吧. win64选win32即可.

然后关键的来了. 把你下载的浏览器驱动放在python解释器所在的文件夹

Windwos: py -0p 查看Python路径

Mac: open + 路径

例如:open /usr/local/bin/

前期准备工作完毕. 上代码看看 感受一下selenium

from selenium.webdriver import Chrome  # 导入谷歌浏览器的类


# 创建浏览器对象
web = Chrome()  # 如果你的浏览器驱动放在了解释器文件夹

web.get("http://www.baidu.com")  # 输入网址
print(web.title)  # 打印title

运行一下你会发现神奇的事情发生了. 浏览器自动打开了. 并且输入了网址. 也能拿到网页上的title标题.

二、selenium的基本使用

1、加载网页:

selenium通过控制浏览器,所以对应的获取的数据都是elements中的内容

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
# 访问百度
driver.get("http://www.baidu.com/")
# 截图
driver.save_screenshot("baidu.png")



"""
# 使用同一个浏览器进行多次操作

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_experimental_option("debuggerAddress", "127.0.0.1:12306")
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.get('http://www.sougou.com')
"""

2、定位和操作:

# 搜索关键字 杜卡迪
driver.find_element(By.ID, "kw").send_keys("杜卡迪")
# 点击id为su的搜索按钮
driver.find_element(By.ID, "su").click()

3、查看请求信息:

driver.page_source   # 获取页面内容
driver.get_cookies()
driver.current_url

4、退出

driver.close()  # 退出当前页面
driver.quit()   # 退出浏览器

小结

  1. selenium的导包:from selenium import webdriver
  2. selenium创建driver对象:driver = webdriver.Chrome()
  3. selenium请求数据:driver.get("http://www.baidu.com/")
  4. selenium查看数据: driver.page_source
  5. 关闭浏览器: driver.quit()
  6. 根据id定位元素: driver.find_element_by_id("kw")/driver.find_element(By.ID, "kw")
  7. 操作点击事件: click()
  8. 给输入框赋值:send_keys()

三、元素定位的方法

学习目标

  1. 掌握 selenium定位元素的方法
  2. 掌握 selenium从元素中获取文本和属性的方法

通过selenium的基本使用可以简单定位元素和获取对应的数据,接下来我们再来学习下 定位元素的其他方法

1、selenium的定位操作

  1. 元素定位的两种写法:

    • 直接调用型

       el = driver.find_element_by_xxx(value)
       # xxx是定位方式,后面我们会讲,value为该方式对应的值
      
    • 使用By类型(需要导入By) 建议使用这种方式

       # 直接掉用的方式会在底层翻译成这种方式
      from selenium.webdriver.common.by import By
      driver.find_element(By.xxx,value)
      
  2. 元素定位的两种方式:

    • 精确定位一个元素,返回结果为一个element对象,定位不到则报错

      driver.find_element(By.xx, value)  # 建议使用
      driver.find_element_by_xxx(value)
      
    • 定位一组元素,返回结果为element对象列表,定位不到返回空列表

      driver.find_elements(By.xx, value)  # 建议使用
      driver.find_elements_by_xxx(value)
      
  3. 元素定位的八种方法:

    以下方法在element之后添加s就变成能够获取一组元素的方法

    • By.ID 使用id值定位

      el = driver.find_element(By.ID, '')
      el = driver.find_element_by_id()            
      
    • By.XPATH 使用xpath定位

      el = driver.find_element(By.XPATH, '')
      el = driver.find_element_by_xpath()         
      
    • By.TAG_NAME. 使用标签名定位

      el = driver.find_element(By.TAG_NAME, '')
      el = driver.find_element_by_tag_name()     
      
    • By.LINK_TEXT使用超链接文本定位

      el = driver.find_element(By.LINK_TEXT, '')
      el = driver.find_element_by_link_text() 
      
    • By.PARTIAL_LINK_TEXT 使用部分超链接文本定位

      el = driver.find_element(By.PARTIAL_LINK_TEXT  , '')
      el = driver.find_element_by_partial_link_text()
      
    • By.NAME 使用name属性值定位

      el = driver.find_element(By.NAME, '')
      el = driver.find_element_by_name()
      
    • By.CLASS_NAME 使用class属性值定位

      el = driver.find_element(By.CLASS_NAME, '')   
      el = driver.find_element_by_class_name()
      
    • By.CSS_SELECTOR 使用css选择器定位

      el = driver.find_element(By.CSS_SELECTOR, '')  
      el = driver.find_element_by_css_selector()
      

注意:

  • 建议使用find_element/find_elements

  • find_elementfind_elements的区别

  • by_link_textby_partial_link_text的区别:
    全部文本和包含某个文本

  • 使用: 以豆瓣为例

    import time
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)  # 等待节点加载完成
    driver.get("https://www.douban.com/search?q=%E6%9D%B0%E6%A3%AE%E6%96%AF%E5%9D%A6%E6%A3%AE")
    time.sleep(2)
    # 使用id的方式获取右上角的搜索框
    # ret1 = driver.find_element(By.ID, 'inp-query')
    # ret1 = driver.find_element(By.ID, 'inp-query').send_keys("杰森斯坦森")
    # ret1 = driver.find_element_by_id("inp-query")
    # print(ret1)
    
    # 输出为:<selenium.webdriver.remote.webelement.WebElement (session="ea6f94544ac3a56585b2638d352e97f3", element="0.5335773935305805-1")>
    
    # 搜索输入框  使用find_elements进行获取
    # ret2 = driver.find_elements(By.ID, "inp-query")
    # ret2 = driver.find_elements_by_id("inp-query")
    # print(ret2)
    #输出为:[<selenium.webdriver.remote.webelement.WebElement (session="ea6f94544ac3a56585b2638d352e97f3", element="0.5335773935305805-1")>]
    
    # 搜索按钮  使用xpath进行获取
    # ret3 = driver.find_elements(By.XPATH, '//*[@id="inp-query"]')
    # ret3 = driver.find_elements_by_xpath("//*[@id="inp-query"]")
    # print(len(ret3))
    # print(ret3)
    
    # 匹配图片标签
    ret4 = driver.find_elements(By.TAG_NAME, 'img')
    for url in ret4:
        print(url.get_attribute('src'))
    
     #ret4 = driver.find_elements_by_tag_name("img")
    print(len(ret4))
    
    ret5 = driver.find_elements(By.LINK_TEXT, "浏览发现")
    # ret5 = driver.find_elements_by_link_text("浏览发现")
    print(len(ret5))
    print(ret5)
    
    ret6 = driver.find_elements(By.PARTIAL_LINK_TEXT, "浏览发现")
    # ret6 = driver.find_elements_by_partial_link_text("浏览发现")
    print(len(ret6))
    # 使用class名称查找
    ret7 = driver.find_elements(By.CLASS_NAME, 'nbg')
    print(ret7)
    driver.close()
    

注意:

find_element与find_elements区别

  1. 只查找一个元素的时候:可以使用find_element(),find_elements()
    find_element()会返回一个WebElement节点对象,但是没找到会报错,而find_elements()不会,之后返回一个空列表
  2. 查找多个元素的时候:只能用find_elements(),返回一个列表,列表里的元素全是WebElement节点对象
  3. 找到都是节点(标签)
  4. 如果想要获取相关内容(只对find_element()有效,列表对象没有这个属性) 使用 .text
  5. 如果想要获取相关属性的值(如href对应的链接等,只对find_element()有效,列表对象没有这个属性):使用 .get_attribute("href")

2、元素的操作

find_element_by_xxx方法仅仅能够获取元素对象,接下来就可以对元素执行以下操作 从定位到的元素中提取数据的方法

从定位到的元素中获取数据

el.get_attribute(key)           # 获取key属性名对应的属性值
el.text                        	# 获取开闭标签之间的文本内容

 对定位到的元素的操作

el.click()                      # 对元素执行点击操作

el.submit()                     # 对元素执行提交操作

el.clear()                      # 清空可输入元素中的数据

el.send_keys(data)              # 向可输入元素输入数据

使用示例:

from selenium import webdriver
from selenium.webdriver.common.by import By

driver =webdriver.Chrome()

driver.get("https://www.douban.com/")
# 打印页面内容 (获取到以后可以进行后续的xpath,bs4 或者存储等)
print(driver.page_source)

ret4 = driver.find_elements(By.TAG_NAME, "h1")
print(ret4[0].text)
#输出:豆瓣

ret5 = driver.find_elements(By.LINK_TEXT, "下载豆瓣 App")
print(ret5[0].get_attribute("href"))
#输出:https://www.douban.com/doubanapp/app?channel=nimingye

driver.close()

小结

  1. 根据xpath定位元素:driver.find_elements(By.XPATH,"//*[@id='s']/h1/a")
  2. 根据class定位元素:driver.find_elements(By.CLASS_NAME, "box")
  3. 根据link_text定位元素:driver.find_elements(By.LINK_TEXT, "下载豆瓣 App")
  4. 根据tag_name定位元素:driver.find_elements(By.TAG_NAME, "h1")
  5. 获取元素文本内容:element.text
  6. 获取元素标签属性: element.get_attribute("href")
  7. 向输入框输入数据: element.send_keys(data)

四、selenium的其他操作

学习目标

  1. 掌握 selenium处理cookie等方法
  2. 掌握 selenium中switch的使用
  3. 掌握selenium中无头浏览器的设置

1、无头浏览器

我们已经基本了解了selenium的基本使用了. 但是呢, 不知各位有没有发现, 每次打开浏览器的时间都比较长. 这就比较耗时了. 我们写的是爬虫程序. 目的是数据. 并不是想看网页. 那能不能让浏览器在后台跑呢? 答案是可以的

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options

opt = Options()
opt.add_argument("--headless")
opt.add_argument('--disable-gpu')
opt.add_argument("--window-size=4000,1600")  # 设置窗口大小

web = Chrome(options=opt)

1、selenium 处理cookie

通过driver.get_cookies()能够获取所有的cookie

  • 获取cookie

    dictCookies = driver.get_cookies()
    
  • 设置cookie

    driver.add_cookie(dictCookies)
    
  • 删除cookie

    #删除一条cookie
    driver.delete_cookie("CookieName")
    # 删除所有的cookie
    driver.delete_all_cookies()
    

2、页面等待

  • 为什么需要等待
    如果网站采用了动态html技术,那么页面上的部分元素出现时间便不能确定,这个时候就可以设置一个等待时间,强制等待指定时间,等待结束之后进行元素定位,如果还是无法定位到则报错

  • 页面等待的三种方法

    • 强制等待

      import time
      time.sleep(n)      # 阻塞等待设定的秒数之后再继续往下执行
      
    • 显式等待(自动化web测试使用,爬虫基本不用)

      from selenium.webdriver.common.keys import Keys
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      
      WebDriverWait(driver, 10,0.5).until( EC.presence_of_element_located((By.ID, "myDynamicElement"))
      # 显式等待指定某个条件,然后设置最长等待时间10,在10秒内每隔0.5秒使用指定条件去定位元素,如果定位到元素则直接结束等待,如果在10秒结束之后仍未定位到元素则报错
      
    • 隐式等待 隐式等待设置之后代码中的所有元素定位都会做隐式等待

      driver.implicitly_wait(10)    # 在指定的n秒内每隔一段时间尝试定位元素,如果n秒结束还未被定位出来则报错
      

注意:

Selenium显示等待和隐式等待的区别
1、selenium的显示等待
原理:显示等待,就是明确要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,就会跳出异常Exception

(简而言之,就是直到元素出现才去操作,如果超时则报异常)

2、selenium的隐式等待

原理:隐式等待,就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。
注意:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内部断的刷新页面去寻找我们需要的元素

3、switch方法切换的操作

3.1 一个浏览器肯定会有很多窗口,所以我们肯定要有方法来实现窗口的切换。切换窗口的方法如下:

也可以使用 window_handles 方法来获取每个窗口的操作对象。例如:

# 1. 获取当前所有的窗口
current_windows = driver.window_handles

# 2. 根据窗口索引进行切换
driver.switch_to.window(current_windows[1])

driver.switch_to.window(web.window_handles[-1])  # 跳转到最后一个窗口
driver.switch_to.window(current_windows[0])  # 回到第一个窗口

3.2 iframe是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是

driver.switch_to.frame(name/el/id)     传入的参数可以使iframe对应的id值,也可以是用元素定位之后的元素对象

动手:qq邮箱

在使用selenium登录qq邮箱的过程中,我们会发现,无法在邮箱的登录input标签中输入内容,通过观察源码可以发现,form表单在一个frame中,所以需要切换到frame中

3.3 当你触发了某个事件之后,页面出现了弹窗提示,处理这个提示或者获取提示信息方法如下:

alert = driver.switch_to_alert()

4. 页面前进和后退

driver.forward()     # 前进
driver.back()        # 后退
driver.refresh() 		 # 刷新
driver.close()       # 关闭当前窗口

5、设置浏览器最大窗口

driver.maximize_window()  #最大化浏览器窗口

4、selenium的优缺点

  • 优点
    • selenium能够执行页面上的js,对于js渲染的数据和模拟登陆处理起来非常容易
    • 使用难度简单
    • 爬取速度慢,爬取频率更像人的行为,天生能够应对一些反爬措施
  • 缺点
    • 由于selenium操作浏览器,因此会将发送所有的请求,因此占用网络带宽
    • 由于操作浏览器,因此占用的内存非常大(相比较之前的爬虫)
    • 速度慢,对于效率要求高的话不建议使用

小结

  1. 获取cookie: get_cookies()
  2. 删除cookie: delete_all_cookies()
  3. 切换窗口:switch_to.window()
  4. 切换iframe: switch_to.frame()

5、selenium的配置

selenium启动谷歌浏览器的参数设置_enable-automation_qq_35999017的博客-CSDN博客

五、实战案例

使用打码平台进行模拟登陆

import base64
import json
import requests
from selenium.webdriver import Chrome
import time
from selenium.webdriver.common.by import By


def base64_api(uname, pwd, img, typeid):
    with open(img, 'rb') as f:
        base64_data = base64.b64encode(f.read())
        b64 = base64_data.decode()
    data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64}
    result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)
    if result['success']:
        return result["data"]["result"]
    else:
        #!!!!!!!注意:返回 人工不足等 错误情况 请加逻辑处理防止脚本卡死 继续重新 识别
        return result["message"]
    return ""


if __name__ == "__main__":
    driver = Chrome()
    driver.get('https://www.gushiwen.cn/')
    time.sleep(1)
    # 查找我的按钮
    mine = driver.find_element(By.XPATH, '/html/body/div[1]/div/div[2]/div[1]/a[6]')
    # 点击我的
    mine.click()
    # 输入登陆的信息
    email = driver.find_element(By.XPATH, '//*[@id="email"]')
    email.send_keys('793390457@qq.com')
    pwd = driver.find_element(By.XPATH, '//*[@id="pwd"]')
    pwd.send_keys('xlg17346570232')
    code = driver.find_element(By.XPATH, '//*[@id="code"]')
    # 找到验证节点 并截取验证码图片
    driver.find_element(By.ID, 'imgCode').screenshot('code.png')
    # 打码平台进行识别
    img_path = "./code.png"
    result = base64_api(uname='luckyboyxlg', pwd='17346570232', img=img_path, typeid=3)
    print(result)
    code.send_keys(result)

    # 点击登陆
    driver.find_element(By.XPATH, '//*[@id="denglu"]').submit()

使用163获取新闻数据

from selenium import webdriver
import time
from selenium.webdriver.common.by import By


# 将滚动条拖拽到底部  然后点击加载更增多  直到加载完所有数据
def scroll_window(driver, stop_length, step_length):
    while True:
        if stop_length - step_length <= 0:
            break
        # 使用js代码进行下拉
        driver.execute_script(f'window.scrollBy(0, {step_length})')
        stop_length -= step_length
        time.sleep(0.5)


if __name__ == '__main__':
    driver = webdriver.Chrome()
    driver.get('https://news.163.com/')
    for i in range(1, 6):
        # 每次滚动距离
        step_length = 2000
        # 滚动停止的距离
        stop_length = 30000
        scroll_window(driver, stop_length, step_length)
        # 点击加载更多
        more = driver.find_element(By.XPATH, '//*[@id="index2016_wrap"]/div[3]/div[2]/div[3]/div[2]/div[5]/div/a[3]')
        # more.click()
        driver.execute_script('arguments[0].click();', more)
        print(f'第{i}次点击')
        # 获取页面所有数据
        print(driver.page_source)

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

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

相关文章

ThingsBoard 场景联动需求

0、需求 1、概述 当初有个兄弟请我帮他实现一个需求,需求如上,很简单,实现完成后我怕他操作不来,又写了这份文档给他,今天把这个文档的场景发出来,大家也可以学习一下思路 2、登录账号 系统层: 账号:sysadmin@thingsboard.org 密码:sysadmin 3、创建租户 新建租户…

MS COCO数据集介绍

MS COCO数据集介绍 MS COCO全称是Microsoft Common Objects in Context&#xff0c;是由微软开发维护的大型图像数据集&#xff0c;包括不同检测任务&#xff1a; Object Detection&#xff08;[主要处理人、车、大象等]&#xff09; DensePose&#xff08;姿态密度检测&…

12个超好用的免费在线工具,大大提高生产力,建议收藏!

好的工具&#xff0c;能够帮助我们更高效地完成工作&#xff0c;节省时间和精力; 节省出更多的摸鱼时间&#xff01; 本文将介绍12款绝佳的免费效率工具&#xff0c;这些工具可以让你事半功倍&#xff0c;提高工作效率。无论你是一名程序员、设计师、学生还是白领&#xff0c;…

超级秘密文件夹忘记密码的解决办法

超级秘密文件夹是一款非常特殊的文件夹加密软件&#xff0c;它来无影去无踪&#xff0c;在安装后不会留下任何痕迹&#xff0c;只能通过软件热键才能打开。那么如果在使用过程中忘记了密码&#xff0c;这时我们该怎么办呢&#xff1f;下面我们就来了解一下。 首先&#xff0c;我…

【历史上的今天】5 月 18 日:微软反垄断诉讼;携程旅行网上线;谷歌首次公布 TPU

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 5 月 18 日&#xff0c;在 1939 年的今天&#xff0c;彼得格伦伯格&#xff08;Peter Grunberg&#xff09;出生。格伦伯格是一名德国物理学家&#xff0c;是诺…

【jvm系列-12】jvm性能调优篇---GUI工具的基本使用

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…

五分钟学会Playwright录制脚本的方法以及语法难点

这篇文章系统地介绍了上手Playwright的方法&#xff0c;但是录制脚本部分讲解不够详尽&#xff0c;今天我在这里重点的介绍一下Playwright 录制脚本的方法来丰满我的Playwright系列技术文章。 Playwright可以使用codegen来录制脚本&#xff0c;使用方式非常简单&#xff0c;只…

Windows 安全基础

Windows 隐藏账号 命令行输入以下命令&#xff0c;可以进行简单的隐藏&#xff08;命令行下不可见&#xff09; net user test$ 123456 /add net localgroup administrators test$ /add 通过注册表隐藏用户&#xff08;实现步骤如下&#xff09;&#xff1a; 要实现很好的…

文生图关键问题探索:个性化定制和效果评价

文生图&#xff08;Text-to-Image Generation&#xff09;是AIGC&#xff08;AI Generated Content&#xff0c;人工智能生成内容&#xff09;的一个主要方向。近年来&#xff0c;文生图模型的效果和质量得到飞速提升&#xff0c;投资界和研究界都在密切关注文生图模型的进展。…

二苯基环辛炔-生物素,DBCO-Biotin点击化学DBCO生物素;CAS:1418217-95-4

中文名称&#xff1a;二苯并环辛炔-生物素 英文名称&#xff1a;DBCO-Biotin CAS&#xff1a;1418217-95-4 分子式&#xff1a;C28H30N4O3S 分子量&#xff1a;502.63 性状&#xff1a;固体粉末 保存方法&#xff1a;-20℃避光避湿保存 点击化学DBCO发生在水中&#xff…

了解这3大特性,再也不担心传输线问题了!

电阻是一个实实在在的物理元器件&#xff0c;通过欧姆定律我们可以知道&#xff0c;电压、电流和电阻三者之间的关系&#xff0c;UI*R。 我们通过一个具体的电路来分析这三者之间的具体关系&#xff0c;请看下面的一张最简单的电路图。这个电路图只有一个电源一个电阻和一些导…

JVM如何安装IBM产品虚拟机openJ9和idea更换jvm

安装前提是卸载掉其他产品或版本的虚拟机防止冲突的发生 1.openJ9是IBM产品的虚拟机 1.1官网下载 1.2openJ9官网介绍 2.下载后的产品 3.点击安装–选择默认安装路径 默认路径–C:\Program Files\Semeru\ 3.1安装完成 4.配置jdk环境变量JAVA_HOME 5.配置Path–作用是在操作…

【游戏逆向】某某游戏邮件遍历分析

邮件常常用来远程交易&#xff0c;这样可以节省交易时间&#xff0c;并且降低数据的需求。邮件遍历的分析&#xff0c;一般是以邮件名字&#xff0c;邮件数量等为突破口。不过有些游戏的邮件名字并不存放在邮件对象中&#xff0c;或者在对象中也不会改变邮件的本地显示&#xf…

Canal搭建 idea设置及采集数据到kafka

Canal GitHub&#xff1a;https://github.com/alibaba/canal#readme 实时采集工具canal&#xff1a;利用mysql主从复制的原理&#xff0c;slave定期读取master的binarylog对binarylog进行解析。 canal工作原理 canal模拟MySQL slave的交互协议&#xff0c;伪装自己为MySQL slav…

tb-gateway配置modbus

1、在tb_gateway.yaml开启modbus连接器 2、配置modbus.json 2.1、配置文件示例 {"master": {"slaves": [{"host": "127.0.0.1","port": 5021,"type": "tcp","method": "socket",…

DBCO-Cy3,荧光染料标记点击化学二苯基环辛炔CAS 1782950-79-1;DBCO-Cyanine3分子量983.18

中文名称&#xff1a;二苯基环辛炔-CY3 中文别称&#xff1a;花菁染料CY3标记DBCO 英文名称&#xff1a;DBCO-CY3 英文别称&#xff1a;DBCO-Cyanine3 性状&#xff1a;红色固体或粉末 分子量&#xff1a;983.18 分子式&#xff1a;C50H54N4O11S3 CSA:1782950-79-1 激发…

ESP32-S3 N8R2 烧录调试记录

ESP32 型号&#xff1a;ESP32-S3-WROOM-1(M0N8R2) ESP32 烧录器型号&#xff1a;ESP Prog v1.0 IOTMCU 烧录器的开关按键是复位按键。 接线图如下&#xff1a; 注意&#xff1a;RX连 RX TX连TX EN连RST Arudion IDE 配置如下&#xff1a; 注意 Arudino 中使用串口为 Serial…

【计算机网络】| Http.*协议该知道的那些事儿 | 面经

本文章参考了很多文档文献整理成狮子自己喜欢的风格类型文字&#xff0c;主要有&#xff1a; 《图解网络-小林coding》、Github上面的《前端语音社群》&#xff0c;ChatGpt 3.5 大家有兴趣可以去找来看看&#xff0c;一起上岸&#xff01;&#xff01;&#xff01; 目录 面试官…

leecode654——最大二叉树

leecode最大二叉树 &#x1f33b;题目要求&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的…

数据信托:可信的数据流通模式

数据信托&#xff1a;可信的数据流通模式 黄京磊, 李金璞, 汤珂 清华大学社会科学学院经济学研究所&#xff0c;北京 100084 摘要&#xff1a;数据信托可被视作一种新型的、可信的数据流通模式。数据信托不仅是一种保障信息安全的组织结构&#xff0c;还是一种增进数据要素市场…