在使用爬虫的过程中,有的网站的信息必须是要登录后才能查看,除了添加cookie之外还可以在程序中启动浏览器在并在相应的位置填好用户名和密码等信息进行登录后,再将session信息存入。
1.起因
当使用webMagic爬取需要登录的网站信息时,有的时候请求包含的cookie信息过长,在不确定使用哪个时就需要调用n多次site中的addCookie方法,来来回回复制和粘贴cookie信息就很麻烦。所以就想着有没有一种更方便的方法可以获取到cookie的信息然后自动添加。接着查询资料就发现了一个方案,就是利用浏览器的驱动实现用户登录,可以获取到页面的cookie信息。
2.步骤
首先百度了一下,然后了解到webmagic中有相关的工具可以模拟登陆,所以只需要在项目中引入jar包就可以了。
第一步,在maven中引入webmagic对Selenium的jar包
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-selenium</artifactId>
<version>0.5.2</version>
</dependency>
然后,运行时发现程序时报错了,了解到还需要安装一个浏览器驱动,所以第二步就是安装驱动。
mac 下安装谷歌浏览器驱动的命令
brew install chromedriver
这样前期工作就准备好了
3.运行
在爬虫启动之前先要加入一段登录的过程,代码如下,此处url为豆瓣的地址
public void login(String url)
{
System.setProperty("webdriver.chrome.driver","/usr/local/Cellar/chromedriver/2.33/bin/chromedriver");
WebDriver driver = new ChromeDriver();
driver.get(url);
driver.findElement(By.id("form_email")).clear();
//将userName替换为你的用户名
driver.findElement(By.id("form_email")).sendKeys("userName");
driver.findElement(By.id("form_password")).clear();
//将password替换为你的密码
driver.findElement(By.id("form_password")).sendKeys("password");
//模拟点击登录按钮
driver.findElement(By.className("bn-submit")).click();
//获取cookie信息
cookies = driver.manage().getCookies();
driver.close();
}
然后将session保存在cookie中
public Site getSite() {
for (Cookie cookie : cookies) {
site.addCookie(cookie.getName().toString(),cookie.getValue().toString());
}
return site.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1");
}
然后在进行正常的抓取流程就好了。
4.问题
在进行模拟登陆时,很多情况下会遇到各种验证码的问题,有的是滑动验证、验证码验证,图片点击认证等等。因为有些涉及到图形处理方面的知识,就没有继续研究,加上工作上暂时也没遇到过需要爬一些需要登录并且登录前需验证的页面,所以这方面的学习就先到这里,其实关于selenium还有很多需要学习的地方,这里也只是介绍了与chromedriver一起使用模拟登陆的用途,以后路还很长,需要学习的地方还有很多。