距离春节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人工智能行业,欢迎你来到达内学习。
领取专属 10元无门槛券
私享最新 技术干货