前文
文件内容是关于使用Python进行网络爬虫时如何处理验证码的问题。特别是验证码的识别。
1 简介
1.1验证码的识别:
-
验证码是网站用来防止自动化脚本的一种安全措施,随着技术的发展,验证码的形式越来越复杂,包括图形验证码、滑动验证码、点选验证码和手机验证码等。
-
验证码的识别方法多样,有的可以通过图像处理库识别,有的需要深度学习技术,还有的需要借助工具和平台。
1.2 使用OCR技术识别图形验证码:
-
OCR(Optical Character Recognition,光学字符识别)
技术可以识别打印在纸上的字符,将其转换成计算机文字。 -
对于简单的图形验证码,可以使用OCR技术进行识别。
2 操作步骤
2.1 准备工作:
-
需要安装tesserocr库,以及其他辅助库如Selenium、Pillow、NumPy和retrying。
-
安装命令示例:
pip3 install selenium Pillow numpy retrying
2.2 保存验证码图片:
-
将验证码图片保存到本地,以便进行识别。
2.3 识别测试:
-
使用tesserocr库的image_to_text方法识别验证码图片。
-
代码示例:
import tesseroct
from PIL import Image
image = Image.open('captcha.png')
result = tesseroct.image_to_text(image)
print(result)
2.4 处理验证码:
-
对于有干扰的验证码图片,需要进行预处理以去除干扰信息。
-
通过颜色阈值处理,将图片转化为灰度图像,并去除干扰点。
-
代码示例:
from PIL import Image
import numpy as np
image = Image.open("captcha2.png")
image = image.convert('L')
threshold = 50
array = np.array(image)
array = np.where(array > threshold, 255, 0)
image = Image.fromarray(array.astype("uint8"))
image.show()
3 识别实战:
-
使用Selenium自动化操作浏览器,结合tesserocr进行验证码识别。
-
定义preprocess方法进行图片预处理,去除噪声。
-
定义login方法进行登录操作,包括识别验证码并输入。
-
代码示例:
import time
import re
import tesseroct
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
from selenium.common.exceptions import TimeoutException
from PIL import Image
import numpy as np
from retrying import retry
def preprocess(image):
image = image.convert("L")
array = np.array(image)
array = np.where(array > 50, 255, 0)
image = Image.fromarray(array.astype("uint8"))
return image
@retry(stop_max_attempt_number=10, retry_on_result=lambda x: x is False)
def login():
browser = webdriver.Chrome()
browser.get("https://captcha7.scrape.center/")
browser.find_element_by_css_selector(".usernameinput[type='text']").send_keys('admin')
browser.find_element_by_css_selector(".password input[type='password']").send_keys('admin')
captcha = browser.find_element_by_css_selector('#captcha')
image = Image.open(BytesIO(captcha.screenshot_as_png))
image = preprocess(image)
captcha_text = tesseroct.image_to_text(image)
captcha_text = re.sub("[^A-Za-z0-9]", "", captcha_text)
browser.find_element_by_css_selector(".captcha input[type='text']").send_keys(captcha_text)
browser.find_element_by_css_selector(".login").click()
try:
WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, "//h2[contains(text, '登录成功')]")))
time.sleep(10)
browser.close()
return True
except TimeoutException:
return False
if __name__ == "__main__":
login()
识别结果:
通过自动化测试,如果识别正确,页面会显示“登录成功”,否则需要重试。
文章持续跟新,可以微信搜一搜公众号 [ rain雨雨编程 ],或扫描下方二维码,第一时间阅读,涉及爬虫,机器学习,Java编程,实战项目等。