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

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

image

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

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

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

image

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

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

所需知识点

· selenium 自动化测试工具使用

**· **打码平台

**selenium **

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

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

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

运行流程

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

image

环境搭建与安装

安装 SELENIUM 模块:

PIP INSTALL SELENIUM</pre>

下载对应的浏览器驱动:

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

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

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

打码平台

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

流程

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

image

优点

· 价格便宜

· 使用简单

· 识别率高

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

基本使用

后台创建软件

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

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))</pre>

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

吴京也难抢到票,python大牛教你史上最简单的实现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))</pre>

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

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</pre>

点击账号

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

2 ACCOUNT_LOGIN_ELEMENT.CLICK()</pre>

输入用户名和密码

1 BROWSER.FIND_ELEMENT_BY_ID('J-USERNAME').SEND_KEYS(USERNAME)

2 BROWSER.FIND_ELEMENT_BY_ID('J-PASSWORD').SEND_KEYS(PWD)</pre>

截取验证码图片

**· **需要安装图片操作库 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')</pre>

发送打码平台获取数字

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 ]</pre>

模拟点击坐标

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()</pre>

点击选择人物

WAIT.UNTIL(EC.VISIBILITY_OF_ELEMENT_LOCATED((BY.ID,'NORMALPASSENGER_0'))).CLICK()</pre>

点击提交订单

BROWSER.FIND_ELEMENT_BY_ID('SUBMITORDER_ID').CLICK()</pre>

点击确认订单

WAIT.UNTIL(EC.VISIBILITY_OF_ELEMENT_LOCATED((BY.ID,'QR_SUBMIT_ID'))).CLICK()</pre>

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

最后,想学习Python的小伙伴们!

请关注+私信回复:“学习”就可以拿到一份我为大家准备的Python学习资料!

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

pytyhon学习资料

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

python学习资料

相关推荐