• 4-爬虫-selenium(等待元素加载、元素操作、操作浏览器执行js、切换选项卡、前进后退异常处理)、xpath、动作链


    1 selenium等待元素加载
    2 selenium元素操作
    3 selenium操作浏览器执行js
    4 selenium切换选项卡
    5 selenium前进后退异常处理
    6 登录cnblogs
    7 抽屉半自动点赞
    8 xpath
    9 动作链
    10 自动登录12306

    上节回顾

    # 1 bs4 解析库---》xml(html)
    	-遍历文档树
        -属性 文本 标签名
        -搜索文档树:find  find_all
        	-5 种过滤器:字符串,正则,布尔,列表,方法
            -find(name='字符串',src='正则',class_='布尔',href='列表',text='字符串',方法)
        -遍历文档树和搜索文档树可以连用
        	find()  结果是:Tag类的对象,BeautifulSoup继承了它
            结果可以继续 . 也可以继续 find
        -find的其他参数
        	-limit
            -recursive
        -链式调用
        
        -小说,图片
        
    # 2 css选择器
    	-id选择器
        -标签选择器
        -类选择器
        -属性选择器
        
        - 标签
        - .- #id
        - div a
        - div>a
        soup.select('css选择器')  可能是多个,放到列表中
        
        
    # 3 selenium :控制浏览器,解决requests不能执行js的问题
    	-浏览器驱动:浏览器版本
        -pip install selenium
        
        -快速使用
        import time
        from selenium import webdriver
        # 跟人操作浏览器一样,打开了谷歌浏览器,拿到浏览器对象
        bro=webdriver.Chrome()
        # 在地址栏中输入地址
        bro.get('https://www.baidu.com')
        time.sleep(5)
        bro.close() # 关闭当前tab页
        bro.quit() # 关闭浏览器
        
    # 4 模拟登录百度
    	-查找标签
            # By.ID  # 根据id号查找标签
            # By.NAME  # 根据name属性查找标签
            # By.TAG_NAME  # # 根据标签查找标签
            # By.CLASS_NAME # 按类名找
            # By.LINK_TEXT # a标签文字
            # By.PARTIAL_LINK_TEXT # a标签文字,模糊匹配
            #---------selenium 自己的--------
            # By.CSS_SELECTOR # 按css选择器找
            # By.XPATH  #按xpath找
            
        -操作标签
        	-点击
            -写文字
            
            
    # 5 无头浏览器
    	-bro.page_source
        
    # 6 找到标签
    	-属性
        -文本
        -标签名
        -位置
        -大小
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71

    1 selenium等待元素加载

    # 代码操作非常快---》有的标签还没加载---》找就找不到---》就会报错
    # 设置等待:显示等待,隐士等待
    bro.implicitly_wait(10) # 找某个标签,如果找不到,最多等待10s
    
    • 1
    • 2
    • 3

    2 selenium元素操作

    # 点击操作
    	click()
        
    # 写文字
    	send_keys("内容")
        
        
    # 清空文字
    	clear()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3 执行js

    # 在使用selenium操作浏览器的时候,可以自己写js执行,会用这东西做什么?
    	-创建新的选项卡
        -打印出一些变量(属于当前爬取的页面中的变量)
        -获取当前登录的cookie
        -滑动屏幕
    
    • 1
    • 2
    • 3
    • 4
    • 5
    import time
    
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    bro = webdriver.Chrome()
    bro.get('https://www.pearvideo.com/category_1')
    bro.implicitly_wait(10)
    bro.maximize_window()
    # 1 基本使用
    # bro.execute_script('alert("美女")')
    # 2 打印出一些变量
    # res=bro.execute_script('console.log(urlMap)')
    # print(res)
    
    # 3 新建选项卡
    # bro.execute_script('open()')
    
    # 4 滑动屏幕
    # bro.execute_script('scrollTo(0,document.documentElement.scrollHeight)')
    
    # 5 获取当前访问地址
    # bro.execute_script('alert(location)')
    # bro.execute_script('location="http://www.baidu.com"')
    
    # 6 打印cookie
    bro.execute_script('alert(document.cookie)')
    time.sleep(10)
    bro.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    4 切换选项卡

    from selenium import webdriver
    import time
    bro = webdriver.Chrome()
    bro.get('https://www.pearvideo.com/')
    bro.implicitly_wait(10)
    print(bro.window_handles)
    # 开启选项卡
    bro.execute_script('window.open()')
    # 获取出所有选项卡
    
    bro.switch_to.window(bro.window_handles[1]) # 切换到某个选项卡
    bro.get('http://www.taobao.com')
    
    time.sleep(2)
    bro.switch_to.window(bro.window_handles[0]) # 切换到某个选项卡
    bro.get('http://www.baidu.com')
    
    time.sleep(2)
    bro.execute_script('window.open()')
    bro.execute_script('window.open()')
    bro.close() # 关闭选项卡
    bro.quit()  # 关闭页面
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    5 前进后退异常处理

    from selenium import webdriver
    import time
    bro = webdriver.Chrome()
    bro.get('https://www.pearvideo.com/')
    bro.implicitly_wait(10)
    
    # 获取出所有选项卡
    time.sleep(2)
    bro.get('http://www.taobao.com')
    
    time.sleep(2)
    
    bro.get('http://www.baidu.com')
    time.sleep(2)
    bro.back()
    time.sleep(2)
    bro.back()
    time.sleep(2)
    bro.forward()
    bro.quit()  # 关闭页面
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    6 登录cnblogs

    # 以后要爬取的数据,要登录后才能看到
    	-如果使用selenium,速度慢---》不能开启多线程---》速度不会太快
        -如果使用requests发送请求,登录不好登录,自动登录不进去--》拿不到cookie
        
        
        -使用selenium登录---》拿到cookie---》换到别的机器,使用这个cookie,依然是登录状态
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    import time
    
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    import json
    from selenium.webdriver.common.by import By
    # 去掉自动化软件控制的检测
    options = Options()
    options.add_argument("--disable-blink-features=AutomationControlled")  # 去掉自动化控制
    bro = webdriver.Chrome(options=options)
    # bro = webdriver.Chrome()
    ########### 纯自动登录#######得到了cookie
    bro.get('https://www.cnblogs.com/')
    bro.implicitly_wait(10)
    bro.maximize_window()
    login_btn = bro.find_element(By.LINK_TEXT, '登录')
    login_btn.click()
    
    time.sleep(2)
    
    # 找到用户名和密码输入框
    username = bro.find_element(By.CSS_SELECTOR, '#mat-input-0')
    password = bro.find_element(By.ID, 'mat-input-1')
    
    submit_btn = bro.find_element(By.CSS_SELECTOR,
                                  'body > app-root > app-sign-in-layout > div > div > app-sign-in > app-content-container > div > div > div > form > div > button')
    # 验证码
    code=bro.find_element(By.ID,'rectMask')
    time.sleep(1)
    
    
    username.send_keys('@qq.com')
    time.sleep(1)
    password.send_keys('#')
    time.sleep(1)
    submit_btn.click()  # 一种情况直接登录成功   一种情况会弹出验证码
    code.click()
    time.sleep(10)
    
    # 让程序先停在这---》手动操作浏览器---》把验证码搞好---》程序再继续往下走
    # 到现在,是登录成功的状态
    # 取出cookie存起来
    cookies = bro.get_cookies()
    with open('cnblogs.json', 'w', encoding='utf-8') as f:
        json.dump(cookies, f)
    
    time.sleep(2)
    bro.close()
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    import time
    
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    import json
    from selenium.webdriver.common.by import By
    
    # 去掉自动化软件控制的检测
    options = Options()
    options.add_argument("--disable-blink-features=AutomationControlled")  # 去掉自动化控制
    bro = webdriver.Chrome(options=options)
    
    bro.get('https://www.cnblogs.com/')
    bro.implicitly_wait(10)
    bro.maximize_window()
    
    time.sleep(5)
    # 取出cookie--》写入到浏览器中---》刷新浏览器---》登录状态
    with open('cnblogs.json', 'r') as f:
        cookies = json.load(f)
    # 写到浏览器中
    for item in cookies:
        bro.add_cookie(item) # 如果是没登录的cookie,往里写会报错
    
    # 刷新浏览器
    bro.refresh()
    
    time.sleep(5)
    bro.close()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    7 抽屉半自动点赞

    # 使用selenium登录---》拿到cookie
    # 点赞 使用requests 用cookie点赞
    
    
    • 1
    • 2
    • 3
    ####自动登录---使用selenium####
    import json
    
    # import time
    #
    # from selenium import webdriver
    # from selenium.webdriver.chrome.options import Options
    # import json
    # from selenium.webdriver.common.by import By
    #
    # bro = webdriver.Chrome()
    # bro.get('https://dig.chouti.com/')
    # bro.implicitly_wait(10)
    # bro.maximize_window()
    #
    # btn_login = bro.find_element(By.ID, 'login_btn')
    # time.sleep(1)
    # btn_login.click()
    # time.sleep(1)
    #
    # phone = bro.find_element(By.NAME, 'phone')
    # password = bro.find_element(By.CSS_SELECTOR,
    #                             'body > div.login-dialog.dialog.animated2.scaleIn > div > div.login-footer > div.form-item.login-item.clearfix.mt24 > div > input.input.pwd-input.pwd-input-active.pwd-password-input')
    #
    # submit_login = bro.find_element(By.CSS_SELECTOR,
    #                                 'body > div.login-dialog.dialog.animated2.scaleIn > div > div.login-footer > div:nth-child(4) > button')
    #
    # phone.send_keys('你的手机号')
    # password.send_keys('你的密码')
    # time.sleep(2)
    # submit_login.click()
    #
    # input('等你')
    #
    # cookies = bro.get_cookies()
    # with open('chouti.json', 'w', encoding='utf-8') as f:
    #     json.dump(cookies, f)
    #
    # time.sleep(2)
    # bro.close()
    
    
    #### 使用requests点赞
    
    # 访问首页,解析出id号
    import requests
    from bs4 import BeautifulSoup
    
    #### 携带cookie访问#####
    session = requests.Session()
    cookie = {}  # 本地取出来,写入
    with open('chouti.json', 'r') as f:
        cookie_list = json.load(f)
    ##### selenium的cookie和requests的cookie格式不一样,要转换   {key:value,key:value}
    for item in cookie_list:
        cookie[item['name']] = item['value']
    header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'}
    res = session.get('https://dig.chouti.com/', cookies=cookie,headers=header)
    soup = BeautifulSoup(res.text, 'html.parser')
    
    
    print(res.text)
    
    
    
    divs = soup.find_all(name='div', class_='link-item')
    for div in divs:
        article_id = div.attrs.get('data-id')
        data = {
            'linkId': article_id
        }
    
        res1 = session.post('https://dig.chouti.com/link/vote', data=data,headers=header)
        print(res1.text)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75

    8 xpath

    # 在 xml中查找元素,解析库
    	-解析库自带的
        -css选择器
        -xpath---》通用的---》
        	即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言
            
            
    # 记住的:
    	nodename	选取此节点的所有子节点。
        /	        从根节点选取。
        //	        从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
        .	        选取当前节点。
        ..	        选取当前节点的父节点。
        @	        选取属性。
        
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    doc = '''
    
     
      
      Example website
     
     
      
     
    
    '''
    from lxml import etree
    
    html = etree.HTML(doc)
    # html=etree.parse('search.html',etree.HTMLParser())
    # 1 所有节点
    # a=html.xpath('//*')
    # 2 指定节点(结果为列表)
    # a=html.xpath('//head')
    # 3 子节点,子孙节点
    # a=html.xpath('//div/a')
    # a=html.xpath('//body/a') #无数据
    # a=html.xpath('//body//a')
    # 4 父节点
    # a=html.xpath('//body//a[@href="image1.html"]/..')
    # a=html.xpath('//body//a[1]/..')
    # 也可以这样
    # a=html.xpath('//body//a[1]/parent::*')
    # a=html.xpath('//body//a[1]/parent::div')
    # 5 属性匹配
    # a=html.xpath('//body//a[@href="image1.html"]')
    
    # 6 文本获取     /text()
    # a=html.xpath('//body//a[@href="image1.html"]/text()')
    
    # 7 属性获取     @属性名
    # a=html.xpath('//body//a/@href')
    # # 注意从1 开始取(不是从0)
    # a=html.xpath('//body//a[1]/@href')
    
    # 8 属性多值匹配
    #  a 标签有多个class类,直接匹配就不可以了,需要用contains
    # a=html.xpath('//body//a[@class="li"]')
    # a=html.xpath('//body//a[contains(@class,"li")]')
    # a=html.xpath('//body//a[contains(@class,"li")]/text()')
    # 9 多属性匹配
    # a=html.xpath('//body//a[contains(@class,"li") or @name="items"]')
    # a=html.xpath('//body//a[contains(@class,"li") and @name="items"]/text()')
    # a=html.xpath('//body//a[contains(@class,"li")]/text()')
    # 10 按序选择
    # a=html.xpath('//a[2]/text()')
    # a=html.xpath('//a[2]/@href')
    # 取最后一个
    # a=html.xpath('//a[last()]/@href')
    # a=html.xpath('//a[last()-1]/@href') # 倒数第二个
    # 位置小于3的
    # a = html.xpath('//a[position()<3]/@href')
    
    # 倒数第三个
    # a=html.xpath('//a[last()-2]/@href')
    # 11 节点轴选择
    # ancestor:祖先节点
    # 使用了* 获取所有祖先节点
    # a=html.xpath('//a/ancestor::*')
    # # 获取祖先节点中的div
    # a=html.xpath('//a/ancestor::div')
    # attribute:属性值
    # a=html.xpath('//a[1]/attribute::*')
    # a=html.xpath('//a[1]/attribute::href')
    
    # child:直接子节点
    # a=html.xpath('//a[1]/child::*')
    # descendant:所有子孙节点
    # a=html.xpath('//a[6]/descendant::*')
    # following:当前节点之后所有节点
    # a=html.xpath('//a[1]/following::*')
    # a=html.xpath('//a[1]/following::*[1]/@href')
    # following-sibling:当前节点之后同级节点
    # a=html.xpath('//a[1]/following-sibling::*')
    # a=html.xpath('//a[1]/following-sibling::a')
    # a=html.xpath('//a[1]/following-sibling::*[2]')
    # a=html.xpath('//a[1]/following-sibling::*[2]/@href')
    
    # print(a)
    
    
    '''
    /
    //
    .
    ..
    取文本  /text()
    取属性  /@属性名
    根据属性过滤  [@属性名=属性值]
    class 特殊
    [contains(@class,"li")]
    '''
    
    
    # 终极大招  直接复制
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    # 案例
    import requests
    res=requests.get('https://www.w3school.com.cn/xpath/xpath_syntax.asp')
    from lxml import etree
    
    html = etree.HTML(res.text)
    # a=html.xpath('//div[@id="intro"]//strong/text()')
    # a=html.xpath('/html/body/div/div[4]/div[2]/p/strong')
    a=html.xpath('//*[@id="intro"]/p/strong/text()')
    print(a)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    9 动作链

    # 模拟鼠标点住,拖动的效果,实现滑块认证
    
    # 两种形式
    	-形式一:
            actions=ActionChains(bro) #拿到动作链对象
            actions.drag_and_drop(sourse,target) #把动作放到动作链中,准备串行执行
            actions.perform()
        -方式二:
        	ActionChains(bro).click_and_hold(sourse).perform()
        	distance=target.location['x']-sourse.location['x']
            track=0
            while track < distance:
                ActionChains(bro).move_by_offset(xoffset=2,yoffset=0).perform()
                track+=2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
    import time
    from selenium.webdriver.common.by import By
    
    driver = webdriver.Chrome()
    driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    driver.implicitly_wait(3)
    driver.maximize_window()
    
    try:
        driver.switch_to.frame('iframeResult')  ##切换到iframeResult
        sourse = driver.find_element(By.ID, 'draggable')
        target = driver.find_element(By.ID, 'droppable')
    
        # 方式一:基于同一个动作链串行执行
        # actions = ActionChains(driver)  # 拿到动作链对象
        # actions.drag_and_drop(sourse, target)  # 把动作放到动作链中,准备串行执行
        # actions.perform()
    
        # 方式二:不同的动作链,每次移动的位移都不同
        ActionChains(driver).click_and_hold(sourse).perform()  # 鼠标点中源 标签 不松开
        distance=target.location['x']-sourse.location['x']
    
        track = 0
        while track < distance:
            ActionChains(driver).move_by_offset(xoffset=2, yoffset=0).perform()
            track += 2
        ActionChains(driver).release().perform()
        time.sleep(10)
    
    finally:
        driver.close()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    10 自动登录12306

    import time
    from selenium.webdriver import ActionChains
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.chrome.options import Options
    # 12306检测到咱们用了自动化测试软件,
    options = Options()
    options.add_argument("--disable-blink-features=AutomationControlled")  # 去掉自动化控制
    bro = webdriver.Chrome(chrome_options=options)
    bro.get('https://kyfw.12306.cn/otn/resources/login.html')
    bro.implicitly_wait(5)
    bro.maximize_window()
    user_login = bro.find_element(By.CSS_SELECTOR,
                                  '#toolbar_Div > div.login-panel > div.login-box > ul > li.login-hd-code.active > a')
    
    user_login.click()
    time.sleep(1)
    
    username = bro.find_element(By.ID, 'J-userName')
    password = bro.find_element(By.ID, 'J-password')
    submit_btn = bro.find_element(By.ID, 'J-login')
    username.send_keys('18953675221')
    password.send_keys('')
    time.sleep(3)
    submit_btn.click()
    
    time.sleep(5)
    
    # 找到滑块
    span = bro.find_element(By.ID, 'nc_1_n1z')
    ActionChains(bro).click_and_hold(span).perform()
    ActionChains(bro).move_by_offset(xoffset=300, yoffset=0).perform()
    ActionChains(bro).release().perform()
    time.sleep(5)
    
    bro.close()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
  • 相关阅读:
    硬件工程师成长之路(10.1)——芯片选型
    如何用Jmeter对数据库执行压力测试
    【使用 BERT 的问答系统】第 4 章 :BERT 算法详解
    C++:构造函数与析构函数
    HTML学生作业网页:使用HTML+CSS技术实现传统文化网页设计题材-西安事变历史纪念馆 10页 带视频 带音乐
    计算机算法分析与设计(8)---图像压缩动态规划算法(含C++)代码
    Python:实现radix sort基数排序算法(附完整源码)
    软考 系统架构设计师 简明教程 | 软件系统建模
    1488. 避免洪水泛滥
    高速信号处理板资料保存:383-基于kintex UltraScale XCKU060的双路QSFP+光纤PCIe 卡设计原理图
  • 原文地址:https://blog.csdn.net/weixin_44145338/article/details/134268169