selenium模拟登陆12306

验证码处理

超级鹰网址

http://www.chaojiying.com/user/mysoft/
  1. 注册用户,在用户中心创建软件,拿到其中的软件ID
  2. 在开发文档中找到对应的Demo下载解压,拿到py文件(代码中可能会有代码缩进问题)
  3. 在价格体系中找到目标网站的验证码类型
    在这里插入图片描述
  4. 12306网站需要使用的是9004类型

验证码返回结果
代码中验证码返回中pic_id为目标坐标,所以在代码中直接获取目标点坐标
print(chaojiying.PostPic(im, 9004)['pic_str'])
得到的是:

34,69|38,146

12306网站登录

  1. 将超级鹰Demo中的Chaojiying_Client类导入代码中,导入其他需要用到的包
from selenium import webdriver # 驱动包
from PIL import Image # 图片处理
from selenium.webdriver import ActionChains # 行为事件
import time # 时间

  1. 加载驱动,请求网站
# 请求页面,等待页面加载完成
driver = webdriver.Chrome(r'E:\浏览器下载\chromedriver_win32\chromedriver.exe')
driver.get("https://kyfw.12306.cn/otn/login/init") # 请求登录页面
time.sleep(1)
  1. 定位验证码图片的大小信息
    使用find_element_by_class_name定位验证码class的name名称
# 定位验证码图片,后续拿到具体坐标后切换到验证码图片区域进行点击操作
code_img_ele = driver.find_element_by_class_name('touclick-image')
location = code_img_ele.location # 返回验证码图片左上角的坐标 (x, y)
size = code_img_ele.size # 返回验证码对应的长和宽
# rangle对应的是验证码左上角x,y坐标,右下角x,y坐标
rangle = (int(location['x']), int(location['y']), int(location['x'] + size['width']), int(location['y'] + size['height']))
  1. 截图保存验证码
driver.save_screenshot('aa1.png') # 整张页面进行截图保存
i = Image.open('./aa1.png') # 打开图片
code_img_name = './code1.png' # 局部验证码图片文件命名
# crop 根据指定区域进行图片裁剪
frame = i.crop(rangle) # 按照上一步中的验证码大小进行截图
frame.save(code_img_name) # 保存验证码图片
  1. 调用超级鹰识别
chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰密码', '	用户生成的软件ID')	#用户中心>>软件ID 生成一个替换 96001
im = open('./code1.png', 'rb').read()													#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
result = chaojiying.PostPic(im, 9004)['pic_str']
print(result) # 34,69|38,146
  1. 处理验证码识别结果,得到目标点的坐标列表
all_list = [] # 所有点的坐标列表,[[x1, y1],[x2, y2]]
if '|' in result:
    list_1 = result.split('|')
    count_1 = len(list_1)
    for i in range(count_1):
        xy_list = [] # 每个点的坐标[x1, y1]
        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 = []
    xy_list.append(x)
    xy_list.append(y)
    all_list.append(xy_list)
print(all_list)
  1. 输入12306用户名密码
    使用find_element_by_css_selector定位用户名密码输入框
    使用send_keys键入用户名密码
driver.find_element_by_css_selector("#username").send_keys("12306用户名")
driver.find_element_by_css_selector("#password").send_keys("12306密码")
time.sleep(2)

  1. 遍历sll_list列表,得到目标点的坐标信息
    使用move_to_element_with_offset移动到验证码图片区域,逐一点击目标点
    最后使用find_element_by_css_selector定位提交按钮进行click()点击
# 遍历列表,使用动作链对每一个列表元素对应的x, y指定的位置进行点击操作
for l in all_list:
    x = l[0]
    y = l[1]
    print("点击({},{})".format(x ,y))
    ActionChains(driver).move_to_element_with_offset(code_img_ele, x, y).click().perform()

    time.sleep(0.5)
    print("点击完成")
driver.find_element_by_css_selector("#loginSub").click() # 登录按钮

注意事项:
超级鹰用户题分不足无法进行识别
第3步:定位验证码图片的大小信息时,获取的location 和size可能会存在定位不准确 导致截图区域不准确
第8步:进行目标点点击时,可能会出现点击不准确
原因:
windows系统下电脑设置的显示缩放比例造成的,location获取的坐标是按显示100%时得到的坐标,而截图所使用的坐标却是需要根据显示缩放比例缩放后对应的图片所确定的,因此就出现了偏差。
方案:
1.修改电脑显示设置为100%。这是最简单的方法;
2.缩放截取到的页面图片,即将截图的size缩放为宽和高都除以缩放比例后的大小;
3.修改Image.crop的参数,将参数元组的四个值都乘以缩放比例。

本文仅做供学习交流,内容仅做参考

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值