吴京也难抢到票,python大牛教你史上最简单的实现12306抢票 !

距离春节7天,距离上班14天

你抢到火车票了吗?

吴京也难抢到票,python大牛教你史上最简单的实现12306抢票 !_第1张图片
image

每逢佳节抢票难,刷爆了抢票软件,透支了好友助力功能,甚至花钱开通了VIP包,可回家的票还是与自己一面之缘,只能看看却抢不到手!

学习Python中有不明白推荐加入交流群

            号:864573496
            群里有志同道合的小伙伴,互帮互助,
            群里有不错的视频学习教程和PDF!

票都去了哪里?

这种状况不仅发生在我们身上,明星也是一样买不到票的!23日吴京发微博,称只要能回家,坐哪都成。故带了个小板凳坐在火车过道。

吴京也难抢到票,python大牛教你史上最简单的实现12306抢票 !_第2张图片
image

可对于连站票都抢不到的,又或者路途遥远的人,该怎么办呢?

当你还在忧伤这些问题的时候,程序员们已经开始通过 Python 程序控制浏览器自动抢票了。号称是史上最简单的抢票方式哦,领超其他抢票软件。前方高能,请拿小本本记下来,操作起来!

image

所需知识点

· selenium 自动化测试工具使用

**· **打码平台

**selenium **

SELENIUM是一个WEB的自动化测试工具,最初是为网站自动化测试而开发的,SELENIUM可以直接运行在浏览器上,它支持所有主流的浏览器(包括PHANTOMJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏。

程序脚本可以通过 SELENIUM API 控制浏览器。

官方地址:HTTPS://WWW.SELENIUMHQ.ORG/

运行流程

吴京也难抢到票,python大牛教你史上最简单的实现12306抢票 !_第3张图片
image

环境搭建与安装

安装 SELENIUM 模块:

PIP INSTALL SELENIUM

下载对应的浏览器驱动:

**· **chrome 驱动下载地址:https://sites.google.com/a/chromium.org/chromedriver/

**· **国内淘宝镜像:http://npm.taobao.org/mirrors/chromedriver/

注:必须在下对应的 chrome 版本对应的驱动

打码平台

可以通过第三方平台进行智能识别或者人工识别图片。

流程

吴京也难抢到票,python大牛教你史上最简单的实现12306抢票 !_第4张图片
image

优点

· 价格便宜

· 使用简单

· 识别率高

平台介绍:云打码 http://www.yundama.com/

基本使用

后台创建软件

吴京也难抢到票,python大牛教你史上最简单的实现12306抢票 !_第5张图片
image

在线测试:

http://www.yundama.com/demo.html

选择对应识别类型:

http://www.yundama.com/price.html

下载SDK:

http://www.yundama.com/apidoc/YDM_SDK.html

识别12306登录验证码

1 #!/USR/BIN/PYTHON3
2 # -- CODING: UTF-8 --
3 FROM YDMHTTP IMPORT DECODE
4 PRINT(DECODE('./TEST_PICS/TEST.JPG',CODETYPE=6701))

12306案例实现****分析购票流程

image

实现步骤

· 访问列表页

**· **通过时间判定选择点击预订

**· **点击账号登录

**· **输入用户名和密码

**· **截图获取验证码图片

**· **发送打码平台获取识别数字

**· **定义8个点击坐标

**· **模拟点击坐标

**· **点击登录

**· **点击选择人物

**· **点击提交订单

**· **点击确认订单

代码实现****访问列表页

1 # 访问列表页
2 FS = "上海,SHH"
3 TS = "北京,BJP"
4 DATE = "2019-01-11"
5 URL = "HTTPS://KYFW.12306.CN/OTN/LEFTTICKET/INIT?LINKTYPEID=DC&FS={}&TS={}&DATE={}&FLAG=N,N,Y"
6 BROWSER.GET(URL.FORMAT(FS,TS,DATE))

通过时间判定选择点击预订

1 # 获取 TR 列表
2 TR_LIST = WAIT.UNTIL(EC.VISIBILITY_OF_ALL_ELEMENTS_LOCATED((BY.CLASS_NAME,'BGC')))
3 FOR TR IN TR_LIST:
4 START_TIME = TR.FIND_ELEMENT_BY_CLASS_NAME('START-T').TEXT
5 # 内部可以判定出发时间
6 TR.FIND_ELEMENT_BY_CLASS_NAME('BTN72').CLICK()
7 BREAK

点击账号

1 ACCOUNT_LOGIN_ELEMENT = WAIT.UNTIL(EC.PRESENCE_OF_ELEMENT_LOCATED((BY.LINK_TEXT,'账号登录')))
2 ACCOUNT_LOGIN_ELEMENT.CLICK()

输入用户名和密码

1 BROWSER.FIND_ELEMENT_BY_ID('J-USERNAME').SEND_KEYS(USERNAME)
2 BROWSER.FIND_ELEMENT_BY_ID('J-PASSWORD').SEND_KEYS(PWD)

截取验证码图片

**· **需要安装图片操作库 PIP INSTALL PILLOW

**· **在MAC平台下如果是RETINA屏幕,屏幕上的一个点相当于2个像素

important;">

1 scale = 2

2 login_img_element = wait.until(EC.visibility_of_element_located((By.ID,'J-loginImg')))
3 full_img_data = browser.get_screenshot_as_png()
4 full_img = Image.open(BytesIO(full_img_data))
5 x1 = login_img_element.location["x"] * 2
6 y1 = login_img_element.location["y"] * 2
7 x2 = x1 + login_img_element.size["width"] * 2
8 y2 = y1 + login_img_element.size["height"] * 2
9 cut_info = (x1,y1,x2,y2)
10 cut_img = full_img.crop(cut_info)
11 cut_img.save('cut_img.png')

发送打码平台获取数字

RESULT = DECODE('CUT_IMG.PNG',6701)

定义8个点击坐标点

1 POSITIONS = [
2 (80,140),
3 (230,140),
4 (380,140),
5 (530,140),
6 (80, 280),
7 (230, 280),
8 (380, 280),
9 (530, 280)
10 ]

模拟点击坐标

1 FOR NUM IN RESULT:
2 POSITION = POSITIONS[INT(NUM) - 1]
3 # 模拟点击
4 ACTIONCHAINS(BROWSER).MOVE_TO_ELEMENT_WITH_OFFSET(LOGIN_IMG_ELEMENT,POSITION[0] / SCALE,POSITION[1] / SCALE).CLICK().PERFORM()
点击登录

BROWSER.FIND_ELEMENT_BY_LINK_TEXT('立即登录').CLICK()

点击选择人物

WAIT.UNTIL(EC.VISIBILITY_OF_ELEMENT_LOCATED((BY.ID,'NORMALPASSENGER_0'))).CLICK()

点击提交订单

BROWSER.FIND_ELEMENT_BY_ID('SUBMITORDER_ID').CLICK()

点击确认订单

WAIT.UNTIL(EC.VISIBILITY_OF_ELEMENT_LOCATED((BY.ID,'QR_SUBMIT_ID'))).CLICK()

吴京也难抢到票,python大牛教你史上最简单的实现12306抢票 !_第6张图片
image

你的小本本记好了吗?快快操作一下……

希望大家都能够在春节前抢到票,回家欣喜的过年,也能够抢到回城的票,开心的上班哦~

吴京也难抢到票,python大牛教你史上最简单的实现12306抢票 !_第7张图片
image

你可能感兴趣的:(吴京也难抢到票,python大牛教你史上最简单的实现12306抢票 !)