java爬虫抓取动态网页(selenium使用selenium功能的时候,如何通过selenium进行页面的加载)

优采云 发布时间: 2021-10-08 06:27

  java爬虫抓取动态网页(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本身没有什么难懂的,它也可以帮助我们更好的完善爬虫的功能。用好它,爬虫的水平一定会提高!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线