导入识别包:
识别验证码图片.py 这里用返回27坐标
import base64 import json import requests # 一、图片文字类型(默认 3 数英混合): # 1 : 纯数字 # 1001:纯数字2 # 2 : 纯英文 # 1002:纯英文2 # 3 : 数英混合 # 1003:数英混合2 # 4 : 闪动GIF # 7 : 无感学习(独家) # 11 : 计算题 # 1005: 快速计算题 # 16 : 汉字 # 32 : 通用文字识别(证件、单据) # 66: 问答题 # 49 :recaptcha图片识别 # 二、图片旋转角度类型: # 29 : 旋转类型 # # 三、图片坐标点选类型: # 19 : 1个坐标 # 20 : 3个坐标 # 21 : 3 ~ 5个坐标 # 22 : 5 ~ 8个坐标 # 27 : 1 ~ 4个坐标 # 48 : 轨迹类型 # # 四、缺口识别 # 18 : 缺口识别(需要2张图 一张目标图一张缺口图) # 33 : 单缺口识别(返回X轴坐标 只需要1张图) # 五、拼图识别 # 53:拼图识别 def base64_api(uname, pwd, img, typeid): with open(img, 'rb') as f: base64_data = base64.b64encode(f.read()) b64 = base64_data.decode() data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64} result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text) if result['success']: return result["data"]["result"] else: return result["message"] return ""
导入需要的各自乱七八糟的东西
步骤:
1.进入登陆界面 找到账号、密码的input标签和登录的按钮标签
2.给账号密码标签传递你的账号密码,点击登录。(不易执行过快)
3.此时弹出验证码:
4.我们要做的是先将整个网页屏幕进行截屏(保存到本地) ,然后根据验证码所在网页中的位置进行验证码标签的定位,计算出其大小,用PIL的Image工具进行裁剪,将裁剪后的图片保存到本地。
5.将图片传给图片识别工具,返回的结果是如: x1,y1|x2,y2这样的字符串,进行处理,得到一组坐标。
6.将坐标传入动作链,也就是让其去按顺序点击验证码上对应的文字。
7.点击验证码图片上的确定,登陆成功。
import time from shibie import base64_api from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver import ActionChains from PIL import Image tart = time.time() s = Service('chromedriver.exe') bro = webdriver.Chrome(service=s) bro.maximize_window() bro.get('https://passport.bilibili.com/login') u = bro.find_element(By.ID, 'login-username') p = bro.find_element(By.ID, 'login-passwd') btn = bro.find_element(By.CSS_SELECTOR, '.btn-login') time.sleep(1) u.send_keys('你的B站账号') time.sleep(1) p.send_keys('你的B站密码') btn.click() time.sleep(2) # 截屏 bro.save_screenshot('aa.png') code_img_ele = bro.find_element(By.CSS_SELECTOR, '.geetest_panel_next') # 验证码图片左上角的坐标 x,y location = code_img_ele.location print('location', location) # 验证码标签对应的长和宽 size = code_img_ele.size print('size:', size) # 左上角和右下角坐标 rangle = ( int(location['x']), int(location['y']), int(location['x'] + size['width']), int(location['y'] + size['height'])) # 至此验证码图片区域就确定下来了 # 裁剪图片 i = Image.open('aa.png') code_img_name = 'code.png' # crop根据指定区域进行图片裁剪 frame = i.crop(rangle) frame.save(code_img_name) result = base64_api('你的账号', '你的密码', code_img_name, 27) print(result) #time.sleep(2) pos_lst = [k.split(',') for k in result.split('|')] # 设置动作链 action = ActionChains(bro) for x, y in pos_lst: action.move_to_element_with_offset(code_img_ele, x, y).click().perform() action.release() #time.sleep(2) btn2 = bro.find_element(By.CSS_SELECTOR, '.geetest_commit_tip') btn2.click() time.sleep(3) print(time.time() - tart)
其它小知识:
无头浏览器+反检测
chrome_options快被遗弃了,会告知用options代替。
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By # 实现无可视化界面 from selenium.webdriver.chrome.options import Options # 实现规避检测 from selenium.webdriver import ChromeOptions # 实现无可视化界面的操作 chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') # 实现规避检测 option = ChromeOptions() option.add_experimental_option('excludeSwitches', ['enable-automation']) # 如何实现让selenium规避被检测到的风险 s = Service('chromedriver.exe') bro = webdriver.Chrome(service=s, options=option, chrome_options=chrome_options)
其它:
# iframe处理 切换浏览器标签定位的作用域 bro.switch_to.frame('iframeResult') # 执行js代码 如下滚一个屏幕的距离 bro.execute_script('window.scrollTo(0,document.body.scrollHeight)') # 前进后退 bro.back() bro.forward()