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

python+Beispielcode zur Erkennung und Anmeldung von Captchas mit Selenium

Da ich meine Arbeit erfordert, muss ich mich auf der Website mit einem Captcha anmelden. Zunächst habe ich mich mit der Erkennung von Captchas beschäftigt, aber ich konnte nie den benötigten Captcha erhalten. Bis Freitag erinnerte ich mich daran, und gestern habe ich es erfolgreich gelöst.

Jetzt zur Sache:

Python-Version:3.4.3

Benötigte Bibliotheken: PIL, selenium, tesseract

Hier ist der Code:

#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)  #Öffne das Bild
  image = image.point(lambda x: 0 if x<143 else 255) #Behandle jeden Pixel des Bildes, um sicherzustellen, dass jeder Punkt "nicht schwarz oder weiß" ist
  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")  #Screencapture und Bild speichern
  #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")
  #Entferne alle Leerraumzeichen
  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)
    if authCode:
      driver.back()
      driver.find_element_by_xpath("//input[@id='orgCode' and @name='orgCode']
      driver.find_element_by_xpath("//input[@id='orgCode' and @name='orgCode']
      driver.find_element_by_xpath("//input[@id='account' and @name='username']
      driver.find_element_by_xpath("//input[@id='account' and @name='username']
      driver.find_element_by_xpath("//input[@type='password' and @name='password']
      driver.find_element_by_xpath("//input[@type='password' and @name='password']       
      driver.find_element_by_xpath("//input[@type='text' and @name='authCode']
      driver.find_element_by_xpath("//button[@type='submit']
      try:
        time.sleep(3")
        driver.find_element_by_xpath("//*[@id='side-menu']/li[2]/ul/li/a.click()
        return driver
      except:
        print("authCode Error:", authCode)
        driver.refresh()
  return driver
driver = withoutCookieLogin("http://localhost/
driver.get("http://localhost/enterprise/add/

怎么获取我们需要的验证码

在这获取验证码的道路上,我掉了很多坑,看过很多文章,很多都是教你验证码的识别方法,但是没有说明,怎么获取你当前需要的验证码图片。

我的处理方法是:

1.先用selenium打开你需要的登录的页面地址url1

2.通过审核元素获取验证码的地址url2(其实最简单的是右键打开新页面)

3:在url1页面,输入地址url2进入url2页面,然后截屏保存验证码页面

4:处理验证码得到验证码字符串。然后点击浏览器后退按钮,返回url1登录页面

5:输入登录所需的信息和验证码

6:点击登录

7:验证登录后的页面,判断是否成功,若不成功则需要重新1-7的操作。

为了保护公司的信息,这个页面是我本地搭建的服务。我在伯乐在线注册页面进行测试过这个验证码获取方法,可以通过。(这个验证码的处理方法,仅限验证码背景是像素点,若验证码有横线需额外处理。)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

声明:本文内容来源于互联网,版权归原作者所有。内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#oldtoolbag.com(在发邮件时,请将#更换为@进行举报,并提供相关证据。一经查实,本站将立刻删除涉嫌侵权内容。)

Gefällt mir