python+selenium实现12306抢票

这篇具有很好参考价值的文章主要介绍了python+selenium实现12306抢票。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

python+selenium实现12306抢票

一、准备工作

1、要先下载相关的包,selenium、interval。最好使用国内清华源

pip install (which package) -i https://pypi.tuna.tsinghua.edu.cn/simple

2、还要下载对应浏览器的驱动:

2.1 安装chromedriver

谷歌浏览器驱动的网址为link
注意:谷歌浏览器的驱动版本要匹配谷歌浏览器的版本
随机点击一个版本:
python+selenium实现12306抢票
点击notes.txt
python+selenium实现12306抢票

2.2 安装FireFox驱动(我用的是这个)

火狐驱动下载网址:link
然后一样的下载对应的驱动版本文章来源地址https://www.toymoban.com/news/detail-427668.html

2.3 最后把下载好的驱动解压,移动到/usr/bin文件夹(linux系统)中或者放入python一级目录下就好了

二、具体实现过程(代码有具体注释)

from selenium import webdriver
from time import sleep#页面等待时间
from selenium.webdriver.common.by import By#定位元素
from selenium.webdriver import ActionChains#完成一系列自动化操作
from selenium.webdriver.common.keys import Keys#完成键盘上的操作
from collections import defaultdict#初始化字典,value为列表
import re#用于正则表达式
# from datetime import datetime
from interval import IntervalSet#用于定义时间区间
# import json

class TrainTicketLogin(object):
    def __init__(self):
        #12306登录网页的网址
        self.url='https://kyfw.12306.cn/otn/resources/login.html'
        #你自己的用户名
        self.userName='XXXXXXXXXXX'
        #你自己的密码
        self.passWord='XXXXXX'
        #我用的是火狐浏览器,如果用的是谷歌,要提前下载好对应浏览器的驱动,这里实例化一个浏览器操作对象
        self.options=webdriver.Firefox()
    def login(self,url):
        self.options.get(self.url)
        login_method=self.options.find_element(By.XPATH,'//div[@class="login-box"]/ul/li[1]/a')
        login_method.click()
        userName_tag=self.options.find_element(By.ID,"J-userName")
        passWord_tag=self.options.find_element(By.ID,"J-password")
        userName_tag.send_keys(self.userName)
        passWord_tag.send_keys(self.passWord)
        btn=self.options.find_element(By.ID,"J-login")
        btn.click()
        sleep(3)
        slide_btn=self.options.find_element(By.XPATH,'//*[@id="nc_1_n1z"]')
        self.Verification(slide_btn)
    def Verification(self,button):
        action1=ActionChains(self.options)
        # 防止12306网站禁止selenium而出现的error
        script = 'Object.defineProperty(navigator,"webdriver",{get:()=>undefined,});'
        self.options.execute_script(script)
        action1.click_and_hold(button)
        action1.move_by_offset(300,0).perform()
        #释放鼠标
        action1.release().perform()
        sleep(1)
    def get_ticket(self):
        chepiao_button=self.options.find_element(By.XPATH,'//a[@id="link_for_ticket"]')
        chepiao_button.click()
        sleep(3)
        origin=self.options.find_element(By.ID,"fromStationText")
        arrival=self.options.find_element(By.ID,"toStationText")
        date=self.options.find_element(By.ID,"train_date")
        my_chufa=IntervalSet.between(self.l_time_interval_left,self.l_time_interval_right)
        my_daoda=IntervalSet.between(self.a_time_interval_left,self.a_time_interval_right)
        #出发地键入
        origin.click()
        origin.send_keys(self.loc_l)
        origin.send_keys(Keys.ARROW_DOWN)
        origin.send_keys(Keys.ENTER)
        sleep(1)
        #目的地键入
        arrival.click()
        arrival.send_keys(self.loc_a)
        arrival.send_keys(Keys.ARROW_DOWN)
        arrival.send_keys(Keys.ENTER)
        sleep(1)
        #出发日期键入
        date.clear()
        date.send_keys(self.go_date)
        date.send_keys(Keys.ENTER)
        #是否选择学生票(若为普通票则注释掉以下代码)
        # self.options.find_element(By.ID,"sf2").click()
        #点击查询操作
        query_button=self.options.find_element(By.XPATH,'//div[@class="btn-area"]/a')
        query_button.click()
        #请输入选择的train型号(K字头还是G字头还是D字头还是其他)
        sleep(5)
        #进行正则匹配
        ex='<tr id="ticket_(.*?)" class.*?>'
        train_info=defaultdict(list)
        train_type=re.findall(ex,self.options.page_source)
        for train in train_type:
            xpath_1='//tr[@id=\"{}\"]/td[1]/div/div[3]/strong[1]'.format('ticket_'+train)
            xpath_2='//tr[@id=\"{}\"]/td[1]/div/div[3]/strong[2]'.format('ticket_'+train)
            origin_time=self.options.find_element(By.XPATH,xpath_1).text
            arrive_time=self.options.find_element(By.XPATH,xpath_2).text
            train_info[train]=[origin_time,arrive_time]
        #预览一下火车的信息
        # print(train_info)
        #请输入你理想的乘车时间区间和到达时间区间
        for key,value in train_info.items():
            if self.train_ in key.split('_')[0]:
                xpath_3='//*[@id=\"{}\"]'.format(self.type+'_'+key.split('_')[0])
                left_tickets=self.options.find_element(By.XPATH,xpath_3).text
                if value[0] in my_chufa and value[1] in my_daoda and \
                    (left_tickets.isdigit() or left_tickets=='有'):
                    xpath_4='//tr[@id=\"{}\"]//*[@class="btn72"]'.format('ticket_'+key)
                    self.options.find_element(By.XPATH,xpath_4).click()
                    #请选择乘车人,这里选择默认乘车人(第一个人)
                    sleep(2)
                    self.options.find_element(By.XPATH,'//*[@id="normalPassenger_0"]').click()
                    sleep(2)
                    self.options.find_element(By.XPATH,'//*[@id="submitOrder_id"]').click()
                    #确定买票(等待较长时间才能锁定席位)
                    sleep(2)
                    self.options.find_element(By.XPATH,'//*[@id="qr_submit_id"]').click()
                    #返回修改
                    # sleep(2)
                    # self.options.find_element(By.XPATH,'//*[@id="back_edit_id"]').click()
                    


        
        

        

        

    def run(self):
        self.login(self.url)
        sleep(5)
        hint=self.options.find_element(By.XPATH,'//div[@class="modal-ft"]/a')
        hint.click()
        sleep(3)
        self.loc_l=input("请输入出发地:")
        self.loc_a=input("请输入目的地:")
        self.go_date=input("请输入出发日期(格式为%Y-%m-%d的形式):")
        self.l_time_interval_left=input("请输入理想出发时间的左端点:")
        self.l_time_interval_right=input("请输入理想出发时间的右端点:")
        self.a_time_interval_left=input("请输入理想到达时间的左端点:")
        self.a_time_interval_right=input("请输入理想到达时间的右端点:")
        self.train_=input("你想坐高铁还是火车还是动车(G、K、D、T):")
        if self.train_ in ['K','T']:
            # 如果选择火车(软卧、硬卧、硬座)
            self.type=input("请输入你要乘坐的类型(RW、YW、YZ):")
        else:
            self.type=input("请输入你要乘坐的类型(SWZ(商务座)、ZY(一等座)、ZE(二等座)):")
        self.get_ticket()

        # self.options.quit()
if __name__=='__main__':
    Spider=TrainTicketLogin()
    Spider.run()

到了这里,关于python+selenium实现12306抢票的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 12306 抢票开源脚本登上热榜!

    本期推荐开源项目目录: 1. 12306 抢票软件 2. 企业级低代码平台 3. 提问的智慧 4. 开箱即用的 Douyin API 12306 抢票软件 十一黄金周又来了,每到这个期间总有一个开源项目登上开源热榜。12306 抢票脚本,基于 Python 开发,支持自动登录、准点预售、捡漏,智能候补、邮件通知。目

    2024年02月06日
    浏览(55)
  • 28. 实战:基于selenium实现12306自动购票

    目录 前言 目的 思路 代码实现 1. 进入登录界面,输入账号密码 2. 点击登录按钮,完成滑块验证 3. 在个人中心点击购票,跳转 4. 输入出发地、目的地,从控制台输入得到 5. 文本框输入出发日 6. 若是学生票则切换票型 7. 点击查询 8. 定位预定按钮,点击跳转购票页面 9. 选择

    2024年01月22日
    浏览(82)
  • 基于Python和Selenium的大麦网自动抢票脚本

    自动化抢票的脚本,需通过Selenium库来实现自动化操作。(学习参考) 优化后的完整代码: 需要注意的: 我用了 with 语句保证浏览器实例在函数结束后正确关闭。 我用了几个 try-except 块处理在各个步骤可能出现的异常,它可以在异常的时候打印出错误的信息。 我把大部分代

    2024年02月11日
    浏览(42)
  • 【Python】selenium项目实战:从12306网站获取特定时间段二等座有票的车次

    工具: python+pycharm+selenium 12306网址: https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc 出发地: 南京 目的地: 上海 发车日期: 当天日期的第二天 发车时间: 06:00–12:00 目的: 打印所有二等座有座的车次 id=\\\"queryLeftTable\\\"标签下的第4个td标签下的符合class=yes的元素,xpath: //*[@id=\\\"

    2024年02月16日
    浏览(41)
  • 爬虫日常练习-selenium登录12306

    hello,好兄弟们。经过前面几篇文章后,想必小伙伴们对于简单的网页文本爬取,图片爬取类的内容已经熟练掌握了。今天我们开始练习一个新的内容:selenium。有关这一块的基础知识网上太多了,我们作为进阶的练习文章就不在这里从基础说起了。直接上实际案例,与大家分

    2024年02月05日
    浏览(42)
  • 爬虫日常-selenium登录12306,绕过验证

    hello兄弟们,这里是无聊的网友。愉快的周末过去了,欢迎回到学习频道。书接上文,我们说到了再用selenium登录12306时遇到了滑块验证的问题。当前的网站几乎每家都会在登录模块添加一个认证,来规避各种爬虫,而我们则不断的去想办法绕过这些验证模块。目前一些简单的

    2024年02月07日
    浏览(62)
  • Python:基于Python爬虫技术的抢票程序及其实现

    临近放假,相信我们每天都在群聊里或者朋友圈看到一些帮忙抢火车票的信息。看到朋友们抢回家的车票这么辛(bei)苦(can),结合圈里一些前辈的指点,抱着学习的心态用Python做了一个简单的自动化抢票程序,抢到票之后通过绑定的邮箱(比如QQ)发通知。下面分享主要内容:

    2024年02月01日
    浏览(50)
  • 基于selenium的大麦网自动抢票脚本

    先配置webdriver   记录cookie,设置免密登录  购票页面下单   选择座位+选择场次,票档(因为检索是否需要选择座位要浪费点时间,所以直接写了两个方法,看着选)   不用选择座位,直接选择给场次票档和数量 提交订单   购票页面点击加票按钮  判断XPATH是否存在   页

    2024年02月14日
    浏览(45)
  • JS逆向解密秀动app(网页接口)实现抢票【python异步请求】

       HI,上一期我出了js逆向解析五邑大学的AES加密实现模拟登录,后台不少人想让我去解析一下秀动app,去实现抢票。我看因此本文就是介绍如何去实现js逆向解析秀动网页端口实现抢票。 (本文拿最近的场:广州姜云升2022巡演) 一.逆向分析过程 首先,我们想要进入下单的

    2024年01月23日
    浏览(42)
  • 演唱会门票抢不到?不要慌,教你用python实现自动化抢票

    之前一直在更新从零开始学python系列的系列文,最近有点忙停更了两天,今天来插一篇其他的文章。 之前有小伙伴留言说女朋友快生日了,喜欢某某某但是手动买票根本就是买不到,又不想当大冤种从黄牛手里加钱,于是乎在疯狂星期四的晚上遭到’‘贿赂’\\\'的我连夜搞定

    2024年02月15日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包