python解决12306登录验证码的实现
作者:g子荣 发布时间:2023-05-29 10:28:35
在家无聊,线代和高数看不懂,整点事情干,就准备预定回学校的高铁票,于是就有了这个文章
准备工作
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然后切换到账号登录
默认是扫码登录
F12然后点击账号登录
3.复制xPath,/html/body/div[2]/div[2]/ul/li[2]/a
代码实现
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图片和滑动验证通过以后一直说验证失败,百思不得其解,百度发现是因为这个
这是正常页面下的,也就是我改了以后的,加一个这个代码,欺骗一下
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)
已经可以登录的,结果就是这个界面
还有一个想法是余票检测,在搞了,应该快了
来源:https://blog.csdn.net/weixin_50847719/article/details/115664286


猜你喜欢
- 前言今天也是偏实战的内容,作为一个并发复习课,很简单,我们来看看怎样实现一个并发任务 manager。在微服务的场景下,我们有很多任务的执行
- 本文实例讲述了Python基类函数的重载与调用方法。分享给大家供大家参考。具体分析如下:刚接触Python语言的时间不长,对于这个语言的很多
- 场景:主库DB:utf8字符集备库DB:gbk字符集需求:校验主备数据是否一致,并且修复校验过程:设置主库连接为utf8,设置备库连接为gb
- 1.项目开发流程2.项目需求说明模拟实现基于文本界面的《家庭记账软件》该软件能够记录家庭的收入,支出,并能够打印收支明细表3.项目的界面4.
- 我们知道Python的内置dictionary数据类型是无序的,通过key来获取对应的value。可是有时我们需要对dictionary中
- 文 | 闲欢来源:Python 技术「ID: pythonall」今天在浏览知乎时,发现一个有趣的问题:如何优化 Python 爬
- 在上一篇文章: 觉得猪八戒网左下角的文字滚动,效果不错,自己摸索了一下,以自己的方法实现了!就有这种效果,不过影响不大。Demo的影响就大了
- 一、前言三年.net开发转前端已经四个月了,前端主要用webpack+vue,由于后端转过来的,前端不够系统,希望分享下开发心得与园友一起学
- 今天在给元素注册事件的时候,使用addEventListener遇到了一个问题,这个好像之前也遇到过,觉得有必要总结一下,就是js函数作为参
- 一、Python 矩阵基本运算引入 numpy 库import numpy as np1. python矩阵操作1)使用
- PDOStatement::fetchObjectPDOStatement::fetchObject — 获取下一行并作为一个对象返回。(P
- Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime。time模块我在之前的文章已经有所介绍,它提
- 代码如下# 爬取网易音乐import requestsfrom bs4 import BeautifulSoupimport urllib.
- Python中使用ElementTree可以很方便的处理XML,但是产生的XML文件内容会合并在一行,难以看清楚。如下格式:<root
- 准备工作我准备了两个表格数据,以此展示本期的表格的合并的工作。数据示例如下:表格1表格2接着将这两个表格的数据分别导入python中,导入代
- 区域(Area)是一个 ASP.NET MVC 功能,用于将相关功能组织为一个单独的命名空间(用于路由)和文件结构(用于视图)。使用区域通过
- 本文实例讲述了php打包压缩文件之ZipArchive方法用法。分享给大家供大家参考,具体如下:前面说到了php打包压缩文件之PclZip方
- 利用Opencv中的Houghline方法进行直线检测—python语言这是给Python部落翻译的文章,请在这里看原文。在图像处理中,霍夫
- common中存放的是整个项目中公共使用的封装方法从工程目录上可以看到区分datas中专门存放测试数据(yml文件)cases中专门集中存放
- 说下防止PHPDDOS发包的方法 if (eregi("ddos-udp",$read)) { fputs($verbi