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获取一组数据里最大值max函数用法实例
May 26 Python
Python给定一个句子倒序输出单词以及字母的方法
Dec 20 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
Jan 29 Python
django 微信网页授权登陆的实现
Jul 30 Python
python3图片文件批量重命名处理
Oct 31 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
Python小白不正确的使用类变量实例
May 29 Python
Python collections.defaultdict模块用法详解
Jun 18 Python
Python3爬虫里关于代理的设置总结
Jul 30 Python
Django admin组件的使用
Oct 24 Python
python中append函数用法讲解
Dec 11 Python
python数字图像处理之图像的批量处理
Jun 28 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抓取https的内容的代码
2010/04/06 PHP
PHP extract 将数组拆分成多个变量的函数
2010/06/30 PHP
PHP系列学习之日期函数使用介绍
2012/08/18 PHP
php var_export与var_dump 输出的不同
2013/08/09 PHP
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
php监测数据是否成功插入到Mysql数据库的方法
2016/11/25 PHP
PHP中单例模式与工厂模式详解
2017/02/17 PHP
PHP学习笔记之session
2018/05/06 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
Javascript this指针
2009/07/30 Javascript
javascript json2 使用方法
2010/03/16 Javascript
面向对象的Javascript之二(接口实现介绍)
2012/01/27 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
js使用for循环查询数组中是否存在某个值
2014/08/12 Javascript
jquery动态增加删减表格行特效
2015/11/20 Javascript
JavaScript制作简单的日历效果
2016/03/10 Javascript
vue.js入门教程之绑定class和style样式
2016/09/02 Javascript
canvas实现粒子时钟效果
2017/02/06 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
JavaScript获取某一天所在的星期
2019/09/05 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
FFT快速傅里叶变换的python实现过程解析
2019/10/21 Python
python和node.js生成当前时间戳的示例
2020/09/29 Python
python中os.remove()用法及注意事项
2021/01/31 Python
HTML5之SVG 2D入门5—颜色的表示及定义方式
2013/01/30 HTML / CSS
英国女性运动服品牌:Sweaty Betty
2018/11/08 全球购物
英国鞋网:Rubber Sole
2020/03/03 全球购物
会计找工作求职信范文
2013/12/09 职场文书
银行实习鉴定
2013/12/13 职场文书
委托书样本
2014/04/02 职场文书
何时使用Map来代替普通的JS对象
2021/04/29 Javascript
Go语言基础切片的创建及初始化示例详解
2021/11/17 Golang
Django+Nginx+uWSGI 定时任务的实现方法
2022/01/22 Python
使用python生成大量数据写入es数据库并查询操作(2)
2022/09/23 Python