Selenium实现模拟登录 12306铁总网站实现 图片点击验证码登录

鳄鱼君

发表文章数:642

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » Selenium实现模拟登录 12306铁总网站实现 图片点击验证码登录

12306网站登录需要验证码,验证码类型如下图:

Selenium实现模拟登录 12306铁总网站实现 图片点击验证码登录

思路就是通过selenium发送用户名和密码,然后对登录页面进行截图并保存到本地,再这个过程中需要找到验证码图片的位置,确定验证码的大小,然后使用PIL模块对截图进行裁剪,之后将图片交给打码平台识别。那么我们首先需要实现的是将登陆页面中的验证码图片剪裁下来,并保存到本地,参考代码:

from selenium import webdriver
from PIL import Image
driver=webdriver.Chrome('./chromedriver')
url='https://kyfw.12306.cn/otn/resources/login.html'
driver.get(url)
driver.maximize_window() #最大化窗口
botton=driver.find_element_by_class_name('login-hd-account') #点击账号登录
botton.click()
#发送用户名和密码
username=driver.find_element_by_id('J-userName') #找到用户名输入框
username.send_keys('手机号')
password=driver.find_element_by_id('J-password') #找到密码输入框
password.send_keys('密码')
#验证码识别处理:验证码应该被截屏截取下来而不应该单独发送请求
driver.save_screenshot('./screenshot.png') #该图片表示的是登录页面的截图
#对登录页面的图像进行局部剪裁
#只需要定位到验证码图片左下角和右上角的两点坐标,就可以获取剪裁的矩形区域

#验证图片的img标签
code_img=driver.find_element_by_xpath('//*[@id="J-loginImg"]')
localtion=code_img.location #验证码图片的左下角坐标 {'x': 930, 'y': 284}
size=code_img.size #验证码图片的长、宽页面中的尺寸(长、宽){'height': 188, 'width': 300}

#裁剪的矩形区域 
cangle=( int(localtion['x']),int(localtion['y']),int(localtion['x'])+int(size['width']),int(localtion['y'])+int(size['height'])) 
print(cangle)
#基于Image类提供的工具进行剪裁
i=Image.open('./screenshot.png')
frame=i.crop(cangle) #根据规定的区域裁剪
frame.save('./code_img.png') #code_img就是验证码图片
#点击登录按钮
submit=driver.find_element_by_xpath('//*[@id="J-login"]')
submit.click()

接下来需要借助打码平台来对我们的验证码图片进行识别,然后通过selsnium的ActionChains动作链按照坐标值进行点击:

driver=webdriver.Chrome('./chromedriver')
url='https://kyfw.12306.cn/otn/resources/login.html'
driver.get(url)
driver.maximize_window() #最大化窗口
botton=driver.find_element_by_class_name('login-hd-account')
botton.click()
#发送用户名和密码
username=driver.find_element_by_id('J-userName')
username.send_keys('13673770772')
password=driver.find_element_by_id('J-password')
password.send_keys('1897745389dsg')
#验证码识别处理:验证码应该被截屏截取下来而不应该单独发送请求
driver.save_screenshot('./screenshot.png') #该图片表示的是登录页面的截图
#对登录页面的图像进行局部剪裁
#只需要定位到验证码图片左下角和右上角的两点坐标,就可以获取剪裁的矩形区域

#验证图片的img标签
code_img=driver.find_element_by_xpath('//*[@id="J-loginImg"]')
localtion=code_img.location #验证码图片的左下角坐标 {'x': 930, 'y': 284}
size=code_img.size #验证码图片的长、宽页面中的尺寸(长、宽){'height': 188, 'width': 300}

#裁剪的矩形区域 
cangle=( int(localtion['x']),int(localtion['y']),int(localtion['x'])+int(size['width']),int(localtion['y'])+int(size['height'])) 
#print(cangle)
#基于Image类提供的工具进行剪裁
i=Image.open('./screenshot.png')
frame=i.crop(cangle) #根据规定的区域裁剪
frame.save('./code_img.png') #code_img就是验证码图片

#通过超级鹰封装的函数来识别验证码图片
result=transform_code_img('./code_img.png',9004)
# print(result)#返回格式为 127,67|184,143  需要转换成 [[x1,y1],[x2,y2]]

all_list=[]
if '|' in result:
    list_1=result.split('|')
    for i in range(len(list_1)):
        xy_list=[]
        x=int(list_1[i].split(',')[0])
        y=int(list_1[i].split(',')[1])
        xy_list.append(x)
        xy_list.append(y)
        all_list.append(xy_list)
else:
    x=int(result.split(',')[0])
    y=int(result.split(',')[1])
    xy_list.append(x)
    xy_list.append(y)
    all_list.append(xy_list)
for item in all_list:
    x=item[0] #x,y需要点击的坐标
    y=item[1]
    ActionChains(driver).move_to_element_with_offset(code_img,x,y).click().perform()

#点击登录按钮
submit=driver.find_element_by_xpath('//*[@id="J-login"]')
submit.click()

超级鹰可以完成人眼能够轻松看到的验证信息,对于人眼也需要识别很久的图片来说,正确率就不高,不过应对绝大多数的验证码足够了。铁总的验证码失败过多会出现更加难以识别的内容,但是超级鹰基本就一此成功了。

使用seleinum时的注意事项

在进行裁剪验证码图片出现偏差时,可以调整网页窗口为最大化,也可以调整电脑的缩放比例
Selenium实现模拟登录 12306铁总网站实现 图片点击验证码登录

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Selenium实现模拟登录 12306铁总网站实现 图片点击验证码登录》 发布于2020-05-07

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

3 + 7 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册