背景
抓取序需要登录的页面数据。
操作需要登录权限的资源。
实验环境
- windows 7
- firefox_v50.1.0
- geckodriver_v0.14
简介
Selenium webdriver 是一个用于web应用程序的自动化测试工具。
具有一系列的API来操作浏览器。
可以模拟用户操作页面元素。
主要步骤
- 配置参数,初始化driver
- 加载url
- 等待页面加载
- 获取页面元素
- 操作页面元素
- 提交表单
- 获取 cookies
- 保存cookies
注意事项
- 老的版本上,会要设置firefox的路径,但是这个版本只需要设置gecko的路径。gecko需要在git上下载下来。
- 因为是开启浏览器加载页面,所以需要一些延时来等待页面加载。可以设置时间,也可以设置检测某个元素存在等。
- cookies是保存到了
org.apache.http.client.CookieStore中,然后序列化到文件中,用于下次读取,用httpclient来抓数据。
所需要的依赖
在pom.xml的dependencies中加入
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>fluent-hc</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-firefox-driver</artifactId>
<version>3.0.1</version>
</dependency>
登录csdn的示例代码
package firefox;
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.TimeUnit;
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;
public class Main {
/**
* 模拟csdn登录,获取登录后的cookies保存到文件
*
* @param username
* 用户名
* @param password
* 密码
* @param geckodriverpath
* gecko的路径(见https://github.com/mozilla/geckodriver)
* @param savecookiepath
* cookies保存的路径
* @throws Exception
*/
public static void firfoxDriverGetCookies(String username, String password, String geckodriverpath,
String savecookiepath) throws Exception {
// 初始化参数据
System.setProperty("webdriver.gecko.driver", geckodriverpath);
FirefoxDriver driver = new FirefoxDriver();
String baseUrl = "https://passport.youkuaiyun.com/account/login?ref=toolbar";
// 加载url
driver.get(baseUrl);
// 等待加载完成
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
// 获取页面元素
WebElement elemUsername = driver.findElement(By.name("username"));
WebElement elemPassword = driver.findElement(By.name("password"));
WebElement btn = driver.findElement(By.className("logging"));
WebElement rememberMe = driver.findElement(By.id("rememberMe"));
// 操作页面元素
elemUsername.sendKeys(username);
elemPassword.sendKeys(password);
rememberMe.click();
// 提交表单
btn.submit();
Thread.sleep(5000);
driver.get("http://msg.youkuaiyun.com/");
Thread.sleep(5000);
// 获取cookies
driver.manage().getCookies();
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(savecookiepath)));
oos.writeObject(cookieStore);
oos.close();
}
public static void main(String[] args) throws Exception {
firfoxDriverGetCookies("<用户名>", "<密码>", "C:/bin/geckodriver.exe", "cookie.ser");
}
}
本文介绍了如何利用Selenium WebDriver模拟登录网站并获取登录后的Cookies。内容包括实验环境(Windows 7, Firefox v50.1.0, geckodriver v0.14)、主要步骤(配置参数、页面加载、元素操作、提交表单、获取及保存Cookies)、注意事项(如设置geckodriver路径、处理页面加载延迟)以及所需的依赖库。同时提供了登录优快云的示例代码,供读者参考。"
115017583,8365730,手动实现限流降级队列 | Java并发工具实战,"['Java', '并发编程', 'Spring Cloud', '限流算法', '降级策略']
9万+

被折叠的 条评论
为什么被折叠?



