抓取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爬虫,我只能说一句话:学习难,学习周期长,投入与收益不成正比!!!