python使用selenium模块实现火车票的自动购买

python使用selenium模块实现火车票的自动购买

  • 实现功能描述
    • 直接撸代码
    • 总结

实现功能描述

程序运行后会打开一个浏览器界面定义其尺寸>打开预先设置好的url地址>点击账号密码登录>自动填入账号密码>识别图片验证码并点击>登陆>选择购买单程票>选择类型、车次>预订>大功告成!!!

系统:win10 64位
解释器:python3.8 64位
IDE:pycharm
浏览器:Chrome

直接撸代码

  1. 导入程序所需要的模块
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
  1. 保存验证码图片到本地 下一步会对图片进行解析
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. 精髓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的自动登录了,下面开始进行买票环节

  1. 定义买票函数 下面代码实现了 输入始发站(上海)输入终点站(苏州),选择车型为所有车型(高铁,动车,绿皮车之类的都选了),时间为浏览器时间(也就是当天),车次我是随意选了一个车次。然后点击预订>确认购买>程序结束(确认按钮被我干掉了,不然就真的下单了。。。)
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模块实现火车票的自动购买相关推荐

  1. python中selenium模块驱动谷歌详解

    python中selenium模块驱动谷歌详解 Selenium的介绍.配置和调用 Selenium(浏览器自动化测试框架) 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中 ...

  2. 利用python的selenium模块向Plant-mPLoc提交数据

    利用python的selenium模块向Plant-mPLoc提交数据 流程一般步骤 1.对数据的预处理 2. 环境的配置 3.代码分析及流程思想 回顾和展望 流程一般步骤   首先我们对得到的序列预 ...

  3. Python学习--Selenium模块

    1. Python学习--Selenium模块介绍(1) 2.Python学习--Selenium模块学习(2) 其他: 1. Python学习--打码平台 转载于:https://www.cnblo ...

  4. Python用 selenium 模块控制Firefox浏览器

    Python用 selenium 模块控制Firefox浏览器 需要的东西: Firefox浏览器下载地址: http://getfirefox.com/ selenium包: https://pyp ...

  5. python的selenium模块_Python中Selenium模块的使用

    目录 Selenium的介绍.配置和调用 Selenium(浏览器自动化测试框架) 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包 ...

  6. python的selenium模块博客园_selenium 模块的使用

    一.为什么会用 selenium 模块: 运用过程中遇到错误: Traceback (most recent call last): File "C:\Users\Administrator ...

  7. python爬虫 selenium模块的学习

    爬取流程 导入selenium模块中的webdriver包 实例化webdriver 准备url 打开网页 定位标签元素 执行动作 获取需要的信息 关闭浏览器 新实例 # 新版本 from selen ...

  8. Python使用selenium模块模拟登录12306

    selenium模块概述 selenium模块是基于浏览器自动化的一个模块.换句话说使用selenium可以让浏览器根据自己写的代码自动运行. 相应的语法 ·编写基于浏览器自动化的操作代码 · 发起请 ...

  9. Python:selenium模块基本使用

    1.什么是selenium模块? - 基于浏览器自动化的一个模块.(通过编写代码,让浏览器完成操作自动化的动作) selenium模块可以帮助我们便捷获取动态加载的数据2.selenium使用流程: ...

最新文章

  1. html表格筛选排序规则,excel表的排序功能你真的会吗?带你重新认识真正的排序功能...
  2. iOS 自动引用计数和内存泄露
  3. apple mac 下使用机械键盘的办法,键盘映射工具软件,apple mac Mechanical keyboard
  4. 链表(单链表、双链表、内核链表)
  5. display:none和visibility:hidden区别
  6. 【redis】 windows 32x 64x
  7. python颜色代码表_[matplotlib] 颜色设置及Matplotlib颜色对照表
  8. 智能家居系统的总线系统和无线系统的具体介绍
  9. 新手小白零基础,该怎样学习编程呢?
  10. 用计算机算出女儿身高,孩子身高预测计算器准吗
  11. Personal deposit calculator(个人存款计算器)C#实现
  12. usb右下角有显示,计算机没显示,U盘显示在计算机的右下角,但无法打开
  13. 学习记录:Monkey测试
  14. android 远程调试工具,【教程】搭配Android studio,如何实现app远程真机debug...
  15. 爬取全国各地区汽车销量情况并用中国地图可视化展示
  16. 知到网课美的必修课考试试题|真题题库(含答案)
  17. 【JavaScript】input提示弹出框
  18. 什么是数字化存在?数字化转型要先从数字化存在开始
  19. 后缀是php,php是什么文件_文件后缀php是什么意思
  20. Android性能优化之网络优化

热门文章

  1. 淘宝聚划算怎么做?大神导航,一个神奇的网站,从此开启大神之路!
  2. 项目风险的主要来源有哪些?应如何防范
  3. 研究生平均年薪26.5万!本科生20万!南京大学软件学院19年就这么高!
  4. 图像分类的技能包及每一项的实验验证
  5. PCB入门使用技巧——个人笔记
  6. AI学习_线程_python爬虫_numpy
  7. java如何绑核_pod绑核规则
  8. 用matlab从rosbag文件里读取rbg图片和depth图片
  9. Google Earth Engine——世界已公开的人口数据集
  10. 蓝牙核心协议学习 -- 基带协议(Baseband)