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盘下
3.最后看一下结果