【网易易盾】https://dun.163.com/
点触验证码的难点:
1、背景图比较的花哨
2、汉字顺序不好判断
3、汉字做了变形处理、颜色处理
解决方案:
1、自己编写相关代码处理===》用到的技术比较高端,至少得机器学习。
2、使用验证码的处理平台====》省事,花费小
3、人工识别之后,设置一个停止时长,输入验证码
【超级鹰】超级鹰验证码识别-专业的验证码云端识别服务,让验证码识别更快速、更准确、更强大
价格体系:不同的验证码以及不同的难度,价格不一。
软件id:帮助我们进行验证码的识别
生成:位于用户中心菜单栏最下方,直接点击生成然后取个名字即可
下载位置:与我们点触验证的代码文件放在同一个文件夹下面
开发文档介绍: 图片是案例图片,py文件是关于这个图片识别的代码。如果我们需要识别其他图片,只需要在代码当中更改指定的图片即可。
注意开发文档中的提示:
1、手动添加print()的括号 。
2、如果是win系统,路径需要时用双斜杠//,这个地方其实还是为了取消转义的作用。
3、可能会提示tab空格错误,注意统一一下换行符即可。
# 导入浏览器驱动 import time from selenium import webdriver # 导入定位模块 from selenium.webdriver.common.by import By # 基本配置模块 from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains from PIL import Image import re from requests_html import HTMLSession from io import BytesIO from chaojiying import Chaojiying_Client # 1、使用selenium加载验证码图片 # 实例化一个浏览器对象 # 实例化一个配置对象(防止浏览器闪退) option = Options() option.add_experimental_option('detach', True) browser = webdriver.Chrome() browser.get("https://zc.yy.com/reg/udb/reg4udb.do?mode=udb&type=&appid=1&action=3&busiurl=https%3A%2F%2Faq.yy.com") wait = WebDriverWait(browser, 10) mainBg = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'pw_mainBg')))
方式一:直接截图
方拾二:根据url获取图片之后再根据坐标进行偏移
# 2、获取验证码的精灵图 mainBg.screenshot('pw_main.png') time.sleep(2)
导入:from chaojiying import Chaojiying_Client
实例化对象:cjy_c = Chaojiying_Client(username, password, softid)
username: 用户名
password: 密码
softid:软件id
识别方法:PostPic(im, codetype)
im: 图片的二进制数据
codetype: 验证码类型
# 3、识别图片验证码 # 3.1 实例化一个超级鹰的对象 cjy_c = Chaojiying_Client('LIuMU37', 'LiuMumima37', '950859') # 3.2 直接调用识别的方法 # 3.2.1 获取图片的字节数据(二进制数据) img = Image.open("pw_main.png") # 打开图片 img_fl = BytesIO() # 得到PngImageFile img.save(img_fl, format("PNG")) # 以png的类型将图片保存在临时文件中 img_byte = img_fl.getvalue() # 获取二进制数据 print(img_byte) # 3.2.2 使用超级鹰的验证代码进行识别(返回的是图片坐标位置的json类型文档) res_json = cjy_c.PostPic(img_byte, 9004) # print(res_json) pic_str = res_json['pic_str'] # print(pic_str) # 3.2.3 获取返货数据里面的字符坐标值 for pic in pic_str.split("|"): p = list(map(int, pic.split(","))) # 4、根据坐标点击文字 注意:这个网站图片做了一点小偏移,因此需要稍微更改坐标值 ActionChains(browser).move_to_element_with_offset(mainBg, p[0]-128, p[1]-83).click().perform() time.sleep(0.5) # 5、点击提交按钮 pw_submit = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "pw_submit"))) ActionChains(browser).click(pw_submit).perform() time.sleep(5)
map函数使用演示
pic_str = "99,86|45,82|90,25" pic_list = [] for pic in pic_str.split("|"): # p = pic.split(",") # [['99', '86'], ['45', '82'], ['90', '25']] p = list(map(int, pic.split(","))) # [[99, 86], [45, 82], [90, 25]] pic_list.append(p) print(pic_list)
偏移量范围:
x只要是小图范围之内,随便多少都是可以的(大概率)
y 一定是83左右, 因为上面有一排空很多
# 导入浏览器驱动 import time from selenium import webdriver # 导入定位模块 from selenium.webdriver.common.by import By # 基本配置模块 from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains from PIL import Image import re from requests_html import HTMLSession from io import BytesIO from chaojiying import Chaojiying_Client # 1、使用selenium加载验证码图片 # 实例化一个浏览器对象 # 实例化一个配置对象(防止浏览器闪退) option = Options() option.add_experimental_option('detach', True) browser = webdriver.Chrome() browser.get("https://zc.yy.com/reg/udb/reg4udb.do?mode=udb&type=&appid=1&action=3&busiurl=https%3A%2F%2Faq.yy.com") wait = WebDriverWait(browser, 10) mainBg = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'pw_main'))) # 2、获取验证码的精灵图 mainBg.screenshot('pw_main.png') time.sleep(2) # 3、识别图片验证码 # 3.1 实例化一个超级鹰的对象 cjy_c = Chaojiying_Client('LIuMU37', 'LiuMumima37', '950859') # 3.2 直接调用识别的方法 # 3.2.1 获取图片的字节数据(二进制数据) img = Image.open("pw_main.png") # 打开图片 img_fl = BytesIO() # 得到PngImageFile img.save(img_fl, format("PNG")) # 以png的类型将图片保存在临时文件中 img_byte = img_fl.getvalue() # 获取二进制数据 # print(img_byte) # 3.2.2 使用超级鹰的验证代码进行识别(返回的是图片坐标位置的json类型文档) res_json = cjy_c.PostPic(img_byte, 9004) # print(res_json) pic_str = res_json['pic_str'] # print(pic_str) # 3.2.3 获取返货数据里面的字符坐标值 for pic in pic_str.split("|"): p = list(map(int, pic.split(","))) # 4、根据坐标点击文字 注意:这个网站图片做了一点小偏移,因此需要稍微更改坐标值 ActionChains(browser).move_to_element_with_offset(mainBg, p[0]-133, p[1]-85).click().perform() time.sleep(0.5) # 5、点击提交按钮 pw_submit = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "pw_submit"))) ActionChains(browser).click(pw_submit).perform() time.sleep(5)