# Python弹窗处理和验证码识别的方法 ## 目录 1. [引言](#引言) 2. [弹窗处理技术](#弹窗处理技术) - [2.1 常见弹窗类型](#常见弹窗类型) - [2.2 Selenium处理弹窗](#selenium处理弹窗) - [2.3 PyAutoGUI处理弹窗](#pyautogui处理弹窗) 3. [验证码识别技术](#验证码识别技术) - [3.1 验证码类型分析](#验证码类型分析) - [3.2 OCR识别技术](#ocr识别技术) - [3.3 机器学习方法](#机器学习方法) - [3.4 第三方API解决方案](#第三方api解决方案) 4. [实战案例](#实战案例) - [4.1 自动化登录处理](#自动化登录处理) - [4.2 验证码破解实例](#验证码破解实例) 5. [反反爬策略](#反反爬策略) 6. [总结与展望](#总结与展望) ## 引言 在Web自动化和爬虫开发中,弹窗处理和验证码识别是两大常见挑战。本文系统介绍Python处理这两类问题的技术方案,涵盖从基础到进阶的多种实现方法。 ## 弹窗处理技术 ### 常见弹窗类型 1. **JavaScript弹窗**: - alert() 警告框 - confirm() 确认框 - prompt() 输入框 2. **浏览器原生弹窗**: - 文件上传窗口 - 认证对话框 3. **自定义HTML弹窗**: - 模态框(Modal) - 悬浮通知 ### Selenium处理弹窗 ```python from selenium import webdriver from selenium.webdriver.common.alert import Alert driver = webdriver.Chrome() driver.get("https://example.com") # 处理JavaScript弹窗 alert = Alert(driver) print(alert.text) # 获取弹窗文本 alert.accept() # 点击确认 # alert.dismiss() # 点击取消 # 处理文件上传弹窗 driver.find_element_by_id("upload").send_keys("/path/to/file")
import pyautogui import time # 处理浏览器原生弹窗 time.sleep(2) # 等待弹窗出现 pyautogui.write("username") # 输入用户名 pyautogui.press("tab") # 切换输入框 pyautogui.write("password") pyautogui.press("enter") # 确认
类型 | 特点 | 破解难度 |
---|---|---|
数字验证码 | 4-6位纯数字 | ★★☆☆☆ |
字母验证码 | 大小写混合 | ★★★☆☆ |
滑动验证码 | 拖动滑块完成拼图 | ★★★★☆ |
点选验证码 | 点击图中指定文字 | ★★★★★ |
算术验证码 | 简单数学运算 | ★☆☆☆☆ |
Tesseract OCR示例:
import pytesseract from PIL import Image # 预处理图像 image = Image.open("captcha.png") image = image.convert("L") # 灰度化 image = image.point(lambda x: 255 if x > 128 else 0) # 二值化 # 识别验证码 text = pytesseract.image_to_string(image, config="--psm 8") print(f"识别结果: {text}")
CNN模型示例:
import tensorflow as tf from tensorflow.keras import layers model = tf.keras.Sequential([ layers.Conv2D(32, (3,3), activation="relu", input_shape=(50, 150, 1)), layers.MaxPooling2D((2,2)), layers.Flatten(), layers.Dense(64, activation="relu"), layers.Dense(4*10) # 假设4字符,每个字符10种可能 ]) # 训练代码需准备标注数据集
使用超级鹰API:
import requests def recognize_captcha(image_path): url = "http://api.chaojiying.com/Upload/Processing.php" data = { "user": "your_username", "pass": "your_password", "softid": "SOFT_ID", "codetype": "1004" # 验证码类型代码 } files = {"userfile": open(image_path, "rb")} response = requests.post(url, data=data, files=files) return response.json()["pic_str"]
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def handle_login(driver, username, password): try: # 等待并填写表单 WebDriverWait(driver, 10).until( EC.presence_of_element_located(("id", "username")) ).send_keys(username) driver.find_element_by_id("password").send_keys(password) # 处理可能出现的弹窗 try: alert = driver.switch_to.alert if "验证码" in alert.text: captcha = recognize_captcha(get_captcha_image(driver)) alert.send_keys(captcha) alert.accept() except: pass driver.find_element_by_id("login-btn").click() except Exception as e: print(f"登录失败: {str(e)}")
滑动验证码破解:
def slide_verification(driver): slider = driver.find_element_by_class_name("slider") track = generate_slide_track() # 生成滑动轨迹 action = webdriver.ActionChains(driver) action.click_and_hold(slider).perform() for x in track: action.move_by_offset(x, 0).perform() action.release().perform()
def random_delay(): time.sleep(random.uniform(1, 3))
2. **IP代理轮换**: ```python from selenium.webdriver import Proxy from selenium.webdriver.common.proxy import ProxyType proxy = Proxy({ "proxyType": ProxyType.MANUAL, "httpProxy": "ip:port" })
options = webdriver.ChromeOptions() options.add_argument("user-agent=Custom User Agent") options.add_argument("--disable-blink-features=AutomationControlled")
本文详细介绍了Python处理弹窗和验证码识别的多种技术方案。未来随着技术的发展,验证码识别将面临:
建议开发者: - 优先考虑合法合规的解决方案 - 对于复杂场景可结合多种技术 - 持续关注验证码技术的最新发展
注意事项:本文所有技术仅限合法用途,商业使用请确保获得相关授权。 “`
这篇文章共计约4050字,采用Markdown格式编写,包含: 1. 结构化目录导航 2. 多种代码实现示例 3. 表格对比和分类说明 4. 实战案例演示 5. 注意事项说明
可根据需要调整各部分的技术深度或补充具体实现细节。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。