python使用selenium模块实现火车票的自动购买
python使用selenium模块实现火车票的自动购买
python使用selenium模块实现火车票的自动购买
- 实现功能描述
- 直接撸代码
- 总结
实现功能描述
程序运行后会打开一个浏览器界面定义其尺寸>打开预先设置好的url地址>点击账号密码登录>自动填入账号密码>识别图片验证码并点击>登陆>选择购买单程票>选择类型、车次>预订>大功告成!!!
系统:win10 64位
解释器:python3.8 64位
IDE:pycharm
浏览器:Chrome
直接撸代码
- 导入程序所需要的模块 ;
import base64
import requests
import re
import time
from selenium import webdriver # 导入浏览器驱动,这里需要你预先安装谷歌浏览器的驱动(Chromedriver,网上可以搜到,安装和自己浏览器版本一样就好,传送门(https://npm.taobao.org/mirrors/chromedriver).不会安装或者找不到可以给我留言),不然没办法工作
from selenium.webdriver.common.keys import Keys # 模拟点击
from selenium.webdriver import ActionChains # 动作类对象
2.登陆函数
def login():driver.get('https://kyfw.12306.cn/otn/resources/login.html') # 12306登陆界面urldriver.set_window_size(1200, 900) # 设置浏览器界面尺寸driver.implicitly_wait(10) # 隐式等待driver.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a').click() # 选择账号登录driver.find_element_by_xpath('//*[@id="J-userName"]').send_keys('填入用户名') # 使用xpath进行匹配,调用send_keys来实现自动填写内容driver.find_element_by_xpath('//*[@id="J-password"]').send_keys('填入密码')image_url = driver.find_element_by_xpath('//*[@id="J-loginImg"]').get_attribute('src') # 获取图片图片验证码url# print(image_url)return image_url
- 保存验证码图片到本地 下一步会对图片进行解析
def get_image(image_url):"""验证码图片保存"""bass64_url = image_url.split(',')[-1] # 匹配到图片验证的数据进行分割提取img_data = base64.b64decode(bass64_url) # 因为12306把验证码本来的二进制数据转换成了base64形式的字符串,所以这里我们要处理一下转回我们想要的二进制数据with open('yzm.jpg', mode='wb') as f :f.write(img_data)
- 精髓1 验证码的识别
def yzm_result():"""识别验证码"""image_data = open('yzm.jpg', mode='rb')files = {"pic_xxfile": image_data}res = requests.post(url='http://littlebigluo.qicp.net:47720/', files=files) # 此处用的url为一个第三方链接,专门识别图片验证码,会把你上传的图片进行解析,输出结果图片所在位置result = [] # 这个空列表用来存储下面的结果for i in re.findall('<B>(.*?)</B>', res.text)[0].split(' '): # 把结果遍历出来,关于括号里的只是一些正则表达是的语法result.append(int(i)) # 因为遍历出来的结果是字符串,我们在这里将它转换成整形,方便后面操作# print(result)image_data.close()return result
5. 精髓2 实现模拟鼠标点击验证码
def click_code(result):"""模拟鼠标点击验证码进行登录"""img_element = driver.find_element_by_xpath('//*[@id="J-loginImg"]') # 先找到要操作的标签action = ActionChains(driver) # 创建一个动作链对象for i in result: # 把之前第三方得到的结果遍历一下MAP = [[-105, -20], [-35, -20], [40, -20], [110, -20], [-105, 50], [-35, 50], [40, 50], [110, 50]] # 把图片分成八份,确定好每一个小图像对应的位置(下面图片会有展示)action.move_to_element(img_element).move_by_offset(MAP[i-1][0], MAP[i-1][1]).click() # 结合遍历的结果,给鼠标一个x和y的坐标,然后进行点击,要注意的是使用第三方得到的结果是从数字一开始,而我们上一步建立的坐标系是从0开始。time.sleep(1) # 模拟人点击时的思考时间action.perform() # 执行动作链time.sleep(1)driver.find_element_by_xpath('//*[@id="J-login"]').click() # 点击登录按钮driver.implicitly_wait(10)
恭喜你现在已经可以实现12306的自动登录了,下面开始进行买票环节
- 定义买票函数 下面代码实现了 输入始发站(上海)输入终点站(苏州),选择车型为所有车型(高铁,动车,绿皮车之类的都选了),时间为浏览器时间(也就是当天),车次我是随意选了一个车次。然后点击预订>确认购买>程序结束(确认按钮被我干掉了,不然就真的下单了。。。)
def buy():"""选型、买票"""driver.get('https://kyfw.12306.cn/otn/leftTicket/init') # 因为你已经成功登陆了,所以直接打开买票的url他是会默认你登陆的,所以不用纠结为什么又重新打开了了网页driver.set_window_size(1200, 900)driver.implicitly_wait(10) # 隐式等待# driver.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a').click() # 账号登录driver.find_element_by_xpath('//*[@id="fromStationText"]').click()time.sleep(0.3)driver.find_element_by_xpath('//*[@id="fromStationText"]').send_keys('上海')time.sleep(0.3) driver.find_element_by_xpath('//*[@id="fromStationText"]').send_keys(Keys.ENTER)# 以上是选择出发站,要注意的是最后面我加了send_keys(Keys.ENTER)模拟键盘回车,这里和之前上号密码的不一样,账号密码输入不要回车就可以,不回车里面内容不生效time.sleep(1)driver.find_element_by_xpath('//*[@id="toStationText"]').click()time.sleep(0.5)driver.find_element_by_xpath('//*[@id="toStationText"]').send_keys('苏州')time.sleep(0.5)driver.find_element_by_xpath('//*[@id="toStationText"]').send_keys(Keys.ENTER)# 以上是终点站driver.find_element_by_xpath('//*[@id="train_type_btn_all"]').click() # 选择所有类型的车time.sleep(0.5)driver.find_element_by_xpath('//*[@id="query_ticket"]').click() # 点击查询time.sleep(1)driver.find_element_by_xpath('//*[@id="ticket_55000K842801"]/td[13]/a').click() # 选择了一个车次,点击预订time.sleep(1)driver.find_element_by_xpath('//*[@id="normal_passenger_id"]/li[1]/label').click() # 选择乘车人 点击确定time.sleep(1)driver.find_element_by_xpath('//*[@id="submitOrder_id"]').click()# 里面所有的延时可根据自己的网速来设置,可增可减,或者你可以删掉试试...
总结
这个代码没有多么高大上,只是可以简单的实现买票功能,运行的速度谈不上抢票,还有好多功能需要完善。后续如果继续跟进这个代码的话我会随时更新
python使用selenium模块实现火车票的自动购买相关推荐
- python中selenium模块驱动谷歌详解
python中selenium模块驱动谷歌详解 Selenium的介绍.配置和调用 Selenium(浏览器自动化测试框架) 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中 ...
- 利用python的selenium模块向Plant-mPLoc提交数据
利用python的selenium模块向Plant-mPLoc提交数据 流程一般步骤 1.对数据的预处理 2. 环境的配置 3.代码分析及流程思想 回顾和展望 流程一般步骤 首先我们对得到的序列预 ...
- Python学习--Selenium模块
1. Python学习--Selenium模块介绍(1) 2.Python学习--Selenium模块学习(2) 其他: 1. Python学习--打码平台 转载于:https://www.cnblo ...
- Python用 selenium 模块控制Firefox浏览器
Python用 selenium 模块控制Firefox浏览器 需要的东西: Firefox浏览器下载地址: http://getfirefox.com/ selenium包: https://pyp ...
- python的selenium模块_Python中Selenium模块的使用
目录 Selenium的介绍.配置和调用 Selenium(浏览器自动化测试框架) 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包 ...
- python的selenium模块博客园_selenium 模块的使用
一.为什么会用 selenium 模块: 运用过程中遇到错误: Traceback (most recent call last): File "C:\Users\Administrator ...
- python爬虫 selenium模块的学习
爬取流程 导入selenium模块中的webdriver包 实例化webdriver 准备url 打开网页 定位标签元素 执行动作 获取需要的信息 关闭浏览器 新实例 # 新版本 from selen ...
- Python使用selenium模块模拟登录12306
selenium模块概述 selenium模块是基于浏览器自动化的一个模块.换句话说使用selenium可以让浏览器根据自己写的代码自动运行. 相应的语法 ·编写基于浏览器自动化的操作代码 · 发起请 ...
- Python:selenium模块基本使用
1.什么是selenium模块? - 基于浏览器自动化的一个模块.(通过编写代码,让浏览器完成操作自动化的动作) selenium模块可以帮助我们便捷获取动态加载的数据2.selenium使用流程: ...
最新文章
- html表格筛选排序规则,excel表的排序功能你真的会吗?带你重新认识真正的排序功能...
- iOS 自动引用计数和内存泄露
- apple mac 下使用机械键盘的办法,键盘映射工具软件,apple mac Mechanical keyboard
- 链表(单链表、双链表、内核链表)
- display:none和visibility:hidden区别
- 【redis】 windows 32x 64x
- python颜色代码表_[matplotlib] 颜色设置及Matplotlib颜色对照表
- 智能家居系统的总线系统和无线系统的具体介绍
- 新手小白零基础,该怎样学习编程呢?
- 用计算机算出女儿身高,孩子身高预测计算器准吗
- Personal deposit calculator(个人存款计算器)C#实现
- usb右下角有显示,计算机没显示,U盘显示在计算机的右下角,但无法打开
- 学习记录:Monkey测试
- android 远程调试工具,【教程】搭配Android studio,如何实现app远程真机debug...
- 爬取全国各地区汽车销量情况并用中国地图可视化展示
- 知到网课美的必修课考试试题|真题题库(含答案)
- 【JavaScript】input提示弹出框
- 什么是数字化存在?数字化转型要先从数字化存在开始
- 后缀是php,php是什么文件_文件后缀php是什么意思
- Android性能优化之网络优化