哔哩哔哩实战----验证码识别
利用Selenium来模拟B站登录,并实现线极验验证码的识别。
初步分析
B站的登录界面如下:
登录需要完成:1、账户输入;2、密码输入;3、登录后需要通过滑块来进行验证;
难点就是如何去实现滑块验证并且模仿人的操作。
导入包:
import time
from io import BytesIO
from PIL import Image
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
初始化
建立实现类,设置账号、密码、浏览器对象、等待对象、url参数,进行初始化:
class bilibili():
def __init__(self, phone, password):
"""
初始化
:param phone: 账号
:param password: 密码
"""
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('start-fullscreen')
self.browser = webdriver.Chrome(options=chrome_options)
self.wait = WebDriverWait(self.browser, 15)
self.url = 'https://passport.bilibili.com/login'
self.phone = phone
self.password = password
打开B站进行登录
-
打开B站:
browser.get()
; -
查找输入账号、密码、登录节点;
-
输入账号、密码:
send_keys()
; -
点击登录:
click()
;
def open(self):
"""
打开网页,输入账号、密码,点击
"""
self.browser.get(self.url)
phone = self.wait.until(EC.presence_of_element_located((By.ID, 'login-username')))
password = self.wait.until(EC.presence_of_element_located((By.ID, 'login-passwd')))
button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'btn.btn-login')))
phone.send_keys(self.phone)
password.send_keys(self.password)
button.click()
完成上述后,就会出现验证图片。
滑块验证图片分析
实现滑动验证,首先是需要找到移动的位置,这是关键。
思路是:找到残缺图和原图,进行像素的比较,找到不同的位置(相差大于某个阈值)
1、如何显示残缺图(不带🧩)和原图?
我们通过谷歌,检查,找到验证图片,分析它内部结构,结果我们发现:
若我们将以下的display