使用tess4j原因是验证码图片地址由js动点击打开链接态生成,和时间戳有关,导致常规爬虫获取图片地址下载的方法得到的验证码与网页显示的不同,所以想到使用截屏方案截取验证码图片,使用tess4j进行识别,达到自动识别的目的,识别率有点低。
版本java1.8 tess4j 3.4 selenium-java 3.6.0
1.eclipse新建java项目,将下载的tess4j解压后,将dist目录下的jar文件复制到lib目录下,然后将lib目录,src目录,tessdata目录复制到新建的java项目中,将下载的selenium-java中所有jar文件复制到eclipse新建的项目中。
2.将所有jar文件添加到build path中,windows下,将tess4j解压目录下lib目录下win32-x86(32位系统)或win32-x86-64(64位系统)下dll文件导入到项目中。linux开发环境需要将tesseract-ocr的so文件复制到对应目录,步骤应该如下:
安装leptonica
wget http://www.leptonica.org/source/leptonica-1.71.tar.gz
tar -zxvf ...
./configure
make
make install
安装tesseract-ocr
wget http://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.02.tar.gz
./autogen.sh
./configure
make
make install
ldconfig
参考:http://www.jianshu.com/p/51537319a467
已经配置tesseract-ocr执行下面命令:主要看linux系统so文件放到了哪里。
cp /usr/local/lib/*.so.* /usr/lib64/ centos
cp /usr/local/lib/*.so.* /usr/lib/ ubuntu
若不安装,则下载所有so文件,然后将目录下的文件复制到对应目录下
3.项目环境配置完毕,关键代码如下:
识别简单验证码函数,参数为图片路径,验证码由字母和数字组成:
public String IdentifyCode(String path) {
File imageFile = new File(path);
ITesseract instance = new Tesseract();
//图片二值化,增加识别率
BufferedImage grayImage = null;
try {
grayImage = ImageHelper.convertImageToBinary(ImageIO.read(imageFile));
} catch (IOException e2) {
e2.printStackTrace();
}
try {
ImageIO.write(grayImage, "png", new File(System.getProperty("user.dir") + "/img", "vc1.png"));
} catch (IOException e1) {
e1.printStackTrace();
}
String path1 = System.getProperty("user.dir") + "/img/vc1.png";
File imageFile1 = new File(path1);
String result = null;
try {
result = instance.doOCR(imageFile1);
} catch (TesseractException e1) {
e1.printStackTrace();
}
result=result.replaceAll("[^a-z^A-Z^0-9]", "");
return result;
}
public byte[] takeScreenshot(WebDriver driver) throws IOException {
WebDriver augmentedDriver = new Augmenter().augment(driver);
return ((TakesScreenshot) augmentedDriver).getScreenshotAs(OutputType.BYTES);
}
public BufferedImage createElementImage(WebDriver driver, WebElement webElement,int x,int y,int width,int heigth) throws IOException {
Dimension size = webElement.getSize();
BufferedImage originalImage = ImageIO.read(new ByteArrayInputStream(takeScreenshot(driver)));
// Point location = webElement.getLocation();
// BufferedImage croppedImage = originalImage.getSubimage(location.getX(),location.getY(), size.getWidth(),size.getHeight());//linux注释下面一行代码,取消此行和上一行注释,可正确截图
BufferedImage croppedImage = originalImage.getSubimage(x, y, size.getWidth() + width, size.getHeight() + heigth);//windows下,浏览器最大化后浏览器截图,获取的x、y坐标不可直接使用,推测和屏幕分辨率有关。
return croppedImage;
}
4.浏览器及驱动下载目录,可去http://www.seleniumhq.org/download/下载,
其中主要浏览器下载:
火狐驱动: https://github.com/mozilla/geckodriver/releases/
IE驱动: http://selenium-release.storage.googleapis.com/index.html
谷歌驱动: http://chromedriver.storage.googleapis.com/index.html(谷歌浏览器驱动下载地址)
http://blog.csdn.net/huilan_same/article/details/51896672(对应版本)
驱动放到浏览器安装目录下,也可以代码中指定路径:
如:
System.setProperty("webdriver.gecko.driver", driverPath); //火狐浏览器驱动
System.setProperty("webdriver.chrome.driver", driverPath);//谷歌浏览器驱动
注意驱动版本应与浏览器版本对应。