您现在的位置是:亿华云 > IT科技
Python实现全自动购买火车票!抢票回家过年咯
亿华云2025-10-04 03:48:08【IT科技】1人已围观
简介这个是实现结果,因为一天只能取消三次,所以最后一步点击确认被我注释了。1.首先实现使用selenium登陆12306关于使用selenium实现12306登陆可以看我的另一篇文章 这里实现了使用sel
这个是实现实现结果,因为一天只能取消三次,全自抢票所以最后一步点击确认被我注释了。动购

1.首先实现使用selenium登陆12306
关于使用selenium实现12306登陆可以看我的买火另一篇文章 这里实现了使用selenium登陆12306,这次是车票基于上次的代码进行修改实现全自动购买车票的 实现全自动登陆12306链接。
2.根据上面实现登陆后,过年实现购买火车票还需两步
这里只进行了二等座的实现查询和购票,想要买其他的全自抢票自己也可以进行修改 1.进行车票的查询 这里面需要注意的是在输入目的地和起始地时需要先click一下文本框browser.find_element_by_id(‘fromStationText’).click() 不然输入的亿华云计算地址无效 还有将日期的只读属性去掉。
def search_railway_ticket(fromstation,动购tostation,train_date): # 火车票页面查询url search_url = https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc # 转到查询车次页面 browser.get(search_url) time.sleep(2) #输入出发地 WebDriverWait(browser, 1000).until( EC.presence_of_element_located((By.ID, fromStationText)) ) #先点击一下 browser.find_element_by_id(fromStationText).click() browser.find_element_by_id(fromStationText).send_keys(fromstation) browser.find_element_by_id(fromStationText).send_keys(Keys.ENTER) time.sleep(1) WebDriverWait(browser, 1000).until( EC.presence_of_element_located((By.ID, toStationText)) ) #输入目的地 browser.find_element_by_id(toStationText).click() browser.find_element_by_id(toStationText).send_keys(tostation) browser.find_element_by_id(toStationText).send_keys(Keys.ENTER) time.sleep(5) #将日期的只读属性去掉 js = document.getElementById("train_date").removeAttribute("readonly") browser.execute_script(js) #去掉原本的时间 WebDriverWait(browser, 1000).until( EC.presence_of_element_located((By.ID, train_date)) ) browser.find_element_by_id("train_date").clear() #输入出发时间 browser.find_element_by_id(train_date).send_keys(train_date) # 等待查询按钮是否可用 WebDriverWait(browser, 1000).until( EC.element_to_be_clickable((By.ID, query_ticket)) ) searBtn = browser.find_element_by_id(query_ticket) searBtn.click() print(点击按钮)2.购买火车票 在这个函数中需要注意的是最好把最后一步注释掉 browser.find_element_by_id(‘qr_submit_id’).click() 因为一天只能取消3次订单。
def buy_ticket(fromstation,买火tostation,train_date,train_number,passenger): #查询火车票 search_railway_ticket(fromstation,tostation,train_date) time.sleep(5) #获取每一个车次的信息 tr_list = browser.find_elements_by_xpath(.//tbody[@id="queryLeftTable"]/tr[not(@datatran)]) for tr in tr_list: #获取车次号 number = tr.find_element_by_class_name(number).text if number in train_number: #获取是否还有票 left_ticket = tr.find_element_by_xpath(./td[4]).text if left_ticket ==有or left_ticket.isdigit: print(f{ number}还有票) #点击预订 orderBtn = tr.find_element_by_class_name(btn72) orderBtn.click() time.sleep(5) #获取12306中乘客的信息 passenger_list = browser.find_elements_by_xpath(//*[@id="normal_passenger_id"]/li) for li in passenger_list: name = li.find_element_by_xpath(./label).text print(name) #配对12306人名 if name == passenger: li.find_element_by_tag_name(input).click() #提交订单 submit = browser.find_element_by_id(submitOrder_id) submit.click() WebDriverWait(browser, 1000).until( EC.element_to_be_clickable((By.ID, qr_submit_id)) ) #一天只能取消3次 所以最好把最后一步注释了 browser.find_element_by_id(qr_submit_id).click() print(已经提交订单) break下面是源代码
测试的时候可以把#click_captcha()这个点击验证码的去掉自己手动点击,这样就不用扣超级鹰的车票积分(有钱的高防服务器话当我没说),留下了贫穷的过年泪水。
from selenium import webdriver from selenium.webdriver import Actionchains import time from PIL import Image import requests from hashlib import md5 from selenium.webdriver import ChromeOptions #验证码识别处理 from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class Chaojiying_Client(object): def __init__(self,实现 username, password, soft_id): self.username = username password = password.encode(utf8) self.password = md5(password).hexdigest() self.soft_id = soft_id self.base_params = { user: self.username, pass2: self.password, softid: self.soft_id, } self.headers = { Connection: Keep-Alive, User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0), } def PostPic(self, im, codetype): """ im: 图片字节 codetype: 题目类型 参考 http://www.chaojiying.com/price.html """ params = { codetype: codetype, } params.update(self.base_params) files = { userfile: (ccc.jpg, im)} r = requests.post(http://upload.chaojiying.net/Upload/Processing.php, data=params, files=files, headers=self.headers) return r.json() def ReportError(self, im_id): """ im_id:报错题目的图片ID """ params = { id: im_id, } params.update(self.base_params) r = requests.post(http://upload.chaojiying.net/Upload/ReportError.php, data=params, headers=self.headers) return r.json() def login(username,password): # 填写账号密码 browser.find_element_by_id(J-userName).send_keys(username) browser.find_element_by_id(J-password).send_keys(password) # 获取验证码 get_captcha() # 填写验证码 click_captcha() #点击登录 time.sleep(4) browser.find_element_by_id(J-login).click() time.sleep(4) #滑动验证码 slider() print(成功登陆) time.sleep(5) def slider(): #滑动验证码 WebDriverWait(browser, 1000).until( EC.presence_of_element_located((By.XPATH, //*[@id="nc_1_n1z"])) ) span = browser.find_element_by_xpath(//*[@id="nc_1_n1z"]) # 对div_tag进行滑动操作 action = Actionchains(browser) # 点击长按指定的标签 action.click_and_hold(span).perform() action.drag_and_drop_by_offset(span, 400, 0).perform() def click_captcha(): # 获取验证码需要的为点击位置 chaojiying = Chaojiying_Client(自己的用户名, 密码, 软件id) # 用户中心>>软件ID 生成一个替换 96001 im = open(./captcha.png, rb).read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要// location = chaojiying.PostPic(im, 9004)[pic_str] # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加() print(chaojiying.PostPic(im, 9004)) # 将位置进行分割成 [ [ ], [ ], [ ] ]类型 location_list = [i.split(,) for i in location.split(|)] for l in location_list: x = l[0] y = l[1] Actionchains(browser).move_to_element_with_offset(browser.find_element_by_class_name(login-pwd-code), int(x),int(y)).click().perform() time.sleep(0.5) def get_captcha(): # 获取网页的截图 allscreen = browser.get_screenshot_as_file(allscreen.png) # 获取captcha captcha = browser.find_element_by_class_name(login-pwd-code) # 获取captcha的左上角位置 location = captcha.location # 获取图片大小 size = captcha.size # 裁取captcha rangle = (location[x],location[y],(location[x]+size[width]),(location[y]+size[height])) i = Image.open(./allscreen.png) captcha_img = ./captcha.png frame = i.crop(rangle) frame.save(captcha_img) def buy_ticket(fromstation,tostation,train_date,train_number,passenger): #查询火车票 search_railway_ticket(fromstation,tostation,train_date) time.sleep(5) tr_list = browser.find_elements_by_xpath(.//tbody[@id="queryLeftTable"]/tr[not(@datatran)]) for tr in tr_list: number = tr.find_element_by_class_name(number).text if number in train_number: left_ticket = tr.find_element_by_xpath(./td[4]).text if left_ticket ==有or left_ticket.isdigit: print(f{ number}还有票) orderBtn = tr.find_element_by_class_name(btn72) orderBtn.click() time.sleep(5) passenger_list = browser.find_elements_by_xpath(//*[@id="normal_passenger_id"]/li) for li in passenger_list: name = li.find_element_by_xpath(./label).text if name == passenger: li.find_element_by_tag_name(input).click() submit = browser.find_element_by_id(submitOrder_id) submit.click() WebDriverWait(browser, 1000).until( EC.element_to_be_clickable((By.ID, qr_submit_id)) ) #一天只能取消3次 所以把最后一步注释了 # browser.find_element_by_id(qr_submit_id).click() print(已经提交订单) break def search_railway_ticket(fromstation,tostation,train_date): # 火车票页面查询url search_url = https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc # 转到查询车次页面 browser.get(search_url) time.sleep(2) #输入出发地 WebDriverWait(browser, 1000).until( EC.presence_of_element_located((By.ID, fromStationText)) ) #先点击一下 browser.find_element_by_id(fromStationText).click() browser.find_element_by_id(fromStationText).send_keys(fromstation) browser.find_element_by_id(fromStationText).send_keys(Keys.ENTER) time.sleep(1) WebDriverWait(browser, 1000).until( EC.presence_of_element_located((By.ID, toStationText)) ) #输入目的地 browser.find_element_by_id(toStationText).click() browser.find_element_by_id(toStationText).send_keys(tostation) browser.find_element_by_id(toStationText).send_keys(Keys.ENTER) time.sleep(5) #将日期的只读属性去掉 js = document.getElementById("train_date").removeAttribute("readonly") browser.execute_script(js) #去掉原本的时间 WebDriverWait(browser, 1000).until( EC.presence_of_element_located((By.ID, train_date)) ) browser.find_element_by_id("train_date").clear() #输入出发时间 browser.find_element_by_id(train_date).send_keys(train_date) # 等待查询按钮是否可用 WebDriverWait(browser, 1000).until( EC.element_to_be_clickable((By.ID, query_ticket)) ) searBtn = browser.find_element_by_id(query_ticket) searBtn.click() print(点击按钮) if __name__ == __main__: option = ChromeOptions() # 实例化一个ChromeOptions对象 option.add_experimental_option(excludeSwitches, [enable-automation]) # 以键值对的形式加入参数 option.add_experimental_option(useAutomationExtension, False) browser = webdriver.Chrome(options=option) # 获取响应 browser.get(https://kyfw.12306.cn/otn/resources/login.html) script = Object.defineProperty(navigator,"webdriver",{ get:()=>undefined,}); browser.execute_script(script) browser.maximize_window() time.sleep(1) # 点击账号登陆 browser.find_element_by_class_name(login-hd-account).click() #登陆12306的账号密码 login(用户名,密码) time.sleep(4) #例buy_ticket(南昌,抚州北,2020-12-15,D2241,xx) buy_ticket(起始地,目的地,出发日期,车次,姓名)【编辑推荐】
2019Django全套教程【千锋Python】 Spark大数据处理及机器学习【基于Python的Spark 2.3**版】 Ai工程师-自然语言处理实战(Python版) OpencV Python零基础入门视频教程 Python数据库视频教程之MySQL数据库(七)云南idc服务商很赞哦!(94)
上一篇: 4、选择一个安全的域名注册商进行域名注册
下一篇: 4、说起来容易
相关文章
- 要如何了解反向解析和域名解析?新手该怎么去操作?
- 公司和个人选域名方法一样吗?有什么不同?
- CNAME:对应解析的记录值为域名地址
- 主流搜索引擎显示的相关搜索项越多,越能积极反映该域名的市场价值。同时,被评估域名的搜索引擎显示结果不佳可能是由于以下两个原因:
- 在此期间,他们每天仍在这里卖大米,在理财方面个人感情有待提高。因为现在是收米的最佳时机。
- 注册域名要了解几大点?新手有什么方式注册域名?
- 投资各类域名就像到处打游击战,结果处处失败。因为这样,对任何一个中国域名市场的走势和价格都没有准确的把握,所以最好缩小范围,准确把握战场态势,埋伏。
- 第五步:重复第四步,直到找到正确的纪录。
- 4、注册门槛低
- 其次,一般域名注册有一个获取密码的按钮,域名注册商点击后会向您发送密码。在得到域名注册商发送的密码后,将其传输到域名服务提供商网站,然后输入密码,此时域名呈现申请状态。提交申请后,原注册人通常会向您发送一封电子邮件,询问您是否同意转让。此时,您只需点击同意转移按钮,域名注册商就可以成功转移。