超级鹰网址
http://www.chaojiying.com/user/mysoft/
代码中验证码返回中pic_id为目标坐标,所以在代码中直接获取目标点坐标
print(chaojiying.PostPic(im, 9004)['pic_str'])
得到的是:
34,69|38,146
from selenium import webdriver # 驱动包
from PIL import Image # 图片处理
from selenium.webdriver import ActionChains # 行为事件
import time # 时间
# 请求页面,等待页面加载完成
driver = webdriver.Chrome(r'E:\浏览器下载\chromedriver_win32\chromedriver.exe')
driver.get("https://kyfw.12306.cn/otn/login/init") # 请求登录页面
time.sleep(1)
# 定位验证码图片,后续拿到具体坐标后切换到验证码图片区域进行点击操作
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']))
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) # 保存验证码图片
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
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)
driver.find_element_by_css_selector("#username").send_keys("12306用户名")
driver.find_element_by_css_selector("#password").send_keys("12306密码")
time.sleep(2)
# 遍历列表,使用动作链对每一个列表元素对应的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的参数,将参数元组的四个值都乘以缩放比例。
本文仅做供学习交流,内容仅做参考