python无需验证码免登录12306抢票 --selenium(2)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

@[TOC](python无需验证码免登录12306抢票 --selenium(2))


前言

提示:这里可以添加本文要记录的大概内容:

就在刚刚我抢的票:2025年1月8日 上午9.00多 抢到了哈哈哈哈— 其实还是有用的我是在 8:59:56运行程序的

在这里插入图片描述
在这里插入图片描述

上一篇帖子,我们已经了解了如何用python自动登录12306实现自动抢票,现在我们来一个进阶的版本,实现cookie免登录,这样可绕过验证码实现自动抢票。同时包括环境如何配置,也在这个帖子里面。

上一篇帖子的链接:https://blog.csdn.net/xaing1314/article/details/144868504

配置selenium自动化的帖子链接:https://blog.csdn.net/xaing1314/article/details/144869489?spm=1001.2014.3001.5502

需求:上此的帖子,需要自动登录,并且需要手机验证码,在真实抢票中太过繁琐,所有我自己也在思索,找了帖子和B站,终于实现了用cookie技术自动免登录12306。在今天上午9.00 (2025-01-07)抢票(2025-01-21)成功。

如何使用:1.比如9.00正式抢票,可以在8.53左右二维码扫描登录,当然是要配合下方程序,这样9.00可以正式抢票无需登录,cookie也不会失效。2.直接在8.59.58左右运行此程序,即可。

今日实战:今天运行其实是抢到了,但是他一直在等待,也就是页面一直停在哪里,其实那个时候你可以用手点击操作,因为我们是进来了,不需要去管程序的对错。也就是说,程序帮你操作到哪一步,如果卡住了,直接上手。这也让我有想做一个多线程的想法,将多线程加入这个程序中。

在这里插入图片描述

提示:以下是本篇文章正文内容,下面案例可供参考

一、cookie免登录

1.cookie的讲解: Cookie也被称为小型文本文件,是由服务器发送到用户浏览器并保存在用户计算机或移动设备上的一种数据形式。以下是对Cookie的详细解释:

定义与工作原理定义:Cookie是网站在用户浏览器中创建和存储的小型文本文件,用于辨别用户身份和存储用户相关信息。工作原理:当用户访问某个网站时,服务器会在用户的浏览器中创建一个Cookie,并将其存储在用户的计算机或移动设备上。当用户再次访问该网站时,浏览器会将Cookie发送回服务器,服务器通过读取Cookie中的信息来识别用户身份或获取用户的个性化设置。

2.获取cookie的代码如下: 程序运行后会打开登录界面,然后使用的二维码登录。这样程序可以得到当前的cookie值字段,在cookie失效前无须再进行登录。

<0001>初始化浏览器的函数— browser_initial():

def browser_initial():""""进行浏览器初始化"""# os.chdir('E:\\pythonwork')# 1.将加载项配置到启动浏览器中 打开/创建浏览器对象browser = webdriver.Chrome(service=Service(path))# 2.网址 https://kyfw.12306.cn/otn/resources/login.html -- 登录界面# https://kyfw.12306.cn/otn/leftTicket/init 选票界面可以 判断是否登录log_url = 'https://kyfw.12306.cn/otn/resources/login.html'return log_url, browser

<0002> 获得cookie的函数— get_cookies(browser):

def get_cookies(browser):"""获取cookies保存至本地"""browser.get(log_url)time.sleep(15)  # 进行扫码# selenium_login(browser)# print("登录成功")dictCookies = browser.get_cookies()  # 获取list的cookiesstring_Cookies = json.dumps(dictCookies)  # 转换成字符串保存with open('string_cookies.json', 'w') as f:f.write(string_Cookies)print('cookies保存成功!')if __name__ == "__main__":log_url, browser = browser_initial()browser.get(log_url)# 1.二维码登录 保存 -- cookie -- 用完关掉get_cookies(browser)

运行后就会变成这样,找到二维码,让手机自动登录。
在这里插入图片描述
用手机扫描即可,这个操作是设置了时间time.sleep(15),你也可以在get_cookies(browser)中修改此代码,只有自己扫了登录成功,后续出现的cookie保存成功,才是最新的cookie值。

在这里插入图片描述

二、cookie登录函数与自动化 – 可以实现cookie值的匹配–实现自动登录 – 无须手机验证码

1.login_cookie函数代码

代码如下(示例):

def login_cookie(log_url, browser):"""从本地读取cookies并刷新页面,成为已登录状态"""# browser.get(log_url)with open('string_cookies.json', 'r', encoding='utf8') as f:listCookies = json.loads(f.read())# 往browser里添加cookiesfor cookie in listCookies:browser.add_cookie(cookie)time.sleep(1)# 如果是已登录的界面,免登录应该打开这个界面 https://kyfw.12306.cn/otn/view/index.html# https://www.12306.cn/index/ --12306官网首页browser.get(log_url)return browser

2.selenium_run(driver)函数代码 – 这里是可以到预定,然后抢票成功要10分钟之内自己付款。

def selenium_run(driver):# 11.1 选择出发的城市--点击那个框driver.find_element(by="css selector", value="#fromStationText").click()# 11.2 选择出发的城市--选择城市driver.find_element(by="css selector", value="#fromStationText").send_keys(login["from_city"])# 11.3 选择出发的城市--回车确定driver.find_element(by="css selector", value="#fromStationText").send_keys(Keys.ENTER)# 12.1 选择目的的城市--点击那个框driver.find_element(by="css selector", value="#toStationText").click()# 12.2 选择目的的城市--选择城市driver.find_element(by="css selector", value="#toStationText").send_keys(login['to_city'])# 12.3 选择目的的城市--回车确定driver.find_element(by="css selector", value="#toStationText").send_keys(Keys.ENTER)# 13.1 选择出发的日期--点击那个框driver.find_element(by="css selector", value="#train_date").clear()# 12.2 选择出发的日期--选择城市driver.find_element(by="css selector", value="#train_date").send_keys(login['train_date'])# 12.3 选择出发的日期--回车确定driver.find_element(by="css selector", value="#train_date").send_keys(Keys.ENTER)# # 12.4 点击--显示全部可预订的车次# driver.find_element(by="css selector", value="avail_ticket").click()# 12.5 点击查询driver.implicitly_wait(5)driver.find_element(by="css selector", value="#query_ticket").click()# num = int(input('请输入您想要的车次:'))# 点击预订按钮 -- 选择要预定的是第几躺车 -- 这个代码没有问题# driver.find_element(by="css selector", value='#ticket_65000G279007_01_03 > td.no-br').click()# //div//tbody[@id="queryLeftTable"]/tr[contains(@id,"ticket")]/@id -- 但是selenium的find_elements不可以用@id找到元素。ticket_list = driver.find_elements(by="xpath", value='//div//tbody[@id="queryLeftTable"]/tr[contains(@id,"ticket")]')ticket_num = ticket_list[login['num']].get_attribute("id")ticket_pre = ticket_num + ' > td.no-br'# 12.6 点击想要车次的预定按钮driver.find_element(by="css selector", value=f"#{ticket_pre}").click()# 13.1 勾选想要的乘车人driver.find_element(by="css selector", value='#normalPassenger_0').click()# 13.2 提交订单driver.find_element(by="css selector", value='#submitOrder_id').click()driver.implicitly_wait(5)# 13.3 选择靠窗的1F的位置 #erdeng1 > ul:nth-child(4) > li:nth-child(2) 是在浏览器右键copy selector选择出来的# # 1F是不可以选中的driver.find_element(by="css selector", value='#erdeng1 > ul:nth-child(4) > li:nth-child(2)').click()# 13.4 再次确认提交time.sleep(1)# 如果此处没有响应多点击就好 -- 加上 "try -- except"driver.find_element(by="css selector", value='#qr_submit_id').click()# driver.find_element(by="css selector", value='#qr_submit_id').click()# driver.find_element(by="css selector", value='#qr_submit_id').click()

三、完整的代码

1.代码主体 – 先运行get_cookies(browser),注释掉后面的两句代码,二维码登录以后,再注释掉get_cookies(browser),运行后面两个即可。

if __name__ == "__main__":log_url, browser = browser_initial()browser.get(log_url)# 1.二维码登录 保存 -- cookie -- 用完关掉get_cookies(browser)# 2.自动登录driver = login_cookie(log_url, browser)selenium_run(driver)

2.完整代码

import time
import json
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.keys import Keys
path = r'D:\game\chromedriver.exe'def browser_initial():""""进行浏览器初始化"""# os.chdir('E:\\pythonwork')# 1.将加载项配置到启动浏览器中 打开/创建浏览器对象browser = webdriver.Chrome(service=Service(path))# 2.网址 https://kyfw.12306.cn/otn/resources/login.html -- 登录界面# https://kyfw.12306.cn/otn/leftTicket/init 选票界面可以 判断是否登录log_url = 'https://kyfw.12306.cn/otn/leftTicket/init'return log_url, browserdef get_cookies(browser):"""获取cookies保存至本地"""browser.get(log_url)time.sleep(15)  # 进行扫码# selenium_login(browser)# print("登录成功")dictCookies = browser.get_cookies()  # 获取list的cookiesstring_Cookies = json.dumps(dictCookies)  # 转换成字符串保存with open('string_cookies.json', 'w') as f:f.write(string_Cookies)print('cookies保存成功!')def login_cookie(log_url, browser):"""从本地读取cookies并刷新页面,成为已登录状态"""# 这个是12306的登录界面 https://kyfw.12306.cn/otn/resources/login.html# browser.get(log_url)with open('string_cookies.json', 'r', encoding='utf8') as f:listCookies = json.loads(f.read())# 往browser里添加cookiesfor cookie in listCookies:# cookie_dict = {#     'domain': cookie.get('domain'),#     # "expires": cookie.get('value'),#     'httpOnly': cookie.get('httpOnly'),#     'name': cookie.get('name'),#     'path': cookie.get('path'),#     "sameSite": "Lax",#     'Secure': cookie.get('Secure'),#     'value': cookie.get('value'),# }browser.add_cookie(cookie)# browser.refresh()time.sleep(1)# 如果是已登录的界面,可以免登录直接进 https://kyfw.12306.cn/otn/view/index.html# https://www.12306.cn/index/ --12306官网首页browser.get(log_url)return browserdef selenium_run(driver):# 11.1 选择出发的城市--点击那个框driver.find_element(by="css selector", value="#fromStationText").click()# 11.2 选择出发的城市--选择城市driver.find_element(by="css selector", value="#fromStationText").send_keys(login["from_city"])# 11.3 选择出发的城市--回车确定driver.find_element(by="css selector", value="#fromStationText").send_keys(Keys.ENTER)# 12.1 选择目的的城市--点击那个框driver.find_element(by="css selector", value="#toStationText").click()# 12.2 选择目的的城市--选择城市driver.find_element(by="css selector", value="#toStationText").send_keys(login['to_city'])# 12.3 选择目的的城市--回车确定driver.find_element(by="css selector", value="#toStationText").send_keys(Keys.ENTER)# 13.1 选择出发的日期--点击那个框driver.find_element(by="css selector", value="#train_date").clear()# 12.2 选择出发的日期--选择城市driver.find_element(by="css selector", value="#train_date").send_keys(login['train_date'])# 12.3 选择出发的日期--回车确定driver.find_element(by="css selector", value="#train_date").send_keys(Keys.ENTER)# # 12.4 点击--显示全部可预订的车次# driver.find_element(by="css selector", value="avail_ticket").click()# 12.5 点击查询driver.implicitly_wait(5)driver.find_element(by="css selector", value="#query_ticket").click()# num = int(input('请输入您想要的车次:'))# 点击预订按钮 -- 选择要预定的是第几躺车 -- 这个代码没有问题# driver.find_element(by="css selector", value='#ticket_65000G279007_01_03 > td.no-br').click()# //div//tbody[@id="queryLeftTable"]/tr[contains(@id,"ticket")]/@id -- 但是selenium的find_elements不可以用@id找到元素。ticket_list = driver.find_elements(by="xpath", value='//div//tbody[@id="queryLeftTable"]/tr[contains(@id,"ticket")]')ticket_num = ticket_list[login['num']].get_attribute("id")ticket_pre = ticket_num + ' > td.no-br'# 12.6 点击想要车次的预定按钮driver.find_element(by="css selector", value=f"#{ticket_pre}").click()# 13.1 勾选想要的乘车人driver.find_element(by="css selector", value='#normalPassenger_0').click()# 13.2 提交订单driver.find_element(by="css selector", value='#submitOrder_id').click()driver.implicitly_wait(5)# 13.3 选择靠窗的1F的位置 #erdeng1 > ul:nth-child(4) > li:nth-child(2) 是在浏览器右键copy selector选择出来的# # 1F是不可以选中的driver.find_element(by="css selector", value='#erdeng1 > ul:nth-child(4) > li:nth-child(2)').click()# 13.4 再次确认提交time.sleep(1)# 如果此处没有响应多点击就好 -- 加上 "try -- except"# driver.find_element(by="css selector", value='#qr_submit_id').click()# driver.find_element(by="css selector", value='#qr_submit_id').click()# driver.find_element(by="css selector", value='#qr_submit_id').click()f = open('login.json', encoding='utf-8').read()
login = json.loads(f)if __name__ == "__main__":log_url, browser = browser_initial()browser.get(log_url)# 1.二维码登录 保存 -- cookie -- 用完关掉# get_cookies(browser)# 计算程序运行时间# start = time.perf_counter()# 2.自动登录driver = login_cookie(log_url, browser)# # 如果没有登录那就自动登录 -- 然后获得cookie自动保存# # if browser.find_element(by="css selector", value="#login_user").text == "登录":# # 3.自动买票selenium_run(driver)# end = time.perf_counter()# runTime = end - start# runTime_ms = runTime * 1000# # 输出运行时间# print("运行时间:", runTime, "秒")# print("运行时间:", runTime_ms, "毫秒")

3.login.json – 解释这个文件

在这里插入图片描述

图中字典信息:代表的是地址日期,num代表的是第几躺车,id_card身份证,后4位。这里面有用账户密码登录的信息,虽然这里用不上,但是我们上一个帖子是用这个的,所以我把它写在了一起。

四、总结

1.几个注意:代码中的url最好是用登录成功的页面,而非登录页面。不然会一直显示要登录。


log_url = 'https://kyfw.12306.cn/otn/resources/login.html'
log_url = 'https://kyfw.12306.cn/otn/leftTicket/init'  ##---用这个

2.改进:今天真正的实战我也挺满意的就是想着再改进一下,看看多线程是否可以直接抢到。明天就要真正抢票啦 – 给大家看看今天的战果。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS 盒模型

盒模型 CSS盒模型是网页布局的核心概念之一&#xff0c;它描述了网页元素的物理结构和元素内容与周围元素之间的关系。根据W3C规范&#xff0c;每个HTML元素都被视为一个矩形盒子&#xff0c;这个盒子由以下四个部分组成&#xff1a; 内容区&#xff08;Content area&#xff…

WPF的自定义控件控件学习

引入自定义控件 <controls:Intellibox Style"{StaticResource ListSearch-SearchIntellibox}" Width"95" Margin"0,3" MaxResults"200" …

【含开题报告+文档+PPT+源码】基于springboot的农贸菜市场租位管理系统的设计与实现

开题报告 随着信息技术的快速发展和普及&#xff0c;信息化管理已成为各行业提升运营效率和服质量的重要手段。农贸菜市场作为城市生活的重要组成部分&#xff0c;其管理效率和服务水平直接关系到市民的日常生活体验。传统的农贸菜市场租位管理方式往往存在信息不对称、管理效…

华为路由器、交换机、AC、新版本开局远程登录那些坑(Telnet、SSH/HTTP避坑指南)

关于华为设备远程登录配置开启的通用习惯1、HTTP/HTTPS相关服务 http secure-server enablehttp server enable 2、Telnet服务telnet server enable3、SSH服务stelnet server enablessh user admin authentication-type password 「模拟器、工具合集」复制整段内容 链接&…

【论文阅读-思维链的构造方法02】4.1.2 Automatic Construction-02

提示1&#xff1a;本篇博客中涉及4篇相关论文&#xff0c;预计阅读时间10分钟&#xff0c;望各位友友耐心阅读&#xff5e; 提示2&#xff1a;本篇所有涉及的论文已打包发布&#xff0c;不需要任何积分即可下载&#xff0c;指路 --> 论文集下载地址 大模型技术-思维链CoT …

【GIt原理与使用】Git远程仓库

一、理解分布式版本控制系统 我们目前所说的所有内容&#xff08;工作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#xff0c;都是在本地&#xff01;也就是在你的笔记本或者计算机上。而我们的 Git 其实是分布式版本控制系统&#xff01;什么意思呢&#xff1f…

力扣-数组-88 合并两个有序数组

解析 分别维护指向两个数组的指针&#xff0c;不断往后增加指针即可&#xff0c;主要是边界&#xff0c;然后时间复杂度是。 代码 class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {vector <int> new…

家用万兆网络实践:紧凑型家用服务器静音化改造(二)

大家好&#xff0c;这篇文章我们继续分享家里网络设备的万兆升级和静音改造经验&#xff0c;希望对有类似需求的朋友有所帮助。 写在前面 在上一篇《家用网络升级实践&#xff1a;低成本实现局部万兆&#xff08;一&#xff09;》中&#xff0c;我们留下了一些待解决的问题。…

小程序组件 —— 29 组件案例 - 字体图标的使用

这一节主要是完善公司信息区域&#xff0c;我们需要在文本之前添加一些字体图标&#xff0c;这一节我们学习如何在微信小程序中使用字体图标&#xff1b; 在项目中&#xff0c;我们使用的小图标&#xff0c;一般由公司设计师进行设计&#xff0c;设计好之后上传到阿里巴巴矢量…

RK3562编译Android13 ROOT固件教程,触觉智能开发板演示

本文介绍编译Android13 ROOT权限固件的方法&#xff0c;触觉智能RK3562开发板演示&#xff0c;搭载4核A53处理器&#xff0c;主频高达2.0GHz&#xff1b;内置独立1Tops算力NPU&#xff0c;可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。 关闭seli…

STM32-ADC模数转换

目录 1.0 逐次逼近型ADC 2.0 ADC触发 3.0 ADC时钟 4.0 转换模式 5.0 转换时间 6.0 校准 7.0 硬件电路 8.0 数据手册 9.0 程序实现 9.0.1 时钟初始化 9.0.2 GPIO结构体初始化 9.0.3 ADC结构体初始化 9.0.4 ADC转换 9.0.5 AD初始化 9.0.6 获取ADC值 9.0.7 ADC头文…

数据结构:LinkedList与链表—面试题(三)

目录 1、移除链表元素 2、反转链表 3、链表的中间结点 4、返回倒数第k个结点 5、合并两个有序链表 1、移除链表元素 习题链接https://leetcode.cn/problems/remove-linked-list-elements/description/ 描述&#xff1a;给你一个链表的头节点 head 和一个整数 val &#xff…

使用 SQL 和表格数据进行问答和 RAG(1)—数据库准备

一. 从 .sql/csv/xlsx 文件创建 sqlite 数据库。 要从.sql文件准备 SQL DB&#xff0c;这里会将创建数据库的代码放到了&#xff0c;将文件复制到data/sql目录中&#xff0c;然后在终端中的项目文件夹中执行&#xff1a; pip install sqlite3现在创建一个名为sqldb的数据库&a…

案例研究:UML用例图中的结账系统

在软件工程和系统分析中&#xff0c;统一建模语言&#xff08;UML&#xff09;用例图是一种强有力的工具&#xff0c;用于描述系统与其用户之间的交互。本文将通过一个具体的案例研究&#xff0c;详细解释UML用例图的关键概念&#xff0c;并说明其在设计结账系统中的应用。 用…

EasyExcel上传校验文件错误信息放到文件里以Base64 返回给前端

产品需求&#xff1a; 前端上传个csv 或 excel 文件&#xff0c;文件共4列&#xff0c;验证文件大小&#xff0c;类型&#xff0c;文件名长度&#xff0c;文件内容&#xff0c;如果某行某个单元格数据验证不通过&#xff0c;就把错误信息放到这行第五列&#xff0c;然后把带有…

机器学习免费使用的数据集及网站链接

机器学习领域存在许多可以免费使用的数据集&#xff0c;这些数据集来自于学习、研究、比赛等目的。 一、综合性数据集平台 1.Kaggle 网址&#xff1a;Kaggle 数据集https://www.kaggle.com/datasets Kaggle是一个数据科学竞赛和社区平台&#xff0c;提供了大量的数据集供用…

Nacos 3.0 Alpha 发布,在安全、泛用、云原生更进一步

自 2021 年发布以来&#xff0c;Nacos 2.0 在社区的支持下已走过近三年&#xff0c;期间取得了诸多成就。在高性能与易扩展性方面&#xff0c;Nacos 2.0 取得了显著进展&#xff0c;同时在易用性和安全性上也不断提升。想了解更多详细信息&#xff0c;欢迎阅读我们之前发布的回…

IP查询于访问控制保护你我安全

IP地址查询 查询方法&#xff1a; 命令行工具&#xff1a; ①在Windows系统中&#xff0c;我们可以使用命令提示符&#xff08;WINR&#xff09;查询IP地址&#xff0c;在弹窗中输入“ipconfig”命令查看本地网络适配器的IP地址等配置信息&#xff1b; ②在Linux系统中&…

解决 ssh connect to host github.com port 22 Connection timed out

一、问题描述 本地 pull/push 推送代码到 github 项目报 22 端口连接超时&#xff0c;测试连接也是 22 端口连接超时 ssh 密钥没问题、也开了 Watt Toolkit 网络是通的&#xff0c;因此可以强制将端口切换为 443 二、解决方案 1、测试连接 ssh -T gitgithub.com意味着无法通…

如何在Windows 11 WSL2 Ubuntu 环境下安装和配置perf性能分析工具?

在Windows 11 WSL2 Ubuntu 环境下完整安装和配置perf性能分析工具 一、背景二、准备工作三、获取并编译Linux内核源码四、安装和配置perf五、测试perf六、总结 一、背景 由于WSL2使用的是微软定制的内核&#xff0c;并非标准的Ubuntu内核&#xff0c;因此直接使用apt安装linux…