Selenium 在爬虫中的应用
什么是 Selenium
Selenium 是目前用的最广泛的 Web UI 自动化测试框架。
核心功能是在多个浏览器上进行自动化测试
支持跨平台,支持多种语言.
在 Java 中使用 Selenium
在学习爬虫实践的过程中,发现很多网站使用 js 渲染,且 api 调用需要秘钥,导致无法爬取, 这时候就用到了 Selenium, 通过 Selenium 我们能得到经过浏览器渲染后产生的 HTML 文档.毕竟浏览器最终呈现的都是解析后的. 这样我们就能获得完整的 HTML 文档了
在 maven 中导入包
1
2
3
4
5
6<!--selenium-->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.4.0</version>
</dependency>使用浏览器调试工具
要使用 WebUI 自动化测试, 需要使用浏览器的驱动
工具系统安装的浏览器,选择对应版本的驱动
谷歌浏览器驱动下载地址使用 WebDriver
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// 1. 得到WebDriver实例
public static WebDriver initWebDriber(String diverPath) {
System.setProperty("webdriver.chrome.driver", diverPath);// diverPath是chromedriver服务地址
WebDriver webDriver = new ChromeDriver();
return webDriver;
}
// 2. 打开页面
webDriver.get(url);
// 3. 进行操作(比如登录,打开隐藏窗口等)
driver.findElement(By.className("UG_box"));//找到要操作的element
webElement.click(); //使用获得的element进行点击操作
// 4. 下载页面
String html = webDriver.getPageSource();
// 得到String格式的HTML文档
findElement/findElements详解
通过findElement/findElements可以定位element,获取element进行后续操作
通常使用By与之结合, By是一个类,里面封装了获取element的方法.
By.id()
根据标签的id获取
By.name()
通过标签的name获取
By.tagName()
根据 标签 获取
By.className()
根据标签中类class的值获取
By.lintText()
通过页面中超链接包含的文字来定位
By.xpath()
通过Xpath语法定位
对于浏览器窗口的操作
有时候不是所有操作都能用HTML定位来做,比如浏览器弹出的各种窗口
操作弹出窗口
1
2
3
4
5
6// 获取弹出窗口
Alert al = driver.switchTo().alert();
// 选择确定按钮
al.accept();
// 选择取消按钮
al.dismiss();浏览器全屏
1
driver.manage().window().maximize();
关闭浏览器窗口
1
2
3driver.quit();
driver.close();刷新/前进/回退
1
2
3
4
5
6// 刷新
driver.navigate().refresh();
// 前进
driver.navigate().forward();
// 回退
driver.navigate().back();
程序等待方式
sleep();
强制等待,设置睡眠时间
implicitlyWait():隐式等待,等待元素被发现、命令完成,超出了设置的时间则跑出异常
1
2
3WebDriver driver = new ChromeDriver();
//设置脚本在查找元素时的最大等待时间
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);WebDriverWait
1
2
3//设置等待的时长,最长10s
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("app"))));