这次我总算是没有鸽,花了几天做了个脚本
原理:
1,通过selenium做UI方面的点击等待事件
2,使用request来判断出登录时的验证码识别事件
功能:
由于时间太短了,所以做的比较简陋,主要是做了,
1,区分车次,GXXXX,DXXXX等
2,几等座(测试时已二等座为例,穷b只能买得起二等座了…这里提供了所有座位类型判定)
3,,选择联系人(这个很多脚本里没写,个人觉得这个蛮重要的,因为默认都是第一个,但是这里提供了可以选择其他位置的人)
4,出发日期,这个就不说了
用途:
1,买的上,直接到抢票成功,支付方式里
2,试着抢票,抢了100次,没出现异常情况,一般我们抢票也差不多了,多的没时间去测试…
话不多说,直接上代码
login_for_cookie.py
因为12306在多次登录时,会出现限制你再次登录
所以这里直接用一次登录获取cookie,然后在调试期间都是直接用cookie登录


from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWaitfrom Code import Code
import timeclass Login():def __init__(self, driver):self.driver = driverself.login_url = 'https://kyfw.12306.cn/otn/login/init'self.login_success_url = 'https://kyfw.12306.cn/otn/view/index.html'self.ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init'self.person_info_url = 'https://kyfw.12306.cn/otn/confirmPassenger/initDc'def get_login_info(self):with open('info.txt', 'r') as f:lines = f.readlines()username = lines[0].split()password = lines[1].split()f.close()return [username, password]def login_step(self):username = self.get_login_info()[0]password = self.get_login_info()[1]self.driver.get(self.login_url)  # 进入登录界面self.driver.maximize_window()  # 最大化u = self.driver.find_element_by_id('username')  # 用户名p = self.driver.find_element_by_id('password')  # 密码button = self.driver.find_element_by_id('loginSub')  # 登录u.clear()u.send_keys(username)  # 输入用户名p.clear()p.send_keys(password)  # 输入密码Code(self.driver).main()  # 调用识别验证码button.click()  # 点击登录界面time.sleep(2)cookie = self.driver.get_cookie('tk')print(cookie)with open('cookie.txt', 'w') as f:f.write(str(cookie))def login(self):self.login_step()  # 登录while True:if self.driver.current_url == self.login_success_url:print('----------->登录成功')self.driver.quit()breakelse:print('----------->正在等待跳转')
if __name__ == '__main__':login = Login(driver=webdriver.Chrome())login.login()

Code.py
此代码为解析登录时出现的识别认证码

import requests
from PIL import Image
from selenium.webdriver import ActionChains
import time
from io import BytesIOclass Code():def __init__(self, browser):self.browser = browserself.verify_url = 'http://littlebigluo.qicp.net:47720/'     #验证码识别网址,返回识别结果#确定验证码的位置def get_position(self):time.sleep(3)element = self.browser.find_element_by_class_name('touclick-image')time.sleep(2)location = element.locationsize = element.sizeposition= (location['x'], location['y'], location['x'] + size['width'], location['y'] + size['height'])return position#截取整个网页页面def get_screenshot(self):screenshot = self.browser.get_screenshot_as_png()screenshot = Image.open(BytesIO(screenshot))return screenshot#从截取的网页,裁剪出验证码图片,并保存到本地def get_touclick_img(self, name = 'captcha.png'):position = self.get_position()print('验证码的位置:', position)screenshot = self.get_screenshot()captcha = screenshot.crop(position)captcha.save('captcha.png')#验证码解析def parse_img(self):pic_name = 'captcha.png'response=requests.request("POST", self.verify_url, files={'pic_xxfile': open(pic_name, 'rb')})time.sleep(5)num = response.text.split('<B>')[1].split('</B>')[0]print('验证码识别成功!图片位置:%s' % num)try:if int(num):return [int(num)]except ValueError:num = list(map(int,num.split()))return num#识别结果num都以列表形式返回,方便后续验证码的点击#实现验证码自动点击def move(self):num = self.parse_img()try:element = self.browser.find_element_by_class_name('touclick-img-par')for i in num:if i <= 4:ActionChains(self.browser).move_to_element_with_offset(element,40+72*(i-1),73).click().perform()else :i -= 4ActionChains(self.browser).move_to_element_with_offset(element,40+72*(i-1),145).click().perform()except:print('元素不可选!')def main(self):self.get_touclick_img()self.move()

BuyTicket.py
实现抢票以及买票,这里已南昌到无锡为例子设置的

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWaitimport time# value_tostation = '%u65E0%u9521%u4E1C%2CWGH'  # 终点站(无锡东)
# value_fromstation = '%u5357%u660C%u897F%2CNXG'  # 始发站(南昌西)
value_fromstation = '%u65E0%u9521%u4E1C%2CWGH'  # 终点站(无锡东)
value_tostation = '%u5357%u660C%u897F%2CNXG'  # 始发站(南昌西)class BuyTickets():def __init__(self, driver,sit_type ,train, set_man_index, data):self.driver = driverself.login_url = 'https://kyfw.12306.cn/otn/login/init'self.login_success_url = 'https://kyfw.12306.cn/otn/view/index.html'self.ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init'self.person_info_url = 'https://kyfw.12306.cn/otn/confirmPassenger/initDc'self.pay_page = 'https://kyfw.12306.cn/otn//payOrder'self.train = train  # 车次self.set_man_index = set_man_index  # 乘坐人是你默认的第几个位置self.sit_type = sit_type    # 一等座二等座等self.data = datadef get_login_info(self):with open('info.txt', 'r') as f:lines = f.readlines()username = lines[0].split()password = lines[1].split()f.close()return [username, password]def get_cookie(self):with open('cookie.txt', 'r') as f:cookie = f.read()f.close()print(cookie)return eval(cookie)def login_by_cookie(self):self.driver.get(self.login_url)self.driver.maximize_window()  # 最大化cookie = self.get_cookie()self.driver.add_cookie(cookie)self.driver.refresh()while True:if self.driver.current_url == self.login_success_url:print('----------->登录成功')breakelse:print('----------->正在等待跳转')def search_tickets(self):self.driver.get(self.ticket_url)    # 点击订票网页self.driver.add_cookie({"name": "_jc_save_fromStation", "value": value_fromstation})    # 出发站self.driver.add_cookie({"name": "_jc_save_toStation", "value": value_tostation})    # 目的地self.driver.add_cookie({"name": "_jc_save_fromDate", "value": self.data})  # 时间self.driver.refresh()   # 刷新def buy_ticket(self):i = 0flag = Truewhile flag:time.sleep(1)WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.XPATH, '//a[@id="query_ticket"]')))self.driver.find_element_by_id('query_ticket').click()try:    # 判断车次WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.XPATH,"//a[text()='%s']" % self.train)))except:if self.driver.find_element_by_xpath("//p[text()='查询超时,请稍后再试!']"):continueelse:print('兄弟你是不是填错了车次了,没找到车次%s' % self.train)flag = Falsesit = {'商务座':'2',   # 判断一等座二等座等'一等座':'3','二等座':'4','高级软卧':'5','软卧一等卧':'6','动卧':'7','硬卧二等卧':'8','软座':'9','硬座':'10','无座':'11','其他':'12',}for name, value in sit.items():if name == self.sit_type:text = self.driver.find_element_by_xpath("//a[text()='%s']/../../../../../td[%s]" % (self.train, value)).textprint('你关注的票的状态是%s' % text)if text == '*' or text == '无' or text == '候补':continueelif text == '--':print('该车次没有这个座位类型吧')flag = Falseelse:book_button = WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.XPATH, "//a[text()='%s']/../../../../..//a[@class='btn72']" % self.train)))book_button.click()  # 点击预定print('-------------------->抢到票了,正在进入填写乘客信息界面')flag = Falsei = i + 1print('抢票%s次' %i)while True:if self.driver.current_url == self.person_info_url:print('页面成功跳转到乘客信息界面')breakelse:print('等待进入填写乘客信息界面....')set_index = WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.XPATH,"//input[@id='normalPassenger_%s']" % self.set_man_index)))set_index.click()   # 选中乘坐人的次序self.driver.find_element_by_id('seatType_1')    # 选择座位self.driver.find_element_by_xpath("//option[contains(text(),'%s')]" % self.sit_type)    # 选择self.driver.find_element_by_xpath('//*[@id="submitOrder_id"]').click()  # 提交订单WebDriverWait(self.driver,10).until(EC.visibility_of_element_located((By.XPATH, "//a[@class='btn92s' and @id='qr_submit_id']")))self.driver.find_element_by_xpath("//a[@class='btn92s' and @id='qr_submit_id']").click()print('成功抢票')while True:if self.pay_page in self.driver.current_url:print('老铁,需要你付款了!')breakelse:print('正在跳转到付款界面....')def main(self):self.login_by_cookie()self.search_tickets()self.buy_ticket()if __name__ == '__main__':# 分别填写“几等座”# 车次# 坐车的是在联系人里排第几# 出发日期buy = BuyTickets(webdriver.Chrome(),'二等座', 'G1377', '0', '2019-10-04')begin = time.time()buy.main()end = time.time()print('耗时%s' % (end-begin))

除此之外,还有info.txt文件,里面保存了自己12306里的用户名和密码,这里我就不贴出来了。。。
还有个cookie.txt文件,里面保存的是12306的登录cookie

前提条件:
1,不能输错火车车次
2,联系人排位置从0开始,不能输错
3,座位分一等座二等座还有硬座硬卧巴拉巴拉不能填错
4,此脚本没有选择学生座,也没有选ABCDE座位号
运行方式:
1,先运行login_for_cookie.py进行相关登录获取cookie
2,再运行BuyTocket.py进行抢票购票

python+selenium+request实行全自动12306抢票和购票相关推荐

  1. python爬虫抢火车票_如何用python写一个简单的12306抢票软件|python 爬火车票 教程...

    python 如果抓取验证码图片 类似12306的登录验证码图片 这个以前做次.最大的麻烦是码的识别算法的识别率太低.12306那种网站登陆错3次就限制你20分钟.所以除非你有33%以上的识别率否则不 ...

  2. python写一个简单的12306抢票

    引言 每逢过年就到了12306抢票高峰期,自己总想研究一下12306购票的流程,虽然网上已经很多资料,但是总比不过自己的亲身体会,于是便琢磨着写一个抢票软件,本人比较熟悉python,所以软件是用py ...

  3. python实战 selenium+chrome玩转12306抢票

    文章目录 一.目标网站分析 1.1购票流程逐步分析 1.2网站细节分析 1.2.1 输入出发地和目标地的注意点 1.2.2 跳转页面的时候要加入显示等待 1.2.3 被淘汰的语法应该被替换掉 二.代码 ...

  4. 从爬虫构建数据集到CNN模型的验证码识别,一步一步搭建基于Python的PC个人端12306抢票程序

    写在前面:这个程序不是一个人能在短时间内完成的,感谢达纳,王哥的支持帮助.也感谢小平老师,没有压迫,就没有项目. 简介:这是一篇很硬核的Blog, 有一定Python基础的童鞋方能看懂,本程序的主要内 ...

  5. Python selenium 实现大麦网自动抢票,简单的实现全购票过程

    前言 大麦网是中国综合类现场娱乐票务营销平台,业务覆盖演唱会. 话剧.音乐剧.体育赛事等领域 今天,我们要用代码来实现他的购票过程 先来看看完成后的效果是怎么样的 开发环境 版 本:anaconda( ...

  6. 12306 抢票 python + selenium + chrome (二) 基础准备的软件和材料

    我使用的 vmware 14 + ubuntu 16  +  PyCharm  开发环境 12306抢票 python+selenium+chrome 实现一 12306抢票 python+selen ...

  7. python编程实践(3):python+selenium实现12306抢票脚本

    又到了一年一度的春运时节,抢个票? 1.设计思路 如果我们要买一张火车票,我们会怎么做?打开12306,登陆,输入出发地和目的地,选择出行日期,然后点击查询,有余票的话就下单购买,没有票就点刷新或者等 ...

  8. Python selenium+pyautogui写的一个12306抢票

    用selenium+pyautogui写的一个12306抢票 `` 最近处于找工作阶段,在家里闲着无聊,写了一个12306的抢票,还很简陋,也是第一次写文发帖,大佬勿喷. 首先导入模块部分.有些外部库 ...

  9. python+selenium实现12306抢票

    python+selenium实现12306抢票 一.准备工作 1.要先下载相关的包,selenium.interval.最好使用国内清华源 pip install (which package) - ...

  10. 通过python实现12306抢票

    铁路12306抢票系统 ​ #!/usr/bin/env python # -*- coding: utf-8 -*- """ 通过splinter刷12306火车票 进 ...

最新文章

  1. authc过滤器 shiro_使用Shiro实现认证和授权(基于SpringBoot)
  2. 用TensorFlow可视化卷积层的方法
  3. 电子科大电气工程导师介绍绍_电子科技大学计算机科学与工程学院研究生导师介绍:葛树志...
  4. java头像选择系统_Android+超高仿微信图片选择器(头像选择)
  5. 如何下载coursera视频
  6. php中浮点数四舍五入,php浮点数四舍五入函数
  7. 科技圈自媒体达人吴恩达又双叒叕刷屏了 这次是因为Deeplearning.ai
  8. LeetCode 368. 最大整除子集(动态规划)
  9. 如何用T—SQL命令查询一个数据库中有哪些表?
  10. ACL2021中的25个Transformers模型
  11. Object-C——三大特性之多态
  12. LeCun列传:曾因AI理论遭人唾弃,如今终成一代大神
  13. Matlab的自相关函数corr
  14. 【矩阵计算】特征值计算
  15. 罗技M590优联无法使用的问题解决
  16. EXCEL--单元格文字行间距如何调整解决方法
  17. 智慧化工厂安全风险生产预警系统软件
  18. Android齐刘海适配完全攻略
  19. redis的安装步骤
  20. QA 特辑 | 百万员工不上班也能领全勤奖的原因都在这里了!

热门文章

  1. 让一台电脑死机至少需要几行代码
  2. 回归模型效果评估系列3-R平方
  3. html中如何放音乐 和视频播放器,HTML5培训之HTML5音乐播放器和视频播放器分享
  4. java基础-File类与IO流
  5. 无限乱斗哪个服务器有,《LOL》国服无限乱斗什么时候出 国服2020无限乱斗上线时间...
  6. keras+卷积神经网络HWDB手写汉字识别
  7. 下载安装Vue-CLI
  8. hdu3594-仙人掌图的判断tarjan找环-Cactus
  9. day2 用户体验及用户需求(用户体验五要素、需求、需求收集、需求池)
  10. Etcher 改变一个选项,让所有盘符都乖乖出来