首先引入selenium的库

from PIL import Image#保存付款二维码
from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.options import  Options
import time
# 设置反反selenium, 此方法仅限88及以上版本可用
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_argument("--disable-blink-features=AutomationControlled")
web = Chrome(options=options)
#登陆铁路12306
web.get('https://www.12306.cn/index/')
web.find_element_by_xpath('//*[@id="J-btn-login"]').click()
time.sleep(1)
web.find_element_by_xpath('//*[@id="J-userName"]').send_keys(账号)
web.find_element_by_xpath('//*[@id="J-password"]').send_keys(密码)
time.sleep(1)
web.find_element_by_xpath('//*[@id="J-login"]').click()
time.sleep(3)
#进行滑轮识别
span = web.find_element_by_xpath('//*[@id="nc_1_n1z"]')
ActionChains(web).drag_and_drop_by_offset(span, 300,0).perform()
time.sleep(3)

#滑轮识别不成功可以使用 while循环

while True:try:i = web.find_element_by_xpath('//*[@id="J-slide-passcode"]/div/span').textprint(i)if i == '哎呀,出错了,点击刷新再来一次':web.find_element_by_xpath('//*[@id="nc_1_refresh1"]').click()time.sleep(1)span = web.find_element_by_xpath('//*[@id="nc_1_n1z"]')ActionChains(web).drag_and_drop_by_offset(span, 300, 0).perform()time.sleep(3)else:i =web.find_element_by_xpath('//*[@id="J-slide-passcode"]/div/span').textprint(i)time.sleep(1)span = web.find_element_by_xpath('//*[@id="nc_1_n1z"]')ActionChains(web).drag_and_drop_by_offset(span, 300, 0).perform()time.sleep(3)except:print("登录成功")break

#登陆页面后关闭弹窗

web.find_element_by_xpath('//*[@class="dzp-confirm"]/div/a').click()
#打开首页
web.find_element_by_xpath('//*[@id="J-index"]/a').click()
time.sleep(1)
#进行车票
start = input("您要出发的城市")
end = input("您要到达的城市")
web.find_element_by_xpath('//*[@id="fromStationText"]').click()
time.sleep(0.5)
web.find_element_by_xpath('//*[@id="fromStationText"]').send_keys(start,Keys.ENTER)
web.find_element_by_xpath('//*[@id="toStationText"]').click()
time.sleep(0.5)
web.find_element_by_xpath('//*[@id="toStationText"]').send_keys(end,Keys.ENTER)
time.sleep(1)xs = input('是否为学生票')
if xs == '是':web.find_element_by_xpath('//*[@id="isStudentDan"]').click()time.sleep(0.2)
else:passgt = input('是否是高铁/动车')
if gt == '是':web.find_element_by_xpath('//*[@id="isHighDan"]').click()time.sleep(0.2)

#进入到js url中查看城市编码

response = requests.get('https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9198').content.decode()
# var station_names = '@bjb|北京北|VAP|beijingbei|bjb|0
city_name = [i for i in response.split('\'')[1].split('|')][1::5]  # 北京北
city_eg_name = [i for i in response.split('\'')[1].split('|')][2::5]  # VAP

#进行查询

#查询
web.find_element_by_xpath('//*[@id="search_one"]').click()
time.sleep(1)web.switch_to.window(web.window_handles[-1])
web.find_element_by_xpath('//[@id="qd_closeDefaultWarningWindowDialog_id"]').click()
time.sleep(1)
#保存查询信息
list = []
lc = web.find_element_by_xpath('//*[@id="sear-result"]/p[1]/strong[1]').textcfd = web.find_element_by_xpath('//*[@id="queryLeftTable"]/tr[1]/td/div/div[2]/strong[1]').textddd = web.find_element_by_xpath('//*[@id="queryLeftTable"]/tr[1]/td/div/div[2]/strong[2]').textstart_city_eg_name = city_eg_name[city_name.index(start)]
end_city_eg_name = city_eg_name[city_name.index(end)]
query_url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(day, start_city_eg_name, end_city_eg_name)
# 使用selenium 新开窗口,
# 注意:这里必须加""
js = 'window.open("{}");'.format(query_url)
web.execute_script(js)# 获取当前窗口句柄
handles = web.window_handles
# 切换窗口
web.switch_to.window(handles[-1])
query_res = web.find_element_by_xpath('/html/body/pre').text
#存到数据库
con = mysql.connect(host="localhost",port=3306,user="mmm",passwd="123456",db="12306",charset="utf8mb4")
#创建游标
cursor = con.cursor()
print("连接成功")
# 获取信息
query_json = json.loads(query_res)
ticket_info = query_json['data']['result']
for info in ticket_info:item = {}temp = info.split('|')item['车次信息'] = lcitem['日期'] = dayitem['编号'] = temp[2]item['车次'] = temp[3]item['首发站'] = temp[4]item['终点站'] = temp[5]item['上车站'] = query_json['data']['map'][temp[6]]  # 车站与它对应编号的映射item['下车站'] = query_json['data']['map'][temp[7]]item['出发时间'] = temp[8]item['到达时间'] = temp[9]item['历时'] = temp[10]item['是否可预订'] = temp[11]item['上车站编号'] = temp[16]item['下车站编号'] = temp[17]item['高级软卧'] = temp[21]item['软卧一等卧'] = temp[23]item['软座'] = temp[24]item['无座'] = temp[26]item['硬卧二等卧'] = temp[28]item['硬座'] = temp[29]item['二等座'] = temp[30]item['一等座'] = temp[31]item['商务座特等座'] = temp[32]item['动卧'] = temp[33]item['其他'] = '--'print(item)list.append(item)ls = [(k, item[k]) for k in item if item[k] is not None]sql1 = 'INSERT INTO tielu (' + ','.join(i[0] for i in ls) + \') VALUES (' + ','.join('%r' % i[1] for i in ls) + ');'cursor.execute(sql1)# 提交数据存入库中con.commit()time.sleep(0.2)# 关闭游标和连接
cursor.close()
con.close()

#最后在存到txt文件中

with open('12306.txt','w',encoding='utf-8')  as f:for i in list:#print(i)f.write('\n')for key, value in i.items():#print(key, value)f.write(key+str(value)+'|')

selenium自动化购买火车票+存储数据库相关推荐

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

    python使用selenium模块实现火车票的自动购买 python使用selenium模块实现火车票的自动购买 实现功能描述 直接撸代码 总结 实现功能描述 程序运行后会打开一个浏览器界面定义其尺 ...

  2. Python selenium实现全自动购买火车票

    这个是实现结果,因为一天只能取消三次,所以最后一步点击确认被我注释了 1.首先实现使用selenium登陆12306 关于使用selenium实现12306登陆可以看我的另一篇文章 这里实现了使用se ...

  3. python+selenium自动化软件测试

    1.1 环境搭建 1.1.1 selenium简介 Selenium 是用于测试 Web 应用程序用户界面 (UI) 的常用框架.它是一款用于运行端到端功能测试的超强工具.您可以使用多个编程语言编写测 ...

  4. java selenium自动化项目实战-入门(1)

    selenium java selenium自动化项目实战 1.[报错]org.openqa.selenium.ElementClickInterceptedException: element cl ...

  5. Java——Demo使用GUI并连接数据库实现购买火车票<MySQL>

    文章目录 绪: 成品样例 项目要求 项目分析 1. MySQL数据库 2. GUI各个窗口的功能 代码实现 JavaBean类 1.[tickets.java] 2.[person.java] 3.[ ...

  6. 功能测试——Selenium自动化功能测试

    实验目的 (1)学习使用了解Selenium自动化功能测试工具,了解Selenium测试工具的测试模式和过程: (2)掌握使用Selenium录制测试脚本.执行并分析测试脚本. 实验设备 主流PC机一 ...

  7. web python selenium自动化面试题_干货分享 | Selenium 自动化测试相关的面试题

    网上收集到的一些有关Selenium自动化相关的面试,给出的答案仅供参考. 1.Selenium中用什么函数判断元素是否存在? isElementPresent 2.Selenium中hidden或者 ...

  8. selenium自动化案例(一)B站专栏爬虫

    文章目录 写在前面 案例分析 代码实现 写在前面 前几天学习了selenium自动化以及CSS.Xpath元素定位,想着找个网站练练手,不用登录的B站就是个不错的选择,下面以B站的校园学习专栏为例进行 ...

  9. Python实现全自动购买火车票!抢票回家过年咯

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料以及群 ...

  10. Selenium自动化|爬取公众号全部文章,就是这么简单

    大家好,今天我们来讲点Selenium自动化,你是否有特别喜欢的公众号?你有思考过如何将一个公众号历史文章全部文章爬下来学习吗?现在我们以早起Python为例,使用Selenium来实现 下面就来详细 ...

最新文章

  1. 【哈渡谱】带你玩转Hadoop之《CentOS虚拟机安装篇》
  2. java字符串转换成日期型对象
  3. phpstorm运行java项目_phpstorm的提速设置
  4. 《系统集成项目管理工程师》必背100个知识点-45质量管理
  5. 谱聚类方法-MATLAB
  6. css3 media query orientation,CSS3之media query
  7. Cobbler部署之FAQ处理
  8. [C#.NET 拾遗补漏]12:死锁和活锁的发生及避免
  9. 前端学习(1303):复制文件夹
  10. 云端服务器怎么维护,云端服务器怎么维护
  11. 今日力推: Android 厨客APP / Android 趣刻App
  12. cmd命令将web项目打成jar包_首发!JDK14之jpackage命令尝鲜
  13. 通过哈希MD5实现加密(python3.X)
  14. [Laravel] 如何使用PHP实现前端分页
  15. [树形dp] Jzoj P1162 贪吃的九头龙
  16. cocos creater 使用.max文件/.max文件转换为.fbx文件
  17. scala2.11.8安装
  18. AT32F415 AT32F421 ERTC 时间戳的使用
  19. 一个小屁孩对父母说的经典话
  20. Day 18-Vue3 技术_新的组件

热门文章

  1. 生物群落多样性——β多样性
  2. python流程图-python如何画流程图
  3. matlab导入txt数据画图
  4. C++-类的六个默认成员函数及其性质
  5. excel合并两列内容_excel新手问题:怎么把两列数据合并到一起?用这个公式
  6. 实验十OSPF路由聚合
  7. 拉卡拉服务器响应超时,拉卡拉传统POS机11个常见问题及解决方法
  8. 华为机试HJ70:矩阵乘法计算量估算
  9. [总结]国家电网计算机类备考总结
  10. 如何去除Excel图表网格线?