java爬虫抓取动态网页(关于Java使用PhantomJs的一些事儿,你了解多少?)

优采云 发布时间: 2021-09-21 14:08

  java爬虫抓取动态网页(关于Java使用PhantomJs的一些事儿,你了解多少?)

  让我们先离题。当我刚开始学习爬行动物时,有一次一位大四的学生让我需要捕捉京东图书的相关信息。因为我刚刚开始学习爬行动物和练习豆瓣菜,所以我抓取了大约500篇电影评论并存储在MySQL中。当时,我觉得自己不够强壮,所以很容易就接受了这个要求

  然后自信地开始工作。。首先查看网页源代码。。。???我需要的不是源代码!!!然后我去问大四。前辈告诉我这是由Ajax生成的数据。听了之后,我去检查数据。人们发现,互联网上的大量信息正在解释一个事实。对于动态页面,使用phantom JS进行捕获,但这种效率非常低。作为一名优秀的程序员,我当时看到了四个低效字,这在我心里是绝对不允许的,所以我使用捕获数据包的方式查看ajax数据所在的URL。模拟浏览器的方法一直被搁置至今

  但是现在你知道了这件事,没有理由不去学习。因此,我花了一些时间阅读了有关在Java中使用phantom JS的信息,现在我将与您分享

  顺便说一句,作为一个网络爬虫,页面上90%的数据可以通过捕获数据包获得。因此,我鼓励您直接请求所需数据的URL。毕竟,尽管这种方法很方便,但效率很低

  JS渲染与ajax

  在学习这件事之前,我们必须首先了解什么是JS渲染,什么是Ajax,以及为什么我们不能在web源代码中获取这两种数据

  据我了解,JS渲染和Ajax是相辅相成的。AJAX负责从服务器异步获取数据,获取数据后用JS进行渲染,最后将数据呈现给用户。在Java中,httpclient只能请求简单的静态页面,不能在页面完全加载后请求JS调用相关代码生成的异步数据。因此,我们无法通过httpclient直接获取Ajax和JS渲染生成的数据。此时,建议您直接捕获网络数据包以获取ajax数据所在的URL,或者使用本文中描述的phantom JS呈现引擎

  三种JS渲染引擎的比较

  在互联网上查阅信息时,我们常常被各种各样的答案所淹没。此时,首先要保持平静的心情,其次,我们应该考虑搜索问题的相关姿势,我们需要在必要时科学地上网。

  更不用说本文中提到的JS呈现引擎,Java爬虫中的HTTP请求库可以用多种方式描述。Java的本机httpurlconnection类、httpclient第三方库等等。。。当然,网络上有太多可用的方法,我们必须选择,因此我们当然希望选择一个功能强大且简单的类库。此时,我们应该在互联网上搜索并比较两个类库,以做出更好的选择,而不是仅仅选择一个来学习。这样,学习成本很可能与回报不成正比

  所以我相信,当您准备使用JS引擎来模拟浏览器时,您不仅看到了phantom JS,还看到了selenium和htmlunit,它们具有相同的功能。那么我们如何选择呢?下图摘自其他网友的博客:

  HtmlUnitSeleniumPhantomJs

  内置rhinojs浏览器引擎,没有浏览器使用此内核,解析速度平均,解析JS/CSS较差,没有浏览器界面

  Selenium+webdriver=Selenium基于本地安装的浏览器。需要打开浏览器,引用相应的webdriver,并正确配置webdriver的路径参数。在抓取大量JS呈现的页面时,这显然是不合适的

  工件简短而简洁,可以在本地运行,也可以作为服务器运行。它基于WebKit内核,具有良好的性能和性能,能够完美解析大多数页面

  这就是为什么我选择谈论幻影JS

  在互联网上,phantom JS和selenium经常成对出现。原因是selenium封装了phantom JS的一些函数,并且selenium提供了Python接口模块。Selenium可以在Python语言中很好地使用,phantom JS可以间接使用。然而,是时候放弃selenium+phantom JS了。一个原因是封装的接口很长时间没有更新(没有人维护它)。另一个原因是selenium只实现了一些phantom JS函数,而且非常不完善

  幻影JS的使用

  我用Ubuntu16.04开发环境。关于phantom JS+selenium的环境部署,网络上有很多信息。我将在这里介绍一个链接。我不会详细解释:Ubuntu安装phantomjs

  我不会详细介绍phantom JS和selenium的介绍。你可以直接去百度。让我们直接看看幻像JS应该如何在java

  中使用

  如果您不使用maven,请在Internet上下载第三方jar包。我们需要的Maven依赖项如下:

  

org.seleniumhq.selenium

selenium-java

2.53.1

com.github.detro.ghostdriver

phantomjsdriver

1.1.0

  接下来,让我们看看程序应该如何编写:

  1.set请求头

  //设置必要参数

DesiredCapabilities dcaps = new DesiredCapabilities();

//ssl证书支持

dcaps.setCapability("acceptSslCerts", true);

//截屏支持

dcaps.setCapability("takesScreenshot", true);

//css搜索支持

dcaps.setCapability("cssSelectorsEnabled", true);

//js支持

dcaps.setJavascriptEnabled(true);

//驱动支持(第二参数表明的是你的phantomjs引擎所在的路径,使用whereis phantomjs可以查看)

dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, "/usr/local/bin/phantomjs");

  2.create phantomjs浏览器对象

  //创建无界面浏览器对象

PhantomJSDriver driver = new PhantomJSDriver(dcaps);

  3.set隐藏等待

  //设置隐性等待

driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);

  由于加载页面需要一段时间,如果在加载页面之前查找元素,则一定无法找到它们。最好的方法是设置默认等待时间。如果找不到页面元素,请等待一段时间,直到它超时

  使用phantomjs时应注意以上三点。您可以查看一般的总体程序:

  import org.openqa.selenium.By;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.phantomjs.PhantomJSDriver;

import org.openqa.selenium.phantomjs.PhantomJSDriverService;

import org.openqa.selenium.remote.DesiredCapabilities;

import java.util.concurrent.TimeUnit;

/**

* Created by hg_yi on 17-10-11.

*/

public class phantomjs {

public static void main(String[] args) {

//设置必要参数

DesiredCapabilities dcaps = new DesiredCapabilities();

//ssl证书支持

dcaps.setCapability("acceptSslCerts", true);

//截屏支持

dcaps.setCapability("takesScreenshot", true);

//css搜索支持

dcaps.setCapability("cssSelectorsEnabled", true);

//js支持

dcaps.setJavascriptEnabled(true);

//驱动支持(第二参数表明的是你的phantomjs引擎所在的路径)

dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,

"/usr/bin/phantomjs-2.1.1-linux-x86_64/bin/phantomjs");

//创建无界面浏览器对象

PhantomJSDriver driver = new PhantomJSDriver(dcaps);

//设置隐性等待(作用于全局)

driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);

//打开页面

driver.get("--------------------------------");

//查找元素

WebElement element = driver.findElement(By.id("img_valiCode"));

System.out.println(element.getAttribute("src"));

}

}

  我成功捕获了网页源代码中没有的数据~

  对于上面使用的phantomjsdriver类的相关API,您可以直接查看此资料,它应该满足您的日常需要:webdriver API中文版(webdriver API也适用于phantomjsdriver)

  phantom JS的性能优化

  我们都知道,使用phantom JS等无头浏览器捕获web源代码非常耗时,因此当我们决定使用此工具并对捕获速度有一定要求时,我们需要掌握优化phantom JS性能的能力

  1.设置参数

  谷歌和百度已经阅读了很长时间的一些官方文档,但是他们仍然找不到与phantomjs相关的Java调用API文档。好吧,先抛出一篇python文章,然后找到这方面的内容并加以补充~~~

  [phantom JS series]硒+phantom JS性能优化

  旁白:事实上,对于java网络爬虫。。。真想吐槽,建议刚开始抱怨爬行动物或与Python爬虫搏斗的人~~对Java爬虫来说,只要说一句话:学习很难,学习周期很长,扔东西和收入不成正比!!!p>

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线