English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Пример кода для распознавания и ввода капчи с помощью selenium в python

Из-за необходимости работы, для входа на сайт требуется ввод капчи. Вначале я занимался исследованием распознавания капч, но не мог получить ту капчу, которую мне нужно было. Только на этой неделе я вспомнил об этом, и вчера успешно решил проблему.

Теперь к делу:

Версия python: 3.4.3

Необходимые библиотеки: PIL, selenium, tesseract

Рассмотрим код:

#coding:utf-8
import subprocess
from PIL import Image
from PIL import ImageOps
from selenium import webdriver
import time,os,sys
def cleanImage(imagePath):
  image = Image.open(imagePath)  #打开图片
  image = image.point(lambda x: 0 if x<143 else 255) #处理图片上的每个像素点,使图片上每个点“非黑即白”
  borderImage = ImageOps.expand(image,border=20,fill='white')
  borderImage.save(imagePath)
def getAuthCode(driver, url="http://localhost/"):
  captchaUrl = url + "common/random"
  driver.get(captchaUrl) 
  time.sleep(0.5)
  driver.save_screenshot("captcha.jpg")  #截图,并保存图片
  #urlretrieve(captchaUrl, "captcha.jpg")
  time.sleep(0.5)
  cleanImage("captcha.jpg")
  p = subprocess.Popen(["tesseract", "captcha.jpg", "captcha"], stdout=\
             subprocess.PIPE,stderr=subprocess.PIPE)
  p.wait()
  f = open("captcha.txt", "r")
  #Clean any whitespace characters
  captchaResponse = f.read().replace(" ", "").replace("\n", "")
  print("Captcha solution attempt: " + captchaResponse)
  if len(captchaResponse) == 4:
    return captchaResponse
  else:
    return False
def withoutCookieLogin(url="http://org.cfu666.com/"):
  driver = webdriver.Chrome()
  driver.maximize_window()
  driver.get(url)
  while True:   
    authCode = getAuthCode(driver, url)
    если authCode:
      driver.back()
      driver.find_element_by_xpath("//input[@id='orgCode' and @name='orgCode']").clear()
      driver.find_element_by_xpath("//input[@id='orgCode' and @name='orgCode']").send_keys("orgCode")
      driver.find_element_by_xpath("//input[@id='account' and @name='username']").clear()
      driver.find_element_by_xpath("//input[@id='account' and @name='username']").send_keys("username")
      driver.find_element_by_xpath("//input[@type='password' and @name='password']").clear()
      driver.find_element_by_xpath("//input[@type='password' and @name='password']").send_keys("password")       
      driver.find_element_by_xpath("//input[@type='text' and @name='authCode']").send_keys(authCode)
      driver.find_element_by_xpath("//button[@type='submit']").click()
      пробовать:
        time.sleep(3)
        driver.find_element_by_xpath("//*[@id='side-menu']/li[2]/ul/li/a").click()
        return driver
      за исключением:
        печать("ошибка кода аутентификации:", authCode)
        driver.refresh()
  return driver
driver = withoutCookieLogin("http://localhost/")
driver.get("http://localhost/enterprise/add/")

Как получить необходимые нам капчи

На этом пути получения капчи я упал в слишком много ям, читал слишком много статей, многие из которых учат вас методам распознавания капчи, но не объясняют, как получить текущую необходимую вам картинку капчи.

Мой способ обработки:

1. Сначала с помощью selenium откройте адрес страницы входа, который вам нужно открыть, url1

2. Получите адрес капчи url2 через элемент проверки (на самом деле самым простым способом является открытие нового окна с правой кнопкой мыши)

3: Введите адрес url1 на странице url1, перейдите на страницу url2, затем сделайте скриншот и сохраните страницу капчи

4: Обработайте капчу и получите строку капчи. Затем нажмите кнопку "назад" в браузере, чтобы вернуться на страницу входа url1

5: Введите информацию, необходимую для входа, и капчу

6: Нажмите на вход

7: Проверьте страницу после входа в систему,判断是否成功, если не успешен,则需要重新执行1-7的操作。

Для защиты информации компании, эта страница - это моя местная служба, я тестировал этот способ получения капчи на странице регистрации Bole Online, и это можно сделать. (Этот способ обработки капчи действует только для капчи с фоном в виде пикселей, если капча содержит горизонтальные линии, потребуется дополнительная обработка.)

Вот весь контент статьи, надеюсь, он поможет вам в изучении, и希望大家多多支持呐喊教程。

Заявление: содержимое этой статьи взято из Интернета, авторское право принадлежит соответствующему автору, контент предоставлен пользователями Интернета в добровольном порядке, сайт не обладает правами собственности, не underwent редактирование в人工, и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите содержимое,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма, пожалуйста, замените # на @) для сообщения о нарушении, и предоставьте соответствующие доказательства. При обнаружении факта нарушения, сайт немедленно удаляет涉嫌侵权的内容.

Основной учебник
Рекомендуется для вас