java + selenium + ChromeDiver 实现网络爬虫 (一)实现登录页访问

今天接到个新活,主要是想要爬取数据。四年前自己用java写过一个简单的爬虫demo,但是有局限性。只能爬取网站给定的可爬地址,不然就会死循环。爬来的数据非常乱,不可以对复杂js进行解析。

今天接到这个需求是想爬取几个网站,存到自己的搜索引擎里,搜索关键字把这个数据的所有信息展示,包括下载附件等信息。另一种是数据库信息的爬取。

网站信息爬取我们选的是selenium + ChromeDiver,数据库信息爬取我们选择的是kettle 。接下来说明一下自己具体的操作

1.首先自己建了一个maven项目,然后再pom文件里引入jar包

<dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-remote-driver</artifactId>
            <version>3.9.0</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.9.0</version>
        </dependency>
        
        <dependency>
            <groupId>net.sourceforge.tess4j</groupId>
            <artifactId>tess4j</artifactId>
            <version>3.2.1</version>
        </dependency>

* 这里有人会问为什么引入tess4j.jar  ???

前面说到,我们要做网页登录。网站登录基本信息就包括 用户名、密码、验证码。

验证码这个地方我们的想法是:刚获取到页面信息是将整体页面截图,然后获取验证码位置,对验证码进行截图--》保存本地

最后用tess4j对图片进行解析获得 String类型的字符串

2.上代码看看具体实现过程

 

package com.zhaxd.web.utils;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
public class CrawlerUtil {

    public static void main(String[] args) throws InterruptedException, IOException, TesseractException {

        //D:\\chromedriver.exe  ???

        //D:\\chromedriver.exe  谷歌浏览器的驱动地址
        System.getProperties().setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
        WebDriver chrome = new ChromeDriver();
        //进入项目登录页--登录页地址
     

chrome.get("http://10.10.10.163:8080/unityplatform/loginController.do?login");
        Thread.sleep(2000);
        chrome.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        java.io.File screenshot = ((TakesScreenshot)chrome).getScreenshotAs(OutputType.FILE);
        BufferedImage  fullImg = ImageIO.read(screenshot);
        //获取验证码位置
        WebElement ele = chrome.findElement(By.id("randCodeImage"));
        Dimension size = ele.getSize();
        //截取验证码图片
        BufferedImage eleScreenshot= fullImg.getSubimage(ele.getLocation().x+340, ele.getLocation().y+240,
                size.getWidth()+25, size.getHeight());
        ImageIO.write(eleScreenshot, "png", screenshot);
        //保存验证码图片
        File screenshotLocation = new File("D:/selenium/test.png");
        FileUtils.copyFile(screenshot, screenshotLocation);
        //tess4j解析验证码图片
        Tesseract tesseract = new Tesseract(); 
        tesseract.setDatapath("D:/Tess4J/tessdata"); 
        String text= tesseract.doOCR(new File("D:/selenium/test.png")); 
        WebElement usernameInput = chrome.findElement(By.id("userNameFake"));
        usernameInput.sendKeys("admin");
        Thread.sleep(2000);
        chrome.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        WebElement passwordInput = chrome.findElement(By.id("passwordFake"));
        passwordInput.sendKeys("admin");
        Thread.sleep(2000);
        chrome.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        WebElement randCodeInput = chrome.findElement(By.id("randCode"));
        randCodeInput.sendKeys(text);

        Thread.sleep(2000);
        chrome.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        WebElement loginButton = chrome.findElement(By.xpath("//*[@id=\"btnLogin\"]"));
        loginButton.click();
        Thread.sleep(3000);

        // 具体用途?每一次和driver交互的等待时间?还是某些特定环节发生的等待时间?
        chrome.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        chrome.close();
        chrome.quit();
    }
}

上面标红的地方解答:标题提到我们用到的浏览器是谷歌,那我们需要下载个谷歌浏览器,还需要对应的下载Chromediver,

本人谷歌浏览器下载的版本是:版本 81.0.4044.92(正式版本) (64 位)

然后需要去对应的下载Chromediver

http://chromedriver.storage.googleapis.com/index.html

下载完成解压到D盘下

java + selenium + ChromeDiver 实现网络爬虫 (一)实现登录页访问

3.最后看一下结果

java + selenium + ChromeDiver 实现网络爬虫 (一)实现登录页访问

java + selenium + ChromeDiver 实现网络爬虫 (一)实现登录页访问