抓取ajax动态网页java(点题外话吧,京东图书模拟浏览器的一些事儿)

优采云 发布时间: 2022-04-20 06:19

  抓取ajax动态网页java(点题外话吧,京东图书模拟浏览器的一些事儿)

  让我先离题。刚开始学爬虫的时候,有一次学长给我一个请求,要抓取京东图书的相关资料。嗯,因为我真的是刚开始学爬,用豆瓣练的很成功。我抓取了大约 500 条电影评论,然后将它们存储在 mysql 中。. . .

  然后充满信心地开始工作。. 首先查看网页源代码。. . ? ? ? 我需要的不在源代码中!!!然后我问了校长。前辈告诉我这是AJAX生成的数据,我听完就去查数据。发现网上的信息在说明一个道理。对于动态页面,使用 PhantomJs 进行爬取,但是这样效率很低。作为一名优秀的程序员,当时看到“低效率”这两个字,心里是绝对不允许的,于是我就用抓包的方法去查看AJAX数据所在的URL。对于这种模拟浏览器方法一直搁置到现在。

  但既然你知道了这一点,就没有理由不学习它。所以花点时间看了一下在Java中使用PhantomJs的资料,现在就分享给大家。

  顺便说一句,其实作为一个网络爬虫,90%的页面数据都是通过抓包获取的。所以我还是鼓励大家直接请求自己需要的数据所在的URL。毕竟,这种方法虽然方便,但效率低下。

  使用 AJAX 进行 JS 渲染

  在学习这个东西之前,我们首先要了解什么是JS渲染,什么是AJAX,以及为什么我们在网页源码中取不到这两种数据。

  根据我的理解,JS渲染和AJAX是相辅相成的关系。AJAX负责从服务器端异步获取数据,然后用JS渲染数据,最后呈现给用户。由于在Java中,HttpClient只能请求一个简单的静态页面,无法请求页面满载后JS调用相关代码生成的异步数据,所以我们无法通过HttpClient直接获取AJAX和JS渲染生成的数据。这时候根据上面的推荐,可以直接抓包获取AJAX数据所在的URL,或者使用本文提到的PhantomJs渲染引擎。

  三大JS渲染引擎对比

  在互联网上搜索信息时,我们常常被五花八门的答案弄得不知所措。这个时候要保持冷静的心情,二要考虑搜索问题的相关姿势,必要时要科学上网。

  先不说本文提到的JS渲染引擎。只说Java爬虫中的HTTP请求库,可以有多种描述方式,Java自带的HttpURLConnection类,HttpClient第三方库等等,当然网上有这么多。方法,我们要选择,那么我们肯定要选择一个强大而简单的类库。这时候我们应该在网上搜索两个类库的相关对比,做出更好的选择,而不是随便挑一个就学,这样很可能投入的学习成本与回报不成正比。

  那么相信大家在准备用JS引擎模拟浏览器的时候,看到的不光是PhantomJs,还有Selenium和HtmlUnit,它们的功能是一样的。那么我们该如何选择呢?下图摘自其他网友的博客:

  HtmlUnitSeleniumPhantomJs

  内置Rhinojs浏览器引擎,没有浏览器使用这个内核,解析速度一般,JS/CSS解析差,没有浏览器界面。

  Selenium + WebDriver = Selenium是基于本地安装的浏览器,需要打开浏览器,需要参考对应的WebDriver,并正确配置webdriver的路径参数,这在爬取大量js时显然是不合适的渲染页面。

  神器,短小精悍,可以本地运行,也可以作为服务器运行,基于webkit内核,性能和性能都不错,可以完美解析大部分页面。

  这就是我选择谈论 PhantomJs 的原因。

  PhantomJs 和 Selenium 经常成对出现在 Internet 上。原因是 Selenium 封装了 PhantomJs 的一些功能,而 Selenium 提供了 Python 接口模块。在 Python 语言中,Selenium 可以很好地使用,PhantomJs 可以间接使用。然而,是时候放弃 Selenium+PhantomJs 了。一个原因是封装的接口很久没有更新(没人维护),第二个原因是Selenium只实现了PhantomJs的一部分功能,很不完善。

  PhantomJ 的使用

  我使用的是Ubuntu16.04的开发环境。关于 PhantomJs + Selenium 的环境部署,网上有很多资料。这里给大家介绍一个链接,我就不详细解释了:Ubuntu install phantomjs

  PhantomJs和Selenium的介绍我就不赘述了,你可以直接百度。我们直接看一下如何在Java中使用PhantomJs吧~

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

  

org.seleniumhq.selenium

selenium-java

2.53.1

com.github.detro.ghostdriver

phantomjsdriver

1.1.0

  接下来,我们来看看程序应该怎么写:

  1.设置请求头

  //设置必要参数

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.创建phantomjs浏览器对象

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

PhantomJSDriver driver = new PhantomJSDriver(dcaps);

  3.设置隐式等待

  //设置隐性等待

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)。

  PhantomJs 的性能优化

  我们都知道使用PhantomJs这样的无头浏览器来爬取网页源码是非常耗时的,所以当我们决定使用这个工具并且对爬取速度有一定要求的时候,就需要掌握PhantomJs的性能优化。能力。

  1.设置参数

  google、百度了半天,也看了一些官方文档,但是还是找不到PhantomJs相关的Java调用API文档。好吧,我们先扔一个Python,然后找到这个区域的内容再添加吧~~

  【phantomjs系列】Selenium+Phantomjs性能优化

  题外话:实际上是用于 Java 网络爬虫。. . 我真的很想投诉。建议刚开始学爬虫的人改用Python爬虫~~对于Java爬虫,我只能说一句话:学习难,学习周期长,投入与收益不成正比!!!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线