Python实现12306自动抢火车票功能_第1页
Python实现12306自动抢火车票功能_第2页
Python实现12306自动抢火车票功能_第3页
Python实现12306自动抢火车票功能_第4页
Python实现12306自动抢火车票功能_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Python实现12306自动抢火车票功能目录一、效果展示二、代码详解1导入库2确定好购票基本信息3登录123064模拟滑动滑块5处理疫情特殊要求6点击购票并填写出发地、目的地、出发时间7锁定车票大家有没有这种感觉,一到国庆、春节这种长假,抢火车票就非常困难?各大互联网公司都推出抢票服务,只要加钱给服务费就可以增加抢到票的几率。有些火车票代售网点和一些加速买票软件,说你只要给100元服务费就可以优先帮忙抢到票。本文和你一起探索抢票软件背后的原理。

一、效果展示

在正式进入代码讲解之前,先来看下本文的实现效果。

如果不是为了演示效果,直接在最后确定阶段加一个延时点击确定,应该不到45秒可以锁定一张票,只要在30分钟之内付款即可。

二、代码详解

本小节会详细解锁抢票软件是如何模拟登录网站,进行自动买票的。为了更清晰地给大家展示,部分代码没有写成函数,直接裸代码运行,让需要买票的朋友可以自己应用软件进行购票。

1导入库

首先导入本文需要加载的库,如果你有些库还没有安装,导致运行代码时报错,可以在AnacondaPrompt中用pip方法安装。

importjson

importtime

fromcaptchaimport*

fromseleniumimportwebdriver

frommon.byimportBy

fromselenium.webdriver.supportimportwait

frommon.keysimportKeys

frommon.exceptionsimportNoSuchElementException

frommon.action_chainsimportActionChains

fromselenium.webdriver.supportimportexpected_conditionsasEC

2确定好购票基本信息

导入库后,在python代码中填写你购票的基本信息。

purpose='ADULT'#购买成人票,如果是学生票,需调整代码

names=['谢朝阳']#填写购票人姓名

date='2025-09-21'#填写购票日期

start_station='深圳'#购票出发站

end_station='长沙南'#购票目的站

password='11234567xyz'#登录12306的秘密

username='xiezhaoyang122700'#登录12306的账号

trains=['G1004','G80','G6028','G6182','G6016']#你想买的班次

#填写基本信息

本文预订的是2025年9月21日从深圳到长沙南的高铁票,你可以根据自己的实际需要进行调整。由于有些班次的时间过早或过晚,买了也很不方便,所以可以在trains中挑选出你满意的班次进行购票。在这里需要提醒大家,我之前在尝试代码时碰到的坑,那就是时间中如果有个位数要在前面填0。比如2025年9月2日,你在填写购票日期date时要写成'2025-09-02',否则在运行代码时日期总是填不进去。

3登录12306

确定好购票的基本信息后,就可以应用python模拟登录12306了,代码如下:

options=webdriver.ChromeOptions()

options.add_argument("--disable-blink-features=AutomationControlled")

browser=webdriver.Chrome(options=options)

browser.maximize_window()

login_url='/otn/resources/login.html'

#ticket_url='/otn/leftTicket/init'

browser.get(login_url)

time.sleep(0.5)

wait.WebDriverWait(browser,5).until(EC.element_to_be_clickable((By.CLASS_NAME,'login-hd-account'))).click()

input_name=browser.find_element_by_id('J-userName')

input_pd=browser.find_element_by_id('J-password')

input_name.send_keys(username)

input_pd.send_keys(password)

login=browser.find_element_by_id('J-login')

login.click()

#登录12306

整体思路是: 

1.应用python模拟调用google浏览器;

2.输入12306网址;

3.等网页加载完全后点击账户密码登录;

4.找到账号密码的id,把账户密码信息填充进去;

5.找到登录id,模拟点击登录按钮。

在这一小节中要注意两个点。

一、要在python安装目录中放和google版本匹配的chromedriver,供python调用。

二、要学会找填写账户密码信息的id。

首先,在google浏览器中输入12306登录网址:

/otn/resources/login.html

接着点击账户密码登录,会出现如下界面:

然后点击红框中的三个点,找到更多工具,点击开发者工具,会出现如下界面:

点击红框中的箭头,把鼠标移动到账户框上去,就会出现如下界面:

右边变灰的框里就会出现对应的id,点击账号框,再把鼠标移动到右边变灰的字符上去,点击右键,会出现copyelement的选项,复制下来即可。

inputtype="text"id="J-userName"placeholder="用户名/邮箱/手机号"aria-label="请输入用户名/邮箱/手机号"title="请输入用户名/邮箱/手机号"

发现了吗?源代码input_name中要填写的browser.find_element_by_id('J-userName')内容,即为id="J-userName"中的信息。

4模拟滑动滑块

输入完用户名和密码,点击立即登录后,会出现如下滑块验证要求。

运行如下代码即可拖动滑块进行验证。

browser.implicitly_wait(5)

print('=====开始处理滑动验证码=====')

track=[300,400,500]

foriintrack:

try:

btn=browser.find_element_by_xpath('//*[@id="nc_1__scale_text"]/span')

ActionChains(browser).drag_and_drop_by_offset(btn,i,0).perform()

except:

time.sleep(2)

#拉动滑块验证

其中,browser.implicitly_wait(5)表示隐性等待5秒,track中放的是滑块拉动的距离。

5处理疫情特殊要求

完成滑块验证要求后,会出现如下疫情特殊要求提示:

用如下代码点击确认即可。

browser.implicitly_wait(5)

browser.find_element_by_xpath('/html/body/div[5]/div[2]/div[3]/a').click()

time.sleep(2)

#疫情特殊要求

browser.find_element_by_xpath和id的区别是,在右键复制时要copyXPath或copyfullXPath。

6点击购票并填写出发地、目的地、出发时间

接下来是选择买票,并将出发地、目的地、出发时间等信息填写进去。

browser.find_element_by_xpath('//*[@id="J-chepiao"]/a').click()

browser.find_element_by_xpath('//*[@id="megamenu-3"]/div[1]/ul/li[1]/a').click()

browser.find_element_by_xpath('//*[@id="qd_closeDefaultWarningWindowDialog_id"]').click()

#选择买票

definput_info():

print('=====开始买票=====')

from_station=browser.find_element_by_xpath('//*[@id="fromStationText"]')

from_station.send_keys(Keys.ENTER)

from_station.send_keys(Keys.CONTROL,'a')

from_station.send_keys(start_station,Keys.ENTER)

browser.implicitly_wait(5)

to_station=browser.find_element_by_xpath('//*[@id="toStationText"]')

to_station.send_keys(Keys.ENTER)

to_station.send_keys(Keys.CONTROL,'a')

to_station.send_keys(end_station,Keys.ENTER)

browser.implicitly_wait(5)

start_date=browser.find_element_by_xpath('//*[@id="train_date"]')

start_date.send_keys(Keys.ENTER)

start_date.send_keys(Keys.CONTROL,'a')

start_date.send_keys(Keys.CONTROL,'x')

start_date.send_keys(date,Keys.ENTER)

browser.implicitly_wait(5)

wait.WebDriverWait(browser,3).until(EC.element_to_be_clickable((By.ID,'query_ticket'))).click()

input_info()

input_info()

#将出发地、目的地、出发日期填进去

得到结果如下:

这里需要注意的是我调用了两遍input_info函数,因为12306可能采取了一些反爬措施,一遍输入进去后查不出东西,显示为灰色。

7锁定车票

最后是依次查找trains中的车次是否有票,有的话点击购买锁定车票。

trList=browser.find_elements_by_xpath(".//tbody[@id='queryLeftTable']/tr[not(@datatran)]")

fortrintrList:

trainNum=tr.find_element_by_class_name("number").text

iftrainNumintrains:

leftTicket=tr.find_element_by_xpath(".//td[4]").text

print('leftTicket',leftTicket)

ifleftTicket=='有'orleftTicket.isdigit():

orderBtn=tr.find_element_by_class_name("btn72")

orderBtn.click()

browser.implicitly_wait(5)

passengerLabels=browser.find_elements_by_xpath(".//ul[@id='normal_passenger_id']/li/label")

forpassengerLabelinpassengerLabels:

name=passengerLabel.text

ifnameinnames:

passengerLabel.click()

browser.implicitly_wait(20)

#获取提交按钮

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论