首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

你抢到火车票了吗?

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

票都去了哪里?

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

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

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

所需知识点

·selenium 自动化测试工具使用

·打码平台

selenium

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

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

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

运行流程

环境搭建与安装

安装 SELENIUM 模块:

PIP INSTALL SELENIUM

下载对应的浏览器驱动:

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

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

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

打码平台

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

流程

优点

·价格便宜

·使用简单

·识别率高

基本使用

后台创建软件

在线测试:

选择对应识别类型:

下载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案例实现

分析购票流程

实现步骤

·访问列表页

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

·点击账号登录

·输入用户名和密码

·截图获取验证码图片

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

·定义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)

截取验证码图片

·需要安装图片操作库

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人工智能行业,欢迎你来到达内学习。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190128B0GBV400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券