爬虫练习-12306自动购票升级版

news2025/1/20 1:57:17

文章目录

  • 前言
  • 代码更新

前言

hello兄弟们,偷懒归来了。别问为啥这么久没更,问就是失踪了
在这里插入图片描述
最近一直在学习Django以及爬虫进阶之类的知识,加上快期末了,一直没有想起来自己还有一个账号没有更新,sorry啦
在这里插入图片描述言归正传,今天抽空把前面的文章升级了一下。这里先把整理好的代码提前放给大家

from selenium.common import ElementNotInteractableException, ElementNotVisibleException
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from lxml import etree
import re
import pickle
import os
import time


# 定义登录方法
def login(user, pwd):
    login_choice = web.find_element(By.XPATH, '//*[@id="toolbar_Div"]/div[2]/div[2]/ul/li[1]')
    # 点击账号密码登录方式
    login_choice.click()
    username = web.find_element(By.XPATH, '//*[@id="J-userName"]')  # 向账号框传入账号信息
    passwd = web.find_element(By.XPATH, '//*[@id="J-password"]')  # 向密码框传入密码
    username.click()
    username.send_keys(user)
    passwd.click()
    passwd.send_keys(pwd)
    # 定位到登录按钮并点击
    web.find_element(By.XPATH, '//*[@id="J-login"]').click()
    # 设置显示等待直到滑块的span标签被定位到
    WebDriverWait(web, 2, 0.5).until(EC.presence_of_element_located((By.ID, 'nc_1_n1z')))
    span = web.find_element(By.ID, 'nc_1_n1z')
    action = ActionChains(web)
    action.click_and_hold(span).move_by_offset(300,
                                               0).perform()  # click_and_hold代表点击并保持点击动作。move_by_offset(x, y),其中x代表水平移动距离,y代表垂直移动距离
    WebDriverWait(web, 10, 1).until(EC.url_to_be('https://kyfw.12306.cn/otn/view/index.html'))
    pickle.dump(web.get_cookies(), open('./12306cookies.pkl', 'wb'))
    print('cookies保存成功')


def cookies_login():
    cookies = pickle.load(open('./12306cookies.pkl', 'rb'))
    for cookie in cookies:
        cookie_dic = {
            'domain': '.12306.cn',
            'name': cookie.get('name'),
            'value': cookie.get('value')
        }
        web.add_cookie(cookie_dic)
    web.get('https://kyfw.12306.cn/otn/leftTicket/init')
    print('cookies载入成功')


def get_ticket_info(start_city, end_city, date):
    WebDriverWait(web, 2, 0.5).until(EC.url_to_be('https://kyfw.12306.cn/otn/leftTicket/init'))

    web.find_element(By.ID, 'fromStationText').click()  # 先定位到出发地输入框点击后再传入参数
    web.find_element(By.ID, 'fromStationText').send_keys(start_city, Keys.ENTER)  # Keys库可以模拟实现键盘上的功能键

    web.find_element(By.ID, 'toStationText').click()  # 目的地
    web.find_element(By.ID, 'toStationText').send_keys(end_city, Keys.ENTER)

    web.find_element(By.ID, 'train_date').clear()  # 由于date页面默认当天日期,所以先清空默认内容在输入参数
    web.find_element(By.ID, 'train_date').send_keys(date, Keys.ENTER)

    web.find_element(By.ID, 'query_ticket').click()  # 点击查询


def get_ticket_dic_info():
    WebDriverWait(web, 2, 0.5).until(EC.presence_of_element_located((By.XPATH, '//*[@id="queryLeftTable"]/tr')))
    tree = etree.HTML(web.page_source)
    tick_list = tree.xpath('//*[@id="queryLeftTable"]/tr')
    tr_dic = {}
    for tr in tick_list:
        if not tr.xpath('./td[1]/div/div[1]/div/a/text()'):
            continue
        else:
            tr_num = '车次:' + tr.xpath('./td[1]/div/div[1]/div/a/text()')[0]
            tr_id = '车辆ID为:' + tr.xpath('./@id')[0] + '|'  # 添加标识头和分隔符便于观看
            tr_from_place = '出发地:' + tr.xpath('./td[1]/div/div[2]/strong[1]/text()')[0] + '  '
            tr_get_place = '目的地:' + tr.xpath('./td[1]/div/div[2]/strong[2]/text()')[0] + '  '
            tr_start_time = '出发时间:' + tr.xpath('./td[1]/div/div[3]/strong[1]/text()')[0] + '  '  # 列车发动时间
            tr_get_time = '到达时间:' + tr.xpath('./td[1]/div/div[3]/strong[2]/text()')[0] + '  '  # 列车到达目的地时间
            if not tr.xpath('./td[2]/@aria-label'):
                tr_shang_wu = 'Null'
            else:
                tr_shang_wu = '商务座:' + tr.xpath('./td[2]/@aria-label')[0] + '  '  # 商务座
            if not tr.xpath('./td[3]/@aria-label'):
                tr_yi_deng = 'Null'
            else:
                tr_yi_deng = '一等座:' + tr.xpath('./td[3]/@aria-label')[0] + '  '  # 一等座
            if not tr.xpath('./td[4]/@aria-label'):
                tr_er_deng = 'Null'
            else:
                tr_er_deng = '二等:' + tr.xpath('./td[4]/@aria-label')[0] + '  '  # 二等座
            if not tr.xpath('./td[6]/@aria-label'):
                tr_ruan_wo = 'Null'
            else:
                tr_ruan_wo = '软卧:' + tr.xpath('./td[6]/@aria-label')[0] + '  '  # 软卧
            if not tr.xpath('./td[8]/@aria-label'):
                tr_ying_wo = 'Null'
            else:
                tr_ying_wo = '硬卧:' + tr.xpath('./td[8]/@aria-label')[0] + ' '  # 硬卧
            if not tr.xpath('./td[10]/@aria-label'):
                tr_ying_zuo = 'Null'
            else:
                tr_ying_zuo = '硬座:' + tr.xpath('./td[10]/@aria-label')[0] + ' '  # 硬座
            if not tr.xpath('./td[11]/@aria-label'):
                tr_wu_zuo = 'Null'
            else:
                tr_wu_zuo = '无座:' + tr.xpath('./td[11]/@aria-label')[0]  # 无座
            tr_dic[tr_num] = tr_id + tr_from_place + tr_get_place + tr_start_time + tr_get_time + tr_shang_wu + \
                             tr_yi_deng + tr_er_deng + tr_ruan_wo + tr_ying_wo + tr_ying_zuo + tr_wu_zuo
    return tr_dic


def chick_ticket(dic, id, count):
    # print('*' * 15 + '查询到的车次信息如下' + '*' * 30)
    # print(str(dic).replace(',', '\n'))
    # train_id = '车次:' + str(input('请输入选择的车次:\n'))  # 车次:与输入的车次num拼接为字典的key值
    train_id = '车次:' + id
    print('您选择的车次为:', id)
    while train_id in dic.keys():
        tr_info = dic.get(train_id)  # 根据key值信息获取到其保存在value里的id与座位信息等
        obj = re.compile(r'车辆ID为:(?P<id>.*?)出发地')  # 利用正则获取到车次id
        result = obj.finditer(tr_info)  # 此时获取到的是迭代器,要重新获取出来
        for i in result:
            tr_id = i.group('id').strip('|')  # 由于获取到的id中带有分隔符|,因此剔除掉
        time_now = time.strftime("%H:%M:%S", time.localtime())  # 刷新
        if time_now == '17:33:05':  # 设定抢票时间,一般为下午五点:17:00:00
            web.refresh()
            web.find_element(By.ID, 'query_ticket').click()  # 点击重新查询
            WebDriverWait(web, 2, 0.1).until(EC.presence_of_element_located((By.XPATH, f'//*[@id="{tr_id}"]/td[13]/a')))
            web.find_element(By.XPATH, f'//*[@id="{tr_id}"]/td[13]/a').click()  # 根据id匹配到车次所在列并点击末尾的预定按钮
            WebDriverWait(web, 2, 0.1).until(EC.url_to_be('https://kyfw.12306.cn/otn/confirmPassenger/initDc'))
            if count == 1:
                my_self = 'N'  # 根据个人情况,如果有学生票选项的话就自己添加一个判断,我这里默认平时学生票为N,不选择
                web.find_element(By.ID, 'normalPassenger_0').click()
                WebDriverWait(web, 2, 0.1).until(EC.presence_of_element_located((By.ID, 'dialog_xsertcj_cancel')))
                if my_self == 'N':
                    web.find_element(By.ID, 'dialog_xsertcj_cancel').click()
                else:
                    web.find_element(By.ID, 'dialog_xsertcj_ok').click()
                web.find_element(By.ID, 'submitOrder_id').click()
                WebDriverWait(web, 100, 0.5).until(EC.element_to_be_clickable((By.ID, 'qr_submit_id')))
                # 由于Seenium自身的Bug,可能会导致确认点击操作无法正确执行,所以​利用try不断访问
                submit_button = web.find_element(By.ID, 'qr_submit_id')
                try:
                    while submit_button:
                        try:
                            submit_button.click()
                            submit_button = web.find_element(By.ID, 'qr_submit_id')
                        except(ElementNotVisibleException, ElementNotInteractableException):
                            # 当在此页面见不到此元素,代表已进入付款页面
                            break
                    print('抢票成功,请尽快付款!')
                except:
                    pass


if __name__ == '__main__':
    opt = Options()
    opt.add_experimental_option('excludeSwitches', ['enable-automation'])  # 去除浏览器顶部显示受自动化程序控制
    opt.add_experimental_option('detach', True)  # 规避程序运行完自动退出浏览器
    web = Chrome(options=opt)
    web.get('https://kyfw.12306.cn/otn/resources/login.html')
    # 解除浏览器特征识别selenium
    script = 'Object.defineProperty(navigator,"webdriver", {get: () => false,});'
    web.execute_script(script)
    user = ''  # 此处输入账号
    pwd = ''  # 此处输入密码
    start_city = '' # 出发城市
    end_city = '' # 目的城市
    date = ''  # 格式参照2023-05-17
    t_id = ''  # 想要选择的车次id
    person1 = ''  # 这里根据自己账号具体保存的个人信息选择乘车人,一人就只需定义一个person,多人数以此累加
    # person2 = ''
    person_list = []
    person_list.append(person1)  # person_list.append(person1,person2,person3, ......)
    person_count = len(person_list)

    if not os.path.exists('./12306cookies.pkl'):
        login(user, pwd)
        web.refresh()
        print('信息输入成功,请重新运行程序')
        web.close()
    else:
        stat_info = os.stat('./12306cookies.pkl')
        last_modify_time = time.time() - stat_info.st_mtime
        # print(last_modify_time)
        if last_modify_time > 1800:  # 建议半小时刷新一次cookie
            login(user, pwd)
            web.refresh()
            print('信息输入成功,请重新运行程序')
            web.close()
        else:
            cookies_login()  # 利用cookie实现快速登陆
			get_ticket_info(start_city, end_city, date)  # 获取到查询信息
			tick_dic = get_ticket_dic_info()  # 查询信息封装成字典传递给选票
			​​chick_ticket(tick_dic, t_id, person_count)   # 进行购票

代码放上,那我们就开搞开搞
在这里插入图片描述

代码更新

相较于第一版,我们进行了重大更新,没有看过之前文章的xdm可以去看看我的主页哈。首先是在登录方式上。老版的登录方式过于繁琐且耗时。听取上次评论兄弟们的意见换成了cookie登录。
首先我们先定义了一个判断语句,检索当下目录有没有用户的cookie文件。我命名为12306cookies.pkl。

 if not os.path.exists('./12306cookies.pkl'):
        login(user, pwd)
        web.refresh()
        print('信息输入成功,请重新运行程序')
        web.close()
    else:
        stat_info = os.stat('./12306cookies.pkl')
        last_modify_time = time.time() - stat_info.st_mtime
        # print(last_modify_time)
        if last_modify_time > 1800:  # 建议半小时刷新一次cookie
            login(user, pwd)
            web.refresh()
            print('信息输入成功,请重新运行程序')
            web.close()
        else:
            cookies_login()
            get_ticket_info(start_city, end_city, date)
            tick_dic = get_ticket_dic_info()
            chick_ticket(tick_dic, t_id, person_count)

如上面代码所示,如果本地未检测到cookie文件,首先会执行账号密码登录,这一块采用的是老版的登录方式,代码没有太大改动,只是在最后利用pickle保存了登录后的用户cookie信息

pickle.dump(web.get_cookies(), open('./12306cookies.pkl', 'wb'))
print('cookies保存成功')

我在这里设定的是获取到cookie信息后,关闭程序退出。再次执行时就会直接进入到查询界面

    if not os.path.exists('./12306cookies.pkl'):
        login(user, pwd)
        web.refresh()
        print('信息输入成功,请重新运行程序')
        web.close()

在这里我再次进行了一次判断,利用时间函数判断cookie文件修改的时间,超过半小时就需要重新账号密码登录刷新cookie信息。
到此一切的目的都是为了在购票前半小时提前准备好一切工作。

    if not os.path.exists('./12306cookies.pkl'):
        login(user, pwd)
        web.refresh()
        print('信息输入成功,请重新运行程序')
        web.close()
    else:
        stat_info = os.stat('./12306cookies.pkl')
        last_modify_time = time.time() - stat_info.st_mtime
        # print(last_modify_time)
        if last_modify_time > 1800:  # 建议半小时刷新一次cookie
            login(user, pwd)
            web.refresh()
            print('信息输入成功,请重新运行程序')
            web.close()

当前面所有步骤全部无误时,再次执行程序就可以直接cookie登录了

cookies_login()  # 利用cookie实现快速登陆
get_ticket_info(start_city, end_city, date)  # 获取到查询信息
tick_dic = get_ticket_dic_info()  # 查询信息封装成字典传递给选票
​​chick_ticket(tick_dic, t_id, person_count)   # 进行购票

有关cookie登录功能的代码如下,主要都是固定模板,没什么难度

def cookies_login():
    cookies = pickle.load(open('./12306cookies.pkl', 'rb'))
    for cookie in cookies:
        cookie_dic = {
            'domain': '.12306.cn',
            'name': cookie.get('name'),
            'value': cookie.get('value')
        }
        web.add_cookie(cookie_dic)
    web.get('https://kyfw.12306.cn/otn/leftTicket/init')  # 直接进如查询界面
    print('cookies载入成功')

下面就是在我看来改动最大的地方
购票函数

def chick_ticket(dic, id, count):
    # print('*' * 15 + '查询到的车次信息如下' + '*' * 30)
    # print(str(dic).replace(',', '\n'))
    # train_id = '车次:' + str(input('请输入选择的车次:\n'))  # 车次:与输入的车次num拼接为字典的key值
    train_id = '车次:' + id
    print('您选择的车次为:', id)
    while train_id in dic.keys():
        tr_info = dic.get(train_id)  # 根据key值信息获取到其保存在value里的id与座位信息等
        obj = re.compile(r'车辆ID为:(?P<id>.*?)出发地')  # 利用正则获取到车次id
        result = obj.finditer(tr_info)  # 此时获取到的是迭代器,要重新获取出来
        for i in result:
            tr_id = i.group('id').strip('|')  # 由于获取到的id中带有分隔符|,因此剔除掉
        time_now = time.strftime("%H:%M:%S", time.localtime())  # 刷新当前时间
        if time_now == '17:33:05':  # 设定抢票时间,一般为下午五点:17:00:00
            web.refresh()
            web.find_element(By.ID, 'query_ticket').click()  # 点击重新查询
            WebDriverWait(web, 2, 0.1).until(EC.presence_of_element_located((By.XPATH, f'//*[@id="{tr_id}"]/td[13]/a')))
            web.find_element(By.XPATH, f'//*[@id="{tr_id}"]/td[13]/a').click()  # 根据id匹配到车次所在列并点击末尾的预定按钮
            WebDriverWait(web, 2, 0.1).until(EC.url_to_be('https://kyfw.12306.cn/otn/confirmPassenger/initDc'))
            if count == 1:
                my_self = 'N'  # 根据个人情况,如果有学生票选项的话就自己添加一个判断,我这里默认平时学生票为N,不选择
                web.find_element(By.ID, 'normalPassenger_0').click()
                WebDriverWait(web, 2, 0.1).until(EC.presence_of_element_located((By.ID, 'dialog_xsertcj_cancel')))
                if my_self == 'N':
                    web.find_element(By.ID, 'dialog_xsertcj_cancel').click()
                else:
                    web.find_element(By.ID, 'dialog_xsertcj_ok').click()
                web.find_element(By.ID, 'submitOrder_id').click()
                WebDriverWait(web, 100, 0.5).until(EC.element_to_be_clickable((By.ID, 'qr_submit_id')))
                # 由于Seenium自身的Bug,可能会导致确认点击操作无法正确执行,所以​利用try不断访问
                submit_button = web.find_element(By.ID, 'qr_submit_id')
                try:
                    while submit_button:
                        try:
                            submit_button.click()
                            submit_button = web.find_element(By.ID, 'qr_submit_id')
                        except(ElementNotVisibleException, ElementNotInteractableException):
                            # 当在此页面见不到此元素,代表已进入付款页面
                            break
                    print('抢票成功,请尽快付款!')
                except:
                    pass

可以看到每一行基本都有我的注释,正文里面就不再解释啦。主要阐述下设计思路。
在代码中设定了抢票时间,利用while不断循环。实现了只要在抢票前30分钟运行了此程序后,就可以放心不去管了。当时间到了设定的购票时间时。程序会迅速发送请求。为了速度,我这里并没有设计选座,追求直接发送购票请求。毕竟是为了能够抢到想要的车票,座位什么的也就不太重要了。

当然,就像我注释所说的那样,每个人的情况都不同,有学生票的情况,也有想购买多张票的情况。在我的代码中只是为了满足我的需求而设计的。大家如果想要应用于实际的话建议自己修改程序。目前为止我的测试都是在访问量不算大的情况下实现的。等后面有机会了还会根据实际情况进行进一步的修改。到此,关于12306登录的文章就暂时不会再更新啦。大家有兴趣的话可以自己在接着研究研究吧。

水文结束,接着潜水。拜拜。
在这里插入图片描述

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

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

相关文章

SpringBoot - Jackson详解

写在前面 JSON 是目前主流的前后端数据传输方式。在 Spring Boot 项目中&#xff0c;只要添加了 WEB依赖&#xff08;spring-boot-starter-web&#xff09;&#xff0c;就可以很方便地实现 JSON 转换。WEB 依赖默认加入了 jackson-databind 作为 JSON 处理器&#xff0c;我们不…

算法小试炼(差不多相当于重新过一遍ACWING,为了夏令营做点准备)

1.最长不重复子串 这个题目的具体意思就不用我说了&#xff0c;我这里给出两种算法 1&#xff09;暴力搜索 只要机器够快&#xff0c;没有什么是暴搜解决不了的^ ^&#xff08;开玩笑 很简单&#xff0c;我们只需要遍历长度&#xff0c;跟左边界就好了&#xff0c;这个应该没…

测试必知必会的Mock数据方法

Mock数据的含义 那么Mock数据是什么意思呢 首先Mock这个英文单词有模拟的意思&#xff0c;模拟数据通俗的理解就是构造假数据&#xff0c;即Mock数据就是通过构造假数据来达到测试的目的&#xff0c;它广泛运用于功能测试、接口测试、单元测试 在功能测试中&#xff0c;可以…

离散数学 | 图论 | 欧拉图 | 哈密顿图 | 割点 | 桥(欧拉图和哈密顿图有没有割点和桥?)

本文主要解决以下几个问题&#xff1a; 1.欧拉图能不能有割点&#xff0c;能不能有桥&#xff1f; 2.哈密顿图能不能有割点&#xff0c;能不能有桥&#xff1f; 首先我们要明白几个定义 割点的定义就是在一个图G中&#xff0c;它本来是连通的&#xff0c;去掉一个点v以后这个…

【firewalld防火墙】

目录 一、firewalld概述二、firewalld 与 iptables 的区别1、firewalld 区域的概念 三、firewalld防火墙默认的9个区域四、Firewalld 网络区域1、区域介绍2、firewalld数据处理流程 五、firewalld防火墙的配置方法1、使用firewall-cmd 命令行工具。2、使用firewall-config 图形…

【计算机网络基础】章节测试4 网络层

R1与R2是一个自治系统中采用RIP路由协议的两个相邻路由器,R1的路由表如图(a)所示。如果R1收到R2发送的如图(b)所示的(V,D)报文,更新之后的R1的4个路由表项的距离从上到下依次为0、4、4、2,那么图 (b)中a、b、c、d 可能的数据一个是( C )。 A. 1、2、2、1 B. 2、2、3、1…

Java 核心技术 卷I 第2章 Java程序设计环境

第2章 Java程序设计环境 2.1 安装Java开发工具包 2.1.1 下载JDK www.oracle.com/technetwork/java/javase/downloads Java术语 2.1.2 设置JDK 下载JDK之后&#xff0c;需要安装这个开发包并明确要在哪里安装&#xff0c;后面还会需要这个信息. 指/opt/jdk1.8.0_31/bin或c…

从零开始Vue3+Element Plus后台管理系统(十四)——PDF预览和打印

其实我常常会纠结今天要写什么内容。 因为希望能够保持每日更新&#xff0c;所以要写的内容不能太难——最好是半天可以搞出demo并且输出文章&#xff0c;所以很多东西浅尝辄止&#xff0c;并没有深入研究&#xff0c;还写出了一些bug &#x1f41b; 今天又浅浅的研究了下在V…

这还只是阿里20K+测试岗面试题,看的我冷汗直流.....

朋友入职已经两周了&#xff0c;整体工作环境还是非常满意的&#xff01;所以这次特意抽空给我写出了这份面试题&#xff0c;而我把它分享给伙伴们&#xff0c;面试&入职的经验&#xff01; 大概是在3月中的时候他告诉我投递了阿里巴巴并且简历已通过&#xff0c;3月23经过…

python类型注释

目录 为什么需要类型注解 什么是类型注解 联合注解 使用注解时的注意点 为什么需要类型注解 看下图&#xff0c;很精炼&#xff1b; 什么是类型注解 Python类型注释是指在变量、函数参数、返回值等位置添加类型信息的一种语法&#xff0c;其目的是提高代码的可读性和可维护…

monkey测试方法及命令

1、查询测试包信息 # 查看已连接设备 adb devices # 带uuid查询包含test的第三方apk包 adb -s W21112003057 shell pm list package -3 | grep test # 清空logcat adb -s W21112003057 logcat -c # 启动app&#xff0c;通过日志查看安装包信息 adb -s W21112003057 logcat…

史上最全!全领域网络安全拓扑图(118页)

大家好&#xff0c;我是老杨。 前几天发了一篇OSPF的文章&#xff0c;助理发到群里和大家讨论。 好几个小友表示&#xff0c;绘制拓扑的才是最高境界&#xff0c;并且想看些拓扑图案例。 其实拓扑图案例老杨也分享过不少了。 可以看看这些往期文章&#xff0c;《超干货&…

【送书福利-第四期】从程序员到架构师:大数据量、缓存、高并发、微服务、多团队协同等核心场景实战书籍

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 送书福利-第四期 一、前言二、书籍介绍抽…

KY111 日期差值

1.题目&#xff1a; 2.分析&#xff1a; 1. 分别求出每一个日期与0000年0月1日距离的天数 2. 两个距离天数相减即可得到两个日期相差的天数 3.我的代码&#xff1a; #include <iostream> using namespace std;class Date { public:Date(int year 1, int month 1, …

java学习:字面量,基本语句

一、字面量 1.字面量的类型 Java字面量的类型其实跟 c 的有点相似&#xff0c;有一点不一样的就是&#xff0c;Java有个null类型&#xff0c;注意这个没有大写 2.特殊字面量 \t 是制表符&#xff0c;它的作用就是补齐一个字符串到8位&#xff0c;这样就会使输出结果变得美观…

【arxiv】关于 SAM 的论文扫读(一)

文章目录 一、阴影检测二、弱监督下的隐蔽物体分割&#xff1a;基于SAM的伪标签和多尺度特征分组三、Instruct2Act&#xff1a;利用大型语言模型将多模态指令映射到机器人动作四、OR-NeRF: Object Removing from 3D Scenes Guided by Multiview Segmentation with Neural Radia…

Lucene(5):索引维护

1 需求 管理人员通过电商系统更改图书信息&#xff0c;这时更新的是关系数据库&#xff0c;如果使用lucene搜索图书信息&#xff0c;需要在数据库表book信息变化时及时更新lucene索引库。 2 添加索引 调用 indexWriter.addDocument&#xff08;doc&#xff09;添加索引。 参…

[Data structure]环形链表

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现 ⭐如果觉得文章写的不错&#xff0c;欢迎点个关注一…

文心一言 VS chatgpt (21)-- h264编码一帧数据的流程是怎样的?

h264编码一帧数据的流程是怎样的&#xff1f; 文心一言&#xff1a; H.264编码将一帧数据分成多个块&#xff0c;其中每个块可以单独进行编码。编码的过程包括预测、变换和量化等步骤。 具体流程如下&#xff1a; 1.帧内预测&#xff1a;对一帧视频进行编码&#xff0c;首先…

什么是网络编程

目录 一、什么是网络编程&#xff1f; 二、协议 1.用户数据报协议(User Datagram Protocol) 2.TCP协议 TCP三次握手过程 三、实例 1.UDP通信程序 实现步骤 TCP接收数据 四、TCP协议和UDP协议的区别和联系 一、什么是网络编程&#xff1f; 1.在网络通信协议下&#xf…