Selenium下自动识别验证码登陆

  • A+
所属分类:安全文章

介绍

 在自动化或者爬虫登陆网站时经常遇到验证码模块,这也算是反爬的一种手段。这篇文章将介绍如何在selenium框架下自动识别验证码登陆。

一:安装Tesseract-ocr

 Tesseract-ocr是文字识别系统,能识别英文、数字,如果需要识别汉字,则需要导入汉字语言包。

  • 在Windows下安装
      下载地址:Tesseract-ocr,这里可以选择版本,本机中选择4.0.0版。下载后默认安装,这里可以选择修改原安装路径,但修改后在后续进行环境变量的配置时记得更改。   安装完毕后,配置系统环境变量。在Path一项中新增Tesseract-ocr的安装路径。

Selenium下自动识别验证码登陆

  接着在系统变量中新建如下系统变量,告诉Tesseract-ocr数据集的位置。

Selenium下自动识别验证码登陆

  然后验证是否安装成功。

Selenium下自动识别验证码登陆

  • 在Linux下安装
      直接执行:apt install tesseract-ocr。

二:python脚本

from selenium import webdriverfrom PIL import Image  browser = webdriver.Chrome()  host = "https://www.baidu.com"browser.get(host)# 获取整个网页的截图browser.save_screenshot("temp.png")# 获取元素位置element = browser.find_element_by_css_selector("img") location = element.location size = element.size# # 计算出元素位置图像坐标img = Image.open("temp.png") left = location['x'] + 145top = location['y'] + 90right = location['x'] + size['width'] + 155bottom = location['y'] + size['height'] + 100img = img.crop((int(left), int(top), int(right), int(bottom))) img.save('screenshot.png')  # 是否保存图像log = os.system('tesseract screenshot.png png -l eng') keyword = open('png.txt', 'r').readline().rstrip('n') rex = re.compile(r'D')if re.search(rex, keyword) != None:     print('错误的验证码:' + keyword)else:     print('keyword is ' + keyword)

 代码说明:selenium自带有截图功能,如果是选择非PhantomJS作为浏览器的话,当使用browser.save_screenshot("temp.png")时截的只是当前浏览器窗口显示的图片而不是整个网页,但使用PhantomJS时,截取的是整个网页。  selenium也可以选择区域或网页元素进行截图,不过需要PIL辅助,先从网页中获取该元素的位置,然后使用PIL Image里的crop截取。这里需要注意,如果使用例如Chrome等浏览器而非PhantomJS的话,会因为浏览器弹出的位置不同,导致无法准确的截到该元素的位置,需要自己反复调节,但使用PhantomJS时不会有这个问题。

 可以注意到,我这里是使用系统调用的方法进行识别,但有另一种方法是安装pyocr。直接执行pip install pyocr即可。由于作者不熟悉,加之有急需,故不再演示,只提出方法。

本文转载于:https://delcoding.github.io/2017/11/selenium-verity-code/


本文始发于微信公众号(逢人斗智斗勇):Selenium下自动识别验证码登陆

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: