Python +Selenium解决图片验证码登录或注册问题(推荐)

Python+Selenium结合使用可以帮助我们在自动化测试、爬虫等场景中解决图片验证码登录或注册问题。下面是Python+Selenium解决图片验证码登录或注册的完整攻略:

Python+Selenium结合使用可以帮助我们在自动化测试、爬虫等场景中解决图片验证码登录或注册问题。下面是Python+Selenium解决图片验证码登录或注册的完整攻略:

准备工作

在使用Python+Selenium结合使用之前,我们需要安装好以下工具:

  1. Python3:可以从Python官网下载安装包并安装。
  2. Selenium WebDriver:可以从Selenium官网下载适合自己浏览器的WebDriver,并按照教程配置好环境变量。
  3. Chrome或Firefox浏览器:Selenium默认支持这两种浏览器,所以我们需要安装其中的一种。

实现步骤

  1. 导入Python和Selenium依赖库
from selenium import webdriver
import time
  1. 打开浏览器并访问目标网站
driver = webdriver.Chrome() # 打开Chrome浏览器
driver.get("http://www.example.com/login") # 访问登录页面
  1. 元素定位与截图

我们需要找到验证码图片的位置,并通过Selenium截图工具将其保存为本地图片。对于验证码图片而言,相对定位是比较常见的方式,需要借助开发者工具或浏览器插件等工具进行定位。

code_img = driver.find_element_by_id("code_img")
left = code_img.location['x'] # 相对于页面左上角的X轴坐标
top = code_img.location['y'] # 相对于页面左上角的Y轴坐标
right = left + code_img.size['width'] # 右边界
bottom = top + code_img.size['height'] # 下边界
screenshot_path = "./screenshot/code.png"
driver.save_screenshot(screenshot_path) # 截图并保存到本地
img = Image.open(screenshot_path).crop((left, top, right, bottom)) # 使用PIL库裁剪图片
img_path = "./screenshot/code_cut.png"
img.save(img_path) # 保存图片
  1. 使用Python的第三方验证码识别库进行验证码识别

Python中有多个第三方验证码识别库可供选择。这里以pytesseract为例,示例代码如下:

import pytesseract
from PIL import Image

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe" # 需要指定tesseract的安装路径

text = pytesseract.image_to_string(Image.open(img_path))
print("验证码为:", text)
  1. 输入验证码并提交表单
driver.find_element_by_id("username").send_keys("username")
driver.find_element_by_id("password").send_keys("password")
driver.find_element_by_id("code").send_keys(text)
driver.find_element_by_id("submit").click()
  1. 关闭浏览器
driver.quit()

示例说明

示例一:豆瓣登录

本示例以豆瓣登录为例,演示如何使用Python+Selenium解决图片验证码登录问题。

from selenium import webdriver
import time
from PIL import Image
import pytesseract

# 打开浏览器并访问登录页面
driver = webdriver.Chrome()
driver.get("https://accounts.douban.com/passport/login")

# 找到验证码图片并进行截图
code_img = driver.find_element_by_xpath("//img[@id='captcha_image']")
left = code_img.location['x']
top = code_img.location['y']
right = left + code_img.size['width']
bottom = top + code_img.size['height']
screenshot_path = "./screenshot/code.png"
driver.save_screenshot(screenshot_path)
img = Image.open(screenshot_path).crop((left, top, right, bottom))
img_path = "./screenshot/code_cut.png"
img.save(img_path)

# 识别验证码
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
text = pytesseract.image_to_string(Image.open(img_path))
print("验证码为:", text)

# 输入用户名、密码和验证码,点击登录按钮
driver.find_element_by_id("username").send_keys("username")
driver.find_element_by_id("password").send_keys("password")
driver.find_element_by_id('captcha_field').send_keys(text)
driver.find_element_by_xpath("//input[@class='btn btn-account btn-active']").click()

# 输出登录结果
time.sleep(1)
print(driver.current_url)
print(driver.title)

# 关闭浏览器
driver.quit()

示例二:CSDN注册

本示例以CSDN注册为例,演示如何使用Python+Selenium解决图片验证码注册问题。

from selenium import webdriver
import time
from PIL import Image
import pytesseract

# 打开浏览器并访问注册页面
driver = webdriver.Chrome()
driver.get("https://passport.csdn.net/register")

# 找到验证码图片并进行截图
code_img = driver.find_element_by_xpath("//img[@id='capImg_phone']")
left = code_img.location['x']
top = code_img.location['y']
right = left + code_img.size['width']
bottom = top + code_img.size['height']
screenshot_path = "./screenshot/code.png"
driver.save_screenshot(screenshot_path)
img = Image.open(screenshot_path).crop((left, top, right, bottom))
img_path = "./screenshot/code_cut.png"
img.save(img_path)

# 识别验证码
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
text = pytesseract.image_to_string(Image.open(img_path))
print("验证码为:", text)

# 输入手机号、密码、姓名和验证码,点击注册按钮
driver.find_element_by_id("phone").send_keys("13812345678")
driver.find_element_by_id("pwd").send_keys("password")
driver.find_element_by_name("repassword").send_keys("password")
driver.find_element_by_name("realname").send_keys("张三")
driver.find_element_by_id("capcha").send_keys(text)
driver.find_element_by_class_name("logging").click()

# 关闭浏览器
driver.quit()

本文标题为:Python +Selenium解决图片验证码登录或注册问题(推荐)

基础教程推荐