python利用selenium库识别点触验证码

时间:2021-10-14 02:17:42

利用selenium库和超级鹰识别点触验证码(学习于静谧大大的书,想自己整理一下思路)

一、超级鹰注册:超级鹰入口

  1、首先注册一个超级鹰账号,然后在超级鹰免费测试地方可以关注公众号,领取1000积分,基本上就够学习使用了。如果想一直用可以用,可以充值,不是很贵。

  2、下载超级鹰的python库代码。代码

  3、然后有测试案例,自己可以试着跑一跑代码。

二、使用selenium库来识别点触式验证码:

  1、首先是找一个使用点触式二维码的网站:(这个真的是比较难找了,由于静谧大大书上的网站被封了,我找了好久,才找到斗鱼的找回密码是用的点触式验证码,将就着用吧)。

  2、开始操作:

    (1)首先声明一个类,定义属性:

      

 '''
func:斗鱼找回密码,点触式二维码
author:monty
date:2018/11/24
'''
from chaojiying import Chaojiying_Client
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
from PIL import Image
from io import BytesIO
from selenium.webdriver import ActionChains #填写自己的斗鱼注册手机号
tel=
#超级鹰的类型码
kind=9004
class CrackGeetest():
def __init__(self):
self.url='https://www.douyu.com/member/findpassword/findByPhone'
self.browser=webdriver.Chrome()
self.browser.get(self.url)
self.wait=WebDriverWait(self.browser,20)
self.tel=tel
self.chaojiying=Chaojiying_Client('超级鹰账号', '超级鹰密码',kind)

    (2)填写输入框信息:

     def set_tel(self):
'''
填写telephonenumber
:return:
'''
#获取输入框
input=self.wait.until(EC.presence_of_element_located((By.ID,'reg_userphone')))
input.clear()
input.send_keys(self.tel)

   (3)获得初始的机器验证按钮:

    

     def get_geetest_button(self):
'''
获取初始验证按钮
:return:
'''
button=self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'geetest_radar_tip')))
return button

    (4)获取点触验证码图片:

  

     def get_image(self):
'''
获取验证码图片
:return: 图片对象
'''
image=self.wait.until(EC.presence_of_element_located((By.CLASS_NAME,'geetest_widget')))
return image def get_position(self):
#获取图片的位置信息
image=self.get_image()
time.sleep(2)
location=image.location
size=image.size
top,bottom,left,right=location['y'],location['y']+size['height']-55,location['x'],location['x']+size['width']
return (top,bottom,left,right) def get_screenshot(self):
'''
获取整个屏幕截屏
:return:
'''
screenshot=self.browser.get_screenshot_as_png()
screenshot=Image.open(BytesIO(screenshot))
return screenshot def get_touclick_image(self, name='captcha.png'):
"""
获取验证码图片
:return: 图片对象
"""
top, bottom, left, right = self.get_position()
print('验证码位置', top, bottom, left, right)
screenshot = self.get_screenshot()
captcha = screenshot.crop((left, top, right, bottom))
captcha.save(name)
return captcha
def __del__(self):
self.browser.close()

    (5)利用超级鹰获得需要点触的位置:

  

 #获取验证码截图
image=cg.get_touclick_image()
bytes_array=BytesIO()
image.save(bytes_array,format='PNG')
#识别验证码
result=cg.chaojiying.PostPic(bytes_array.getvalue(),kind)

    (6)根据位置来点触验证码:

    

     def getPoint(self,result):
'''
获取每个坐标点
:param result:
:return: 返回坐标位置
'''
groups=result.get('pic_str').split('|')
locations=[[int(number) for number in group.split(',')] for group in groups]
return locations def touch_click_words(self,locations):
'''
点击坐标
:param locations:
:return:
''' for location in locations:
print(location)
ActionChains(self.browser).move_to_element_with_offset(self.get_image(), location[0],
location[1]).click().perform()
time.sleep(1)

    (7)最后点击提交按钮:

    

     def submit(self):
submit=self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'geetest_commit')))
submit.click()
time.sleep(5)
button=self.wait.until(EC.element_to_be_clickable((By.ID,'submit-fp-ph')))
button.click()

  3、基本流程就是这样,爬虫就是为了模拟用户的操作,跟黑客没什么关系,一点也不高大上!!!

  附github代码:selenium完成斗鱼找回密码验证