java爬虫抓取动态网页(selenium使用selenium功能的时候,如何通过selenium进行页面的加载)
优采云 发布时间: 2021-10-08 06:27java爬虫抓取动态网页(selenium使用selenium功能的时候,如何通过selenium进行页面的加载)
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
us.codecraft
webmagic-selenium
${webmagic.version}
org.slf4j
slf4j-log4j12
webmagic的这个配置有一个简单的selenium包,看你的喜好了。
使用selenium抓取整个页面时,首先需要下载相关的浏览器驱动。不同版本浏览器的驱动是不同的。
我用的是chrome驱动,所以我也提供了chromedriver的下载地址。其他驱动如火狐和IE在百度上很容易找到。
chromedriver 相关资源
WebDriver driver = new ChromeDriver();
driver.get("http://www.meipai.com/");
爬取之前需要上面两句加载浏览器驱动和爬取目标URL
我以为我把驱动放在了chrome路径下的bin文件夹下,在环境变量路径中添加了chromedriver地址,所以我用新的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();
}//防止页面未能及时加载出来而设置一段时间延迟
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类之前已经配置好了,站点和一些基本的逻辑功能都放在里面。然后爬虫程序只需要完成页面解析功能,但是当时忘记放BasePageProcess类了。代码贴出来了,有人反馈说程序跑不起来,所以这次把一切都简化了,实现了webmagic最基本的PageProcessor接口。所有的逻辑都体现在上面的程序中。
代码功能比较简单,主要是通过findElement方法定位账号密码输入框,输入对应的账号密码,最后点击login完成整个模拟登陆操作。
Selenium本身没有什么难懂的,它也可以帮助我们更好的完善爬虫的功能。用好它,爬虫的水平一定会提高!