12306_最新23“qiang”票子(爬虫小练_2)

提示:
高铁 : 二等座 + 学生票+ F位
火车: 默认硬卧 + 学生票(也可以选择硬座,将BuyTicket,py里w=='2'的注释打开即可)

为什么搞这个呢?因为每当开学的时候,我老是买不到票,这个气啊!都是卡准时间进的,但终归是手速不行,跟不上,不是在排队中,就是没票…后来就想,别人都能写脚本,我为啥不行,我也是计科人啊,所以就搜资料看视频,不断的加工,终于–还算是写出来了吧,虽然这个版本bug不断,抢票全靠运气

图片展示

视频不过审,就换图片了

运行,在控制台输入相应信息,查询车次

在这里插入图片描述

确认购票,输入车次前对应的次序,开始等待自动抢票(当前抢的是预售票,自动刷新)

在这里插入图片描述

最终抢票界面(一切顺利,大概4s左右订单就提交了)

在这里插入图片描述

环境准备

python解释器(python环境)
官网下载地址:https://www.python.org/downloads/windows/

谷歌驱动(chromedriver.exe)
下载地址:https://chromedriver.storage.googleapis.com/index.html
在这里插入图片描述
在这里插入图片描述

将下载解压后的驱动(chromedriver.exe)分别放到谷歌和python环境下
python环境放置位置
在这里插入图片描述
谷歌放置位置
在这里插入图片描述

下载第三方库

这里主要用到了就是一个交互和滑块检测

pip install selenium==4.1.1

这里建议指定版本下载,我最开始是默认版本(最新),出现闪退,就降版本了
pip下载慢的,看这篇https://blog.csdn.net/m0_58730471/article/details/128793934

查票

查票这里是接上一篇https://blog.csdn.net/m0_58730471/article/details/128881512
在原基础上进行了部分修改(city.json文件在上一行给的文章里)

# 数据请求模块
import requests
# 序列化和反序列化
import json
# 表格格式输出(美化输出)
import prettytable as pt 
import datetime
#导入自定义模块
import BuyTicket as buy



# 读取city.json文件
f = open('city.json', mode='r', encoding='utf-8')
text = f.read()
city_json = json.loads(text)

#进行查票(在指定乘车日期+指定出发时间段+有票)
flag=False
while True:
    print()
    print("========================开始购票============================")
    print()
    while True:
        from_station = input('请输入你的出发地: ')
        try:
            city_json[from_station]
            break
        except:
            print()
            print("出发地不存在,或输入不正确")
            print()

    while True:
        to_station = input('请输入你的目的地: ')
        try:
            city_json[to_station]
            break
        except:
            print()
            print("目的地不存在,或输入不正确")
            print()

    version=input("乘车类型(高铁-1,火车-2,所有车次-3):")
    # 购票日期
    while True:
        # 获取当前系统时间
        now1 = datetime.datetime.now().strftime('%Y-%m-%d')
        now=now1.split('-')
        train_date1 = input('请输入乘车时间(格式:'+now1+'): ')
        train_date=train_date1.split('-')
        # 判断输入合法性
        # 判断日期时间是不是满足要求(当天+后继14天)
        if len(train_date)==3:
            if len(train_date[0])==4 and train_date[0]>=now[0]:
                if len(train_date[1])==2 and '00'<train_date[1]<='12':
                    if len(train_date[2])==2 and '00'<train_date[2]<='31':
                        date2=datetime.datetime.strptime(now1[0:10],"%Y-%m-%d")
                        date1=datetime.datetime.strptime(train_date1[0:10],"%Y-%m-%d")
                        if 0<=(date1-date2).days<15:
                            break
        print("日期输入有误,请再次输入!!!")
   
    # 出发时间段
    while True:
        times=input("输入想要购票的时间段(24小时制)(例:10-14):").split('-')
        try:
            if len(times)==2:
                if 0<=int(times[0])<=int(times[1]) and int(times[1])<=23:
                    break
                else:
                    print("是时间,24小时制的时间(0-23),不要闹好不好")
            else:
                print("再闹没票了啊!!!")
        except:
            print("还闹,不管你了啊!!!")

    
    #访问url
    url = "https://kyfw.12306.cn/otn/leftTicket/queryZ?"
    #携带的请求参数
    data = {
        'leftTicketDTO.train_date': train_date1,
        'leftTicketDTO.from_station': city_json[from_station],
        'leftTicketDTO.to_station': city_json[to_station],
        'purpose_codes': 'ADULT'
    }
    #携带验证信息
    headers = {
        'Cookie': '_uab_collina=167499505748263902067472; JSESSIONID=EBB7BB72E53FB9EBDF572A1FB5F9501F; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; _jc_save_fromStation=%u6D1B%u9633%u9F99%u95E8%2CLLF; _jc_save_toStation=%u5B89%u9633%u4E1C%2CADF; _jc_save_wfdc_flag=dc; RAIL_EXPIRATION=1675700441381; RAIL_DEVICEID=qe8Urc4t2EKH4vO7M9o074ICj3yjpgbyj6OtWFWizKxzSPkD_UHtsq7uqt8EQlU55v57L_ra7h0HgkwUIhuajVkSm8Xi2ezDrFIWl_hg05ZDcuvwTrwHWNsc_x8MN4x5Cippb8ILX9U_2zwe6DDHxtxMZKiYeaPb; BIGipServerotn=2229797130.50210.0000; BIGipServerpassport=803733770.50215.0000; fo=g4nfuizb5y3uxsafrbjh5eUbePmfMzR2ut8WtkFjj-THCc1n0cQeaR31JlgmsQqwW4_p2scXT7hb1zuzVv6lD-UTrEDL4xtGjZOZt_R1KOPDlO6bldWB3bhMNDZEwYqudPnSoV-jLO-sxKJEfVSftKitQTlFTNd5fVAaVfDwHX0hm7lPEYM4aBB0bwI; route=c5c62a339e7744272a54643b3be5bf64; _jc_save_toDate=2023-02-04; _jc_save_fromDate=2023-02-12',
    }
    # 发送请求
    res = requests.get(url=url, params=data, headers=headers)
    # 自动转码(中文乱码)
    res.encoding = res.apparent_encoding

    print(res)
    # 获得携带的需求数据
    result=res.json()['data']['result']
    # 数据格式化
    tb=pt.PrettyTable()
    if version=='1':
        # 高铁
        tb.field_names=[
            '次序',
            '车次',
            '出发时间',
            '到达时间',
            '耗时',
            '特等座',
            '一等',
            '二等',
        ]
    elif version=='2':
        # 火车
        tb.field_names=[
            '次序',
            '车次',
            '出发时间',
            '到达时间',
            '耗时',
            '软卧',
            '硬卧',
            '硬座',
            '无座',
        ]
    else:
        # 表头(所有车次)
        tb.field_names=[
            '次序',
            '车次',
            '出发时间',
            '到达时间',
            '耗时',
            '特等座',
            '一等',
            '二等',
            '软卧',
            '硬卧',
            '硬座',
            '无座',
        ]
    
    #遍历拆分数据
    page=1
    for index in result:
        # requests.utils.unquote(index)
        # index_list = index.replace('有', 'Yes').replace('无', 'No').split('|')
        index_list = index.split('|')
        # print(index_list)
        train_number = index_list[3]  # 车次
        time_1 = index_list[8]  # 出发时间
        time_2 = index_list[9]  # 到达时间
        use_time=index_list[10] # 耗时
        # 高铁
        prince_seat = index_list[32]  # 特等座
        first_class_seat = index_list[31]  # 一等座
        second_class = index_list[30]  # 二等座
        # 火车
        hard_seat = index_list[29]  # 硬座
        no_seat = index_list[26]  # 无座
        soft_sleeper = index_list[23]  # 软卧
        hard_sleeper = index_list[28]  # 硬卧
        
        # 指定时间段
        if int(times[0])<=int(time_1.split(':')[0])<=int(times[1]):
            # 高铁
            if version=='1' and train_number[0]=='G':
                if prince_seat!='无' or first_class_seat!='无' or second_class!='无':
                    # 表格内容
                    tb.add_row([
                        page,
                        train_number,
                        time_1,
                        time_2,
                        use_time,
                        prince_seat,
                        first_class_seat,
                        second_class,
                    ])
            # 火车 
            elif version=='2' and train_number[0]!='G':
                if hard_seat!='无' or no_seat!='无' or soft_sleeper!='无' or hard_sleeper!='无':
                    # 表格内容
                    tb.add_row([
                        page,
                        train_number,
                        time_1,
                        time_2,
                        use_time,
                        soft_sleeper,
                        hard_sleeper,
                        hard_seat,
                        no_seat,
                    ])
            # 所有车次 
            elif version!='1' and version!='2':
                # 表格内容
                tb.add_row([
                    page,
                    train_number,
                    time_1,
                    time_2,
                    use_time,
                    prince_seat,
                    prince_seat,
                    second_class,
                    soft_sleeper,
                    hard_sleeper,
                    hard_seat,
                    no_seat,
                ])
        page+=1
    print(tb)
    print()
    print()

抢票

这里是自己瞎搞的,也确实能买到票,但终归是小白入门,所以嗯哼~

思路:
1 访问网址,填写账号密码,点击登录
2 借助网上大神的解释,解决滑块验证
3 后面就是查找出发地、目的地、日期的对应位置,填入预订信息
4 去检测指定车次的预订位置

判断指定位置的内容:
是预订,就点击跳转,进入下一页,选择乘车人信息
如果是16点起售,就是没到放票时间,不断刷新

5 选择乘车人信息(指定选择了第一个)
6 解决学生票弹窗(我是学生,所以购买的学生票,点击的是)
7 提交订单,选择车位(选的F位,两人位靠窗,多爽啊)
8 狂刷点击确定,直到出现订单提交(这时候别退,要多等一会儿,确保买到票)
9 嗯~,没有了,目前就这些(但是技术不断变化,当前可行,可能一段时间就GG了)
10 对了,有一个问题,有时候都到预定了,一点机预订,会二次弹出账号密码登录,我试着写了,但没解决,后来代码写成了现在这b样子,就不想动他了,终归遇到的次数不多,也就这样了,后续了解了,继续优化

注意:
ser = Service(f’D:\Python\chromedriver.exe’)
里面的路径就是最开始环境搭建时候下载的驱动在python中的放置位置
#账号(后面是你的登录账号,一般就用手机哈)
driver.find_element_by_css_selector(‘#J-userName’).send_keys(‘137xxxxxxxx’)
#密码(这个填入的是你的账号对应的密码)
driver.find_element_by_css_selector(‘#J-password’).send_keys(‘123hdsjdwe’)

BuyTicket.py

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
#from password import account, password
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 导入动作链对应的类
from selenium.webdriver import ActionChains
# 反检测
from selenium.webdriver import ChromeOptions
from time import sleep


# 购票
def buy_ticket(num,from_station,to_station,sendData,w):

    option=ChromeOptions()
    # 谷歌驱动路径
    ser = Service(f'D:\Python\chromedriver.exe')
    # 实现规避检测
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    option.add_experimental_option("detach", True)
    # 定义为全局,避免窗口一闪而过
    global driver
    driver=webdriver.Chrome(service=ser,options=option)
    # 隐式等待5s
    driver.implicitly_wait(10)

    driver.get("https://kyfw.12306.cn/otn/resources/login.html")

    # 采取去除特征识别,即以下两行代码。
    script = 'Object.defineProperty(navigator, "webdriver", {get: () => false,});'
    driver.execute_script(script)
 
    # js = 'return window.navigator.webdriver'
    # print(driver.execute_script(js))   # 可以直接在终端输出webdriver检测结果
    
    #账号(后面是你的登录账号,一般就用手机哈)
    driver.find_element_by_css_selector('#J-userName').send_keys('137xxxxxxxx')
    #密码(这个填入的是你的账号对应的密码)
    driver.find_element_by_css_selector('#J-password').send_keys('123hdsjdwe')
    #点击登录
    driver.find_element_by_css_selector('#J-login').click()
    sleep(0.5)
    #找到滑块
    div_TAG=driver.find_element(By.ID,"nc_1_n1z")

    # 动作链
    action=ActionChains(driver)
    # 点击并长按指定的标签
    action.click_and_hold(div_TAG)
    # 渐移
    for i in range(6):
        #perform() 立即执行动作链操作
        # move_by_offset(x,y): x 水平方向 y数值方向 两个参数
        action.move_by_offset(50,0).perform()
        sleep(0.5)
    action.release().perform()

    # 绕过检测
    # driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    #     "source": """
    #                 Object.defineProperty(navigator, 'webdriver', {
    #                     get: () => undefined
    #                 })
    #                 """
    # })

    #回车
    # driver.find_element_by_css_selector('#link_for_ticket').send_keys(Keys.ENTER)
    # 通过元素定位, 点击车票预定
    driver.find_element_by_css_selector('#link_for_ticket').click()

    # 始发地点 =======================================

    # 通过元素定位, 点击键盘回车
    # driver.find_element_by_css_selector('#fromStationText').send_keys(Keys.ENTER)
    # 通过元素定位, 清空输入框内容
    driver.find_element_by_css_selector('#fromStationText').clear()
    # 通过元素定位, 点击一下输入框
    driver.find_element_by_css_selector('#fromStationText').click()
    # 通过元素定位, 输入出发城市
    driver.find_element_by_css_selector('#fromStationText').send_keys(from_station)
    # 通过元素定位, 点击键盘回车
    driver.find_element_by_css_selector('#fromStationText').send_keys(Keys.ENTER)

    # 终点地点====================================

    driver.find_element_by_css_selector('#toStationText').clear()
    driver.find_element_by_css_selector('#toStationText').click()
    driver.find_element_by_css_selector('#toStationText').send_keys(to_station)
    driver.find_element_by_css_selector('#toStationText').send_keys(Keys.ENTER)


    # 购票时间====================================

    driver.find_element_by_css_selector('#train_date').clear()
    driver.find_element_by_css_selector('#train_date').click()
    driver.find_element_by_css_selector('#train_date').send_keys(sendData)
    driver.find_element_by_css_selector('#train_date').send_keys(Keys.ENTER)


    #===========================循环抢票=====================================
    #思路:(自己瞎搞的,小白入门)
    # 如果预订点击有效,会进行页面跳转,url发生变化,所以去捕获url,变化了,就是有票了(买买买买....),
    # 不跳转就刷寻查询,继续判断(这里默认为时无法预订导致的url不变,
    # 其实还有一种情况就是,跳转了,只是代码执行太快了,页面还没加载上就又去获取了ulr2,url2和url1一样了)
    # 哈哈哈,很垃圾,见笑见笑,小白,纯纯小白。
    while True:
        # 点击查询
        try:
            driver.find_element_by_css_selector('#query_ticket').click()
        except:
            break
        #获取当前url
        url1=driver.current_url

        #============================ 预订============================ 
        # 获取指定位置内容 
        # 内容为预订,就点击购票 
        # 内容为16点起售,就是还没有放票,就不断的查询刷新
        #queryLeftTable tr:nth-child(1) .no-br  16点起售
        try:
            content= driver.find_element_by_css_selector(f'#queryLeftTable tr:nth-child({2*num-1}) .no-br').text
        except:
            break
        if content=='预订':
            try:
                driver.find_element_by_css_selector(f'#queryLeftTable tr:nth-child({2*num-1}) .btn72').click()
            except:
                break
        else:
            continue

        #在测试的时候,在点击预订后,会弹出您尚未登录,让重新登录
        #所以就想着把之前的登录操作在搞一遍就是了,但是后边又突然不出现二次登陆了,所以这一块儿对于二次登录弹窗
        #不知道可行不,还得测试
        try:    
            login=driver.find_element_by_css_selector(f'#login > div.modal-login-tit > h2').text
            if login=='您尚未登录':
                #账号
                driver.find_element_by_css_selector('#J-userName').send_keys('137xxxxxxxx')
                #密码
                driver.find_element_by_css_selector('#J-password').send_keys('123sahdjahdj')
                #点击登录
                driver.find_element_by_css_selector('#J-login').click()

                #找到滑块
                div_TAG=driver.find_element(By.ID,"nc_1_n1z")

                # 动作链
                action=ActionChains(driver)
                # 点击并长按指定的标签
                action.click_and_hold(div_TAG)
                # 渐移
                for i in range(2):
                    #perform() 立即执行动作链操作
                    # move_by_offset(x,y): x 水平方向 y数值方向 两个参数
                    action.move_by_offset(150,0).perform()
                action.release().perform()
        except:
            pass
        finally:
            try:
                 #获取当前url
                url2=driver.current_url
                if driver.find_element_by_css_selector(f'#normal_passenger_image_id').text=='乘车人':
                    break
                # 判断url不一样,就是发生了页面跳转
                print("url2==================================="+url2)
                if url1!=url2:
                    break
            except:
                continue     
        #==============================================================

        
    #==================================================================================

    # # 买票(默认选第一乘车人和F座)
    # 选择乘车人
    driver.find_element_by_css_selector('#normalPassenger_0').click()

    # 学生票选择(确定买)
    driver.find_element_by_css_selector('#dialog_xsertcj_ok').click()

    # 提交订单
    driver.find_element_by_css_selector('#submitOrder_id').click()

    # 选座位(F位) 高铁选座位,火车就直接确定了
    if w=='1':
        driver.find_element_by_css_selector('#erdeng1 > ul:nth-child(4) > li:nth-child(2) a').click()
    
    #火车如果选择硬座,请打开该注释,不打开默认选的硬卧
    # if w=='2':
    #     driver.find_element_by_css_selector('#seatType_1 > option:nth-child(2)').click()


    #订单确认(进入待支付状态)
    try:
        while True:    
            driver.find_element_by_css_selector('#qr_submit_id').click()
    except:
        print()
        print()
        print('||======================================||')
        print('||                                      ||')
        print("||  购票成功,请在10分钟内完成支付 ! ! ! ||")
        print('||                                      ||')
        print('||======================================||')
        print()
        print()
        return
    
    
# buy_ticket(5,'洛阳龙门','安阳东','2023-02-09','2')

查票+抢票

在前面有对应的校验

出发地
目的地
日期(2023-02-05格式的,只能是当前日期或者后推14天的日期,只预售15天,还带上当天)
发车时间段(24小时制的0-23)

查询车次之后,打印的带一个次序号,想要乘坐那个车,就输入对应的车次号
在这里有一点就是,对应车次的预订按钮变化是(1,3,5,7,9,奇数)式的,后边做了处理就是(2*num-1),总归就是坐哪个车就输入对应的次序(例:G656–>7)
在这里插入图片描述

连接纽扣

while True:
        if version=='1' or version=='2':
            choise=input("是否开始购票-----(Y/N)")
            print()
            print()
            if choise=='Y' or choise=='y':
                Train_number=int(input("输入预购票车次序号(例:6):"))
                while True:
                    try:
                        buy.buy_ticket(Train_number,from_station,to_station,train_date1,version)
                        flag2=True
                        break
                    except:
                        print()
                        print()
                        print('购票失败!!!')
                        print()
                        print()
                #跳出当前购票,并终止程序
                if flag2:
                    flag=True
                    break
            elif choise=='N' or choise=='n':
                # 是否继续查询判定
                again = input('是否继续查询(Y/N): ')
                if again == 'Y' or again == 'y':
                    break
                else:
                    flag=True
                    break
        else:
            x=input('所有车次展示完毕,如需购票(高铁输入--1, 火车输入--2,再次查询--3): ')
            if x=='1' or x=='2':
                version=x
            else:
                break
    # 终止程序
    if flag:
        print()
        print('=======================程序已退出=========================')
        print()
        print()
        print()
        break

完整代码

里面导入的BuyTicket就是抢票对应的代码
#导入自定义模块
import BuyTicket as buy

最终的文件夹里放的就是这三个
在这里插入图片描述

抢票终极版.py

# 数据请求模块
import requests
# 序列化和反序列化
import json
# 表格格式输出(美化输出)
import prettytable as pt 
import datetime
#导入自定义模块
import BuyTicket as buy



# 读取city.json文件
f = open('city.json', mode='r', encoding='utf-8')
text = f.read()
city_json = json.loads(text)

#进行查票(在指定乘车日期+指定出发时间段+有票)
flag=False
while True:
    print()
    print("========================开始购票============================")
    print()
    while True:
        from_station = input('请输入你的出发地: ')
        try:
            city_json[from_station]
            break
        except:
            print()
            print("出发地不存在,或输入不正确")
            print()

    while True:
        to_station = input('请输入你的目的地: ')
        try:
            city_json[to_station]
            break
        except:
            print()
            print("目的地不存在,或输入不正确")
            print()

    version=input("查询车辆信息(高铁-1,火车-2,所有车次-3):")
    # 购票日期
    while True:
        # 获取当前系统时间
        now1 = datetime.datetime.now().strftime('%Y-%m-%d')
        now=now1.split('-')
        train_date1 = input('请输入乘车时间(格式:'+now1+'): ')
        train_date=train_date1.split('-')
        # 判断输入合法性
        # 判断日期时间是不是满足要求(当天+后继14天)
        if len(train_date)==3:
            if len(train_date[0])==4 and train_date[0]>=now[0]:
                if len(train_date[1])==2 and '00'<train_date[1]<='12':
                    if len(train_date[2])==2 and '00'<train_date[2]<='31':
                        date2=datetime.datetime.strptime(now1[0:10],"%Y-%m-%d")
                        date1=datetime.datetime.strptime(train_date1[0:10],"%Y-%m-%d")
                        if 0<=(date1-date2).days<15:
                            break
        print("日期输入有误,请再次输入!!!")
   
    # 出发时间段
    while True:
        times=input("输入想要购票的时间段(24小时制)(例:10-14):").split('-')
        try:
            if len(times)==2:
                if 0<=int(times[0])<=int(times[1]) and int(times[1])<=23:
                    break
                else:
                    print("是时间,24小时制的时间(0-23),不要闹好不好")
            else:
                print("再闹没票了啊!!!")
        except:
            print("还闹,不管你了啊!!!")

    
    #访问url
    url = "https://kyfw.12306.cn/otn/leftTicket/queryZ?"
    #携带的请求参数
    data = {
        'leftTicketDTO.train_date': train_date1,
        'leftTicketDTO.from_station': city_json[from_station],
        'leftTicketDTO.to_station': city_json[to_station],
        'purpose_codes': 'ADULT'
    }
    #携带验证信息
    headers = {
        'Cookie': '_uab_collina=167499505748263902067472; JSESSIONID=EBB7BB72E53FB9EBDF572A1FB5F9501F; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; _jc_save_fromStation=%u6D1B%u9633%u9F99%u95E8%2CLLF; _jc_save_toStation=%u5B89%u9633%u4E1C%2CADF; _jc_save_wfdc_flag=dc; RAIL_EXPIRATION=1675700441381; RAIL_DEVICEID=qe8Urc4t2EKH4vO7M9o074ICj3yjpgbyj6OtWFWizKxzSPkD_UHtsq7uqt8EQlU55v57L_ra7h0HgkwUIhuajVkSm8Xi2ezDrFIWl_hg05ZDcuvwTrwHWNsc_x8MN4x5Cippb8ILX9U_2zwe6DDHxtxMZKiYeaPb; BIGipServerotn=2229797130.50210.0000; BIGipServerpassport=803733770.50215.0000; fo=g4nfuizb5y3uxsafrbjh5eUbePmfMzR2ut8WtkFjj-THCc1n0cQeaR31JlgmsQqwW4_p2scXT7hb1zuzVv6lD-UTrEDL4xtGjZOZt_R1KOPDlO6bldWB3bhMNDZEwYqudPnSoV-jLO-sxKJEfVSftKitQTlFTNd5fVAaVfDwHX0hm7lPEYM4aBB0bwI; route=c5c62a339e7744272a54643b3be5bf64; _jc_save_toDate=2023-02-04; _jc_save_fromDate=2023-02-12',
    }
    # 发送请求
    res = requests.get(url=url, params=data, headers=headers)
    # 自动转码(中文乱码)
    res.encoding = res.apparent_encoding

    print(res)
    # 获得携带的需求数据
    result=res.json()['data']['result']
    # 数据格式化
    tb=pt.PrettyTable()
    if version=='1':
        # 高铁
        tb.field_names=[
            '次序',
            '车次',
            '出发时间',
            '到达时间',
            '耗时',
            '特等座',
            '一等',
            '二等',
        ]
    elif version=='2':
        # 火车
        tb.field_names=[
            '次序',
            '车次',
            '出发时间',
            '到达时间',
            '耗时',
            '软卧',
            '硬卧',
            '硬座',
            '无座',
        ]
    else:
        # 表头(所有车次)
        tb.field_names=[
            '次序',
            '车次',
            '出发时间',
            '到达时间',
            '耗时',
            '特等座',
            '一等',
            '二等',
            '软卧',
            '硬卧',
            '硬座',
            '无座',
        ]
    
    #遍历拆分数据
    page=1
    for index in result:
        # requests.utils.unquote(index)
        # index_list = index.replace('有', 'Yes').replace('无', 'No').split('|')
        index_list = index.split('|')
        # print(index_list)
        train_number = index_list[3]  # 车次
        time_1 = index_list[8]  # 出发时间
        time_2 = index_list[9]  # 到达时间
        use_time=index_list[10] # 耗时
        # 高铁
        prince_seat = index_list[32]  # 特等座
        first_class_seat = index_list[31]  # 一等座
        second_class = index_list[30]  # 二等座
        # 火车
        hard_seat = index_list[29]  # 硬座
        no_seat = index_list[26]  # 无座
        soft_sleeper = index_list[23]  # 软卧
        hard_sleeper = index_list[28]  # 硬卧
        
        # 指定时间段
        if int(times[0])<=int(time_1.split(':')[0])<=int(times[1]):
            # 高铁
            if version=='1' and train_number[0]=='G':
                if prince_seat!='无' or first_class_seat!='无' or second_class!='无':
                    # 表格内容
                    tb.add_row([
                        page,
                        train_number,
                        time_1,
                        time_2,
                        use_time,
                        prince_seat,
                        first_class_seat,
                        second_class,
                    ])
            # 火车 
            elif version=='2' and train_number[0]!='G':
                if hard_seat!='无' or no_seat!='无' or soft_sleeper!='无' or hard_sleeper!='无':
                    # 表格内容
                    tb.add_row([
                        page,
                        train_number,
                        time_1,
                        time_2,
                        use_time,
                        soft_sleeper,
                        hard_sleeper,
                        hard_seat,
                        no_seat,
                    ])
            # 所有车次 
            elif version!='1' and version!='2':
                # 表格内容
                tb.add_row([
                    page,
                    train_number,
                    time_1,
                    time_2,
                    use_time,
                    prince_seat,
                    prince_seat,
                    second_class,
                    soft_sleeper,
                    hard_sleeper,
                    hard_seat,
                    no_seat,
                ])
        page+=1
    print(tb)
    print()
    print()
    while True:
        if version=='1' or version=='2':
            choise=input("是否开始购票-----(Y/N)")
            print()
            print()
            if choise=='Y' or choise=='y':
                Train_number=int(input("输入预购票车次序号(例:6):"))
                while True:
                    try:
                        buy.buy_ticket(Train_number,from_station,to_station,train_date1,version)
                        flag2=True
                        break
                    except:
                        print()
                        print()
                        print('购票失败!!!')
                        print()
                        print()
                #跳出当前购票,并终止程序
                if flag2:
                    flag=True
                    break
            elif choise=='N' or choise=='n':
                # 是否继续查询判定
                again = input('是否继续查询(Y/N): ')
                if again == 'Y' or again == 'y':
                    break
                else:
                    flag=True
                    break
        else:
            x=input('所有车次展示完毕,如需购票(高铁输入--1, 火车输入--2,再次查询--3): ')
            if x=='1' or x=='2':
                version=x
            else:
                break
    # 终止程序
    if flag:
        print()
        print('=======================程序已退出=========================')
        print()
        print()
        print()
        break

总结

到这里就完了。总归来说,爬虫真的挺有意思,这一类脚本语言还是有必要学的,毕竟作为一个计科人,多学一些东西是没坏处的。但是这个抢票还是得看天意了(这个取决于你的电脑性能,网速,还有就是会不会遇到稀奇古怪的问题,不过还是希望各位都能-码到票成
感觉还可以的就,麻烦大佬动动您致富的小手指,来个点赞+关注吧!

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值