点触验证码解决之网易易盾

一、点触验证码介绍

1、网易易盾验证码选择

【网易易盾】https://dun.163.com/

点触验证码解决之网易易盾_第1张图片

点触验证码解决之网易易盾_第2张图片

点触验证码解决之网易易盾_第3张图片

点触验证码的难点:

1、背景图比较的花哨

2、汉字顺序不好判断

3、汉字做了变形处理、颜色处理

解决方案:

1、自己编写相关代码处理===》用到的技术比较高端,至少得机器学习。

2、使用验证码的处理平台====》省事,花费小

3、人工识别之后,设置一个停止时长,输入验证码

2、超级鹰介绍

【超级鹰】超级鹰验证码识别-专业的验证码云端识别服务,让验证码识别更快速、更准确、更强大

点触验证码解决之网易易盾_第4张图片

点触验证码解决之网易易盾_第5张图片

2.1价格体系及软件id

价格体系:不同的验证码以及不同的难度,价格不一。

点触验证码解决之网易易盾_第6张图片

软件id:帮助我们进行验证码的识别

生成:位于用户中心菜单栏最下方,直接点击生成然后取个名字即可

点触验证码解决之网易易盾_第7张图片

点触验证码解决之网易易盾_第8张图片

2.2开发文档

点触验证码解决之网易易盾_第9张图片

下载位置:与我们点触验证的代码文件放在同一个文件夹下面

开发文档介绍: 图片是案例图片,py文件是关于这个图片识别的代码。如果我们需要识别其他图片,只需要在代码当中更改指定的图片即可。

注意开发文档中的提示:

1、手动添加print()的括号 。

2、如果是win系统,路径需要时用双斜杠//,这个地方其实还是为了取消转义的作用。

3、可能会提示tab空格错误,注意统一一下换行符即可。

2.3超级鹰代码分析

二、案例运用

点触验证码解决之网易易盾_第10张图片

点触验证码解决之网易易盾_第11张图片

1、使用selenium 驱动浏览器加载验证码图片

# 导入浏览器驱动
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')))

2、获取验证码的精灵图

方式一:直接截图

方拾二:根据url获取图片之后再根据坐标进行偏移

# 2、获取验证码的精灵图
mainBg.screenshot('pw_main.png')
time.sleep(2)

点触验证码解决之网易易盾_第12张图片

3、识别验证码图片(调用超级鹰的接口)

导入: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)

点触验证码解决之网易易盾_第13张图片

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)

偏移量范围:

点触验证码解决之网易易盾_第14张图片

点触验证码解决之网易易盾_第15张图片

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)

你可能感兴趣的:(python,网络爬虫)