Selenium的简单使用

背景

抓数据时,遇到困难。准备直接用Selenium把站点打开,拿到cookies。再进行抓取。

实验环境

  • windows7
  • firefox_55.0.3(64-bit)
  • geckodriver 0.18.0 for Firefox

简介

Selenium webdriver 是一个用于web应用程序的自动化测试工具。
具有一系列的API来操作浏览器。
可以模拟用户操作页面元素。

主要步骤

配置参数,初始化driver
加载url
等待页面加载
获取页面元素
操作页面元素
获取 cookies
保存cookies

所需要的依赖

在pom.xml的dependencies中加入

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>fluent-hc</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-firefox-driver</artifactId>
<version>3.5.3</version>
</dependency>

要在https://github.com/mozilla/geckodriver/releases 中把geckodriver.exe给下载下来

注意事项

如果遇到稀奇古怪的错误检查下各组件的版本号是否匹配。
不同版本可能api的操作方式不一样

示例代码

代码实现了在百度中输入123,并搜索,然后保存cookies和页面结果的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;

import org.apache.http.client.CookieStore;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;

public class Main {

public static void main(String[] args) throws IOException {
// geckodriver.exe download from
// https://github.com/mozilla/geckodriver/releases
System.setProperty("webdriver.gecko.driver", "C:/bin/geckodriver.exe");
FirefoxOptions firefoxOptions = new FirefoxOptions();
firefoxOptions.setLogLevel(Level.ALL);
FirefoxDriver driver = new FirefoxDriver(firefoxOptions);
String baseUrl = "https://www.baidu.com";
// 加载url
driver.get(baseUrl);
// 等待加载完成
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

// 拿到搜索框,输入数据
WebElement keyword= driver.findElement(By.id("kw"));
keyword.sendKeys("123");

// 拿到提交按钮,提交
WebElement submit= driver.findElement(By.id("su"));
submit.click();

// 保存页面内容
FileOutputStream fos = new FileOutputStream("sourc.html");
fos.write(driver.getPageSource().getBytes());
fos.close();

// 保存cookies
Set<org.openqa.selenium.Cookie> cookies = driver.manage().getCookies();
System.out.println("Size: " + cookies.size());
Iterator<org.openqa.selenium.Cookie> itr = cookies.iterator();
CookieStore cookieStore = new BasicCookieStore();
while (itr.hasNext()) {
Cookie cookie = itr.next();
BasicClientCookie bcco = new BasicClientCookie(cookie.getName(), cookie.getValue());
bcco.setDomain(cookie.getDomain());
bcco.setPath(cookie.getPath());
cookieStore.addCookie(bcco);
}
// 保存到文件
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("cookies")));
oos.writeObject(cookieStore);
oos.close();
}