selenium本身是一种自动化测试工具,可以模拟浏览器进行页面的加载,好处在于能通过程序,自动的完成例如页面登录、AJAX内容获取的的操作。
尤其是获取AJAX生成的动态信息方面,一般爬虫只会获取当前页面的静态信息,不会加载动态生成的内容,但是selenium则完美的帮我们实现了这一功能。
但同样他也有一些不好的地方,就是使用selenium功能的时候,需要事先加载selenium的驱动,在通过selenium本身加载出页面动态生成的内容,以供之后爬取。
但是这节我们只讲selenium的一个基本操作:页面登录
后续我们还会讲如何通过selenium进行动态页面的爬取
================================================ 我是萌萌哒分割线 ======================================================
开始撸代码:
首先,我们先通过maven,配置好selenium的相关依赖
org.seleniumhq.selenium
selenium-java
3.3.1
上面是selenium的 相关配置,当然,webmagic本身也对selenium有所集成,相关配置如下:
us.codecraft
webmagic-selenium
${webmagic.version}
org.slf4j
slf4j-log4j12
使用selenium对页面尽进行爬取时,首先需要下载相关的浏览器驱动,不同版本的浏览器对应的驱动也不一样
我用的是chrome的驱动,所以也提供一下chromedriver的下载地址,其余如火狐、ie的驱动百度一下都可以轻松找到
chromedriver相关资源
WebDriver driver = new ChromeDriver();
driver.get("http://www.meipai.com/");
以为我已经把驱动放在chrome路径下的bin文件夹中,并且在环境变量path中也把chromedriver的地址加进去,所以我在new ChromeDriver的时候没有带参数
如果不想把驱动配到环境变量中也可以直接吧驱动的路径写成参数传进去就可以(
例:
new ChromeDriver("D://chromedriver.exe")
)
public class MeipaiProccessor implements PageProcessor {
private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(3000)
.setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36");
@Override
public void process(Page page) {
WebDriver driver = new ChromeDriver();
driver.get("http://www.meipai.com/");
//防止页面未能及时加载出来而设置一段时间延迟
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//找到登录按钮,点击
driver.findElement(By.id("headerLogin")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.id("dialogLWrap")).findElement(By.id("dialogLPlatform")).findElement(By.tagName("a")).click();
driver.findElement(By.id("userId")).sendKeys("账号");
driver.findElement(By.id("passwd")).sendKeys("密码");
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
List spiderListeners = new ArrayList<>();
SpiderListener spiderListener = new SpiderListener() {
@Override
public void onSuccess(Request request) {
System.out.println("sucsess");
}
@Override
public void onError(Request request) {
}
};
spiderListeners.add(spiderListener);
Spider.create(new MeipaiProccessor())
.setSpiderListeners(spiderListeners)
.addUrl("http://www.meipai.com/")
.thread(5)
.start();
}
以上是对美拍进行模拟登陆的代码,之前配置过一些基础的BasePageProcess类,把site和一些基础的逻辑功能放在里面,然后让爬虫程序只需要完成页面解析的功能,但是当时忘记把BasePageProcess类的代码贴上去,到时有人反映程序跑不起来,所以这次一切从简,实现webmagic最基本的PageProcessor接口,所有的逻辑都在以上程序中体现出来。
代码功能比较单一,主要就是通过findElement方法定位到账号密码的输入框,把对应的账号密码输入进去,最后点击登录完成整个模拟登陆的操作。
selenium本身没有什么难理解的东西,而且还能帮助我们更好的完善爬虫的功能。用好它,爬虫的水平必将更上层楼!