目录
一、实验目的
部分网站可能会使用验证机制来阻止用户无效登录或者是验证用户不是用程序控制访问网站的,如 reCAPTCHA 系统。本次实验主要针对常见的验证机制:验证码进行分析和识别,这里可以使用传统和OCR技术或者基于神经网络的机器学习技术。
二、实验预习提示
1、为Python安装Selenium、PyQuery库,安装Chrome和对应ChromeDriver(见实验一)
2、为Python安装深度机器学习库和图像处理库:pytorch,python-opencv
3、为Python安装OCR库:Python第三方模块tesserocr安装 - 寒爵 - 博客园 (cnblogs.com)
注意:TESSDATA_PREFIX变量应该是包含tessdata子目录
三、实验内容
登录网站1:https://captcha7.scrape.center
登录网站2:https://captcha8.scrape.center
使用图像识别库或者训练过的神经网络模型对登录网站1的验证码进行识别,然后把识别结果用代码填入,然后再进行登录,用户名和密码都是:admin。
实验要求
基本要求:
使用一个合适的技术将登录网站1的验证码进行识别,并由代码自动登录。注意事项:所有信息必须由代码自动填入并且自动操作,无需人工填入任何信息或使用人工交互。
改进要求A:
在完成基本要求的基础上,
选项一:实现登录网站2的模拟登录,注意事项见基本要求;
选项二:实现对于带有验证登录方式(如验证码,滑动条,拼图,语序点击,空间推理,图文点击等)的常见网站。
改进要求B:
在完成基本要求的基础上,训练一个神经网络模型使得在给出测试集上准确率至少达到80%以上。框架代码:DeepLearningImageCaptcha-master.zip,测试集:dataset.zip
四、实验过程
基本要求
该实验可以从以下几个步骤执行
1. 打开游览器,打开对应网站
2. 获取用户名密码输入框并赋值
3. 获取验证码
4. 处理验证码
这里使用了ocr的升级版ddddocr , 为了提高识别验证码的精度,这里还用了正则表达式,替换掉验证码开头的符号(有时候会出现)
5. 获取验证码输入框并赋值
6. 获取登录按钮并点击登录
7. 登录成功与失败
如果登录成功就1s后关闭游览器,否则清空验证码输入框,获取心得验证码,继续登录,直到登录成功为止。
8. 控制台输出
总结:本实验前期利用 Tesserocr 识别验证码的过程并将其应用于实战案例中实现了模拟登录。为了提高 Tesserocr 的识别准确率,可以对验证码图像进行预处理去除一些干扰,识别准确率会大大提高;但最后还是转入它的升级版ddddocr。
五、源码如下
import re
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
import ddddocr
DDDDOCR_DDDD_OCR = ddddocr.DdddOcr()
# 验证码处理
def codeDispose(v_code):
ocr = DDDDOCR_DDDD_OCR
res = ocr.classification(v_code.screenshot_as_png)
# 验证码前面非字母数字 用空格替换
res = re.sub('[^A-Za-z0-9]', '', res)
return res
def login():
# 打开游览器
driver = webdriver.Chrome()
driver.get("https://captcha7.scrape.center/")
# 获取用户名密码输入框并赋值
driver.find_element(By.CSS_SELECTOR, '.username input').send_keys('admin')
driver.find_element(By.CSS_SELECTOR, '.password input').send_keys('admin')
def code():
# 获取验证码
v_code = driver.find_element(By.ID, value='captcha')
v_code.click() # 刷新验证码
print("未处理的验证码", v_code)
v_code = codeDispose(v_code) # 处理验证码
print("输入验证码:", v_code)
# 获取验证码输入框并赋值
driver.find_element(By.CSS_SELECTOR, '.captcha input').send_keys(v_code)
time.sleep(1)
# 获取登录按钮并点击
driver.find_element(By.CSS_SELECTOR, '.login').click()
try:
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//h2[contains(.,"登录成功")]')))
time.sleep(1)
# 登录成功自动关闭游览器
driver.close()
print("登录成功")
except Exception as err:
print(f"登录失败:{err}")
# 清空输入框
driver.find_element(By.CSS_SELECTOR, '.captcha input').clear()
print('成功清空输入框')
code() # 再次登录
code()
if __name__ == '__main__':
login()
六、资料
1. 实验框架代码:
import tesserocr
from PIL import Image
import numpy as np
image = Image.open('code.png')
# 方式1
result = tesserocr.image_to_text(image)
print(result) # ‘PFRT.
# 方式2
print(tesserocr.file_to_text('code.png')) # ‘PFRT.
# 转为数组
print(np.array(image).shape)
print(image.mode)
code.png 如下:
2. 免费GPU训练资源:
3. 实验小提示
也可以使用打码平台API的调用完成验证码识别。
恭喜你成功地学完了我的所有爬虫内容!希望你已经获得了有用的信息和技巧,并且能够将其应用到实践中。如果有任何问题或疑虑,请随时与我联系。祝你好运!
实战源码:Python网络爬虫实战