python解决12306登录验证码的实现


Posted in Python onApril 18, 2021

在家无聊,线代和高数看不懂,整点事情干,就准备预定回学校的高铁票,于是就有了这个文章

准备工作

1.pip安装chromediver,当然也可以手动解压(网上的教程好像没有提到pip,手动安装到C盘pycharm里面的Scripts就行了)
chromedriver.storage.googleapis.com/index.html这是chromedriver文件官网,在chrome里面设置查看自己的版本,然后找对应的版本就完了

2.注册个超级鹰,http://www.chaojiying.com/contact.html,挺厉害的打码平台,微信公众号绑定一下账号给1000积分,足够干12306验证码了

开始实战讲解

1.选择chrome打开12306然后切换到账号登录

默认是扫码登录

python解决12306登录验证码的实现

F12然后点击账号登录

python解决12306登录验证码的实现

3.复制xPath,/html/body/div[2]/div[2]/ul/li[2]/a

python解决12306登录验证码的实现

代码实现

from selenium.webdriver import Chrome
web = Chrome()
web.get('https://kyfw.12306.cn/otn/resources/login.html')
time.sleep(3)
web.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a').click()

2.下载验证码(截屏也可以)然后发送给超级鹰

超级鹰官网有个官方文档,下载然后pychram打开,其实就很简单,然后把账号密码改成你自己的,

from chaojiying import Chaojiying_Client

验证码需要时间加载,所以要sleep(3)就够了,

3.拿到坐标然后模拟点击
好像这个官方叫什么偏移量,挺高大上的,说白了就是建立一个坐标系,给个x,y然后点击就完了,默认左上方是原点

for pre_location in location_list:
        #切割出来x,y坐标
        location = pre_location.split(',')
        x = int(location[0])
        y = int(location[1])
        ActionChains(web).move_to_element_with_offset(img,x,y).click().perform()

4.登录以后有个滑动验证
现在我还没有找到方法控制滑动速度,匀速运动,但是12306并没有因为这个验证失败

ActionChains(web).drag_and_drop_by_offset(button,340,0).perform()

button是那个滑块的Xpath,我记得好像是长度330,340肯定是够用了,那个0就是竖y的方向上的滑动

12306靠webdriver判断是不是爬虫

刚开始12306图片和滑动验证通过以后一直说验证失败,百思不得其解,百度发现是因为这个

python解决12306登录验证码的实现

这是正常页面下的,也就是我改了以后的,加一个这个代码,欺骗一下

def trick_not_chromedriver():
    option = Options()
    option.add_argument('--disable-blink-features=AutomationControlled')
    return option

这个要调用在前面,靠后一点就不行了

全部代码

from selenium.webdriver import Chrome
import requests,time
from hashlib import md5
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.chrome.options import Options
class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
        self.username = username
        password =  password.encode('utf8')
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {
            'Connection': 'Keep-Alive',
            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
        }

    def PostPic(self, im, codetype):
        """
        im: 图片字节
        codetype: 题目类型 参考 http://www.chaojiying.com/price.html
        """
        params = {
            'codetype': codetype,
        }
        params.update(self.base_params)
        files = {'userfile': ('ccc.jpg', im)}
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
        return r.json()

    def ReportError(self, im_id):
        """
        im_id:报错题目的图片ID
        """
        params = {
            'id': im_id,
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
        return r.json()
#获取验证码
def get_verify_img(web):
    web.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a').click()
    time.sleep(5)
    verify_img = web.find_element_by_xpath('//*[@id="J-loginImg"]')
    return verify_img
#识别验证码返回坐标
def discern_verify_img(verify_img):
    chaojiying = Chaojiying_Client('超级鹰账号', '密码', '软件ID')
    responce = chaojiying.PostPic(verify_img.screenshot_as_png, 9004)
    pre_location = responce['pic_str']
    location_list = pre_location.split("|")
    # 把split写错了,卡了半天
    # type_pre_location = type(pre_location)
    return location_list
    # return type_pre_location
#拿到坐标模拟点击
def click_and_enter(web,location_list,img):
    for pre_location in location_list:
        #切割出来x,y坐标
        location = pre_location.split(',')
        x = int(location[0])
        y = int(location[1])
        ActionChains(web).move_to_element_with_offset(img,x,y).click().perform()
def enter(web):
    # input()
    web.find_element_by_xpath('//*[@id="J-userName"]').send_keys('账号')
    web.find_element_by_xpath('//*[@id="J-password"]').send_keys('密码')
    web.find_element_by_xpath('//*[@id="J-login"]').click()
#滑动验证
def move_verify(web):
    button = web.find_element_by_xpath('//*[@id="nc_1__scale_text"]/span')
    ActionChains(web).drag_and_drop_by_offset(button,340,0).perform()
# 骗12306这不是chromedriver
def trick_not_chromedriver():
    option = Options()
    option.add_argument('--disable-blink-features=AutomationControlled')
    return option
#现在有一个疫情防控的确认按钮,点一下这个
def yqfk(web):
    web.get('https://kyfw.12306.cn/otn/leftTicket/init')
    time.sleep(1)
    web.find_element_by_xpath('//*[@id="qd_closeDefaultWarningWindowDialog_id"]').click()
#进入查询界面,思路正则表达式,不可信
def get_stick_text(web):
    web.get('https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2021-04-16&leftTicketDTO.from_station=TNV&leftTicketDTO.to_station=CZF&purpose_codes=0X00')
    response = web.find_element_by_xpath('/html/body/pre').text
    return (response)
#父子节点一个一个找,显示余票
if __name__ == '__main__':
    web = Chrome(options=trick_not_chromedriver())
    web.get('https://kyfw.12306.cn/otn/resources/login.html')
    time.sleep(5)
    # click_and_enter(discern_verify_img(get_verify_img()))
    img = get_verify_img(web)
    click_and_enter(web,discern_verify_img(img),img)
    time.sleep(5)
    enter(web)
    time.sleep(5)
    move_verify(web)
    time.sleep(1)
    yqfk(web)
    time.sleep(2)
    get_verify_img(web)

已经可以登录的,结果就是这个界面

python解决12306登录验证码的实现

还有一个想法是余票检测,在搞了,应该快了

到此这篇关于python解决12306登录验证码的实现的文章就介绍到这了,更多相关python 12306登录验证码 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python定时采集摄像头图像上传ftp服务器功能实现
Dec 23 Python
用Python编程实现语音控制电脑
Apr 01 Python
用TensorFlow实现戴明回归算法的示例
May 02 Python
python对日志进行处理的实例代码
Oct 06 Python
python 处理string到hex脚本的方法
Oct 26 Python
使用Python调取任意数字资产钱包余额功能
Aug 15 Python
关于tf.reverse_sequence()简述
Jan 20 Python
python实现Pyecharts实现动态地图(Map、Geo)
Mar 25 Python
区分python中的进程与线程
Aug 13 Python
利用django创建一个简易的博客网站的示例
Sep 29 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
Feb 18 Python
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
Jun 08 Python
django注册用邮箱发送验证码的实现
Apr 18 #Python
Python控制台输出俄罗斯方块的方法实例
Apr 17 #Python
python3 实现mysql数据库连接池的示例代码
Python如何利用正则表达式爬取网页信息及图片
Apr 17 #Python
python中sys模块的介绍与实例
Apr 17 #Python
Python中os模块的简单使用及重命名操作
Apr 17 #Python
Python利器openpyxl之操作excel表格
You might like
PHP判断图片格式的七种方法小结
2013/06/03 PHP
php创建基本身份认证站点的方法详解
2013/06/08 PHP
php socket实现的聊天室代码分享
2014/08/16 PHP
浅谈JavaScript之事件绑定
2013/07/08 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
jQuery操作iframe中js函数的方法小结
2016/07/06 Javascript
JavaScript类的写法
2016/09/17 Javascript
老生常谈javascript变量的命名规范和注释
2016/09/29 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
vue移动端下拉刷新和上拉加载的实现代码
2018/09/08 Javascript
小程序实现单选多选功能
2018/11/04 Javascript
Jquery获取radio选中值实例总结
2019/01/17 jQuery
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
使用koa2创建web项目的方法步骤
2019/03/12 Javascript
浅谈js闭包理解
2019/03/28 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
深入解析Python中的descriptor描述器的作用及用法
2016/06/27 Python
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
2018/11/20 Python
Django框架模板介绍
2019/01/15 Python
python实现最小二乘法线性拟合
2019/07/19 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
2020/06/01 Python
浅析Python __name__ 是什么
2020/07/07 Python
Auchan Direct波兰:欧尚在线杂货店
2016/10/19 全球购物
教师岗位职责
2015/02/03 职场文书
同意转租证明
2015/06/24 职场文书
工商行政处罚决定书
2015/06/24 职场文书
教师旷工检讨书
2015/08/15 职场文书
小学主题班会教案
2015/08/17 职场文书
保护环境建议书作文300字
2015/09/14 职场文书
利用html+css实现菜单栏缓慢下拉效果的示例代码
2021/03/30 HTML / CSS
Python深度学习之Pytorch初步使用
2021/05/20 Python
Python Django / Flask如何使用Elasticsearch
2022/04/19 Python