使用selenium抓取JS动态生成的页面

在抓取网页数据时,传统jsoup方案只能对静态页面有效,而有些网页数据往往是js生成的,所以这时候需要其它的方案。

首先的思路是分析js程序,对js的请求进行再次抓取,这适合于特定的页面抓取,要做到对不同目标URL的通用性,比较麻烦。

第二种思路,也是比较成熟的做法是利用第三方的驱动渲染页面,然后下载。这里介绍一下第二种实现思路。

Selenium是一个模拟浏览器的自动化测试工具,它提供一组API可以与真实的浏览器内核交互。

Java环境下的maven配置如下:

<dependency>
   <groupId>org.seleniumhq.selenium</groupId>
   <artifactId>selenium-java</artifactId>
   <version>2.46.0</version>
  </dependency>

第三方驱动主要有IEDriver,FirefoxDriver,ChromeDriver,HtmlUnitDriver。

htmlUnit也是一种自动化测试的工具。可以用HtmlUnit模拟浏览器运行,获得执行后的html页面。其中HtmlUnitDriver是对htmlUnit的封装。

因为htmlunit对js解析的支持有限,在实际工程中并不常用。

以chrome为例下载对应的驱动:http://code.google.com/p/chromedriver/downloads/list 。

下载driver时需要注意与selenium的版本兼容,可能出现异常情况,一般下载最新版本就好。

程序运行前一定要制定驱动位置,比如在Windows下面

System.getProperties().setProperty("webdriver.chrome.driver",
        "D:\\chromedriver\\chromedriver.exe");

获取整个页面

 public static void testChromeDriver() {
System.getProperties().setProperty("webdriver.chrome.driver",
        "D:\\chromedriver\\chromedriver.exe");
WebDriver webDriver = new ChromeDriver();
webDriver.get("http://picture.youth.cn/qtdb/201506/t20150625_6789707.htm");
String responseBody = webDriver.getPageSource();
System.out.println(responseBody);
webDriver.close();
}

获取新浪评论数

public static void waitForSomthing(){
System.getProperties().setProperty("webdriver.chrome.driver",
        "D:\\chromedriver\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://news.sina.com.cn/c/2015-07-04/023532071740.shtml");
        WebDriverWait wait = new WebDriverWait(driver,10);
        wait.until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver webDriver) {
                System.out.println("Searching ...");
                return webDriver.findElement(By.id("commentCount1")).getText().length() != 0;
            }
        });

        WebElement element = driver.findElement(By.id("commentCount1"));
        System.out.println("element="+element.getText());
}

关于selenium的更多api及介绍:http://docs.seleniumhq.org/docs/

参考:http://my.oschina.net/flashsword/blog/147334

一些driver的测试报告:http://my.oschina.net/xxjbs001/blog/396564

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-13 21:41:38

使用selenium抓取JS动态生成的页面的相关文章

使用phantomjs抓取JS动态生成的页面

关于phantomjs phantomjs实现了一个无界面的webkit浏览器.虽然没有界面,但dom渲染.js运行.网络访问等API都很完整.可以利用phantomjs来下载js生成的页面. 下载phantomjs(http://phantomjs.org/download.html).解压到任意目录,在Windows下将包含phantomjs.exe的目录添加到系统路径.Linux下 phantomjs2.0还没有提供下载的包,需要手动编译.centos 安装phantomjs步骤如下: 在

抓取js动态生成数据

最近在抓数据,一般的网页数据抓取相对容易一些,今天在抓电视猫的节目单,发现有些数据时抓取不到的,Java端得到的HTML文件里面没有某一段代码,查了很多资料,发现说是js动态生成的数据,无法直接抓取,有一种解决方法是利用找到ajax请求地址和参数,重新抓取,该方法存在一个问题,就是当参数被加密过时,该方法就不好用了,所以,这里用了一个办法,就是利用HTMLunit来抓取(可以利用jsuop来处理HTML文件),jar包下载地址:http://download.csdn.net/detail/jo

PHP 爬虫体验(三) - 使用PHP + puppeteer爬取js动态渲染的页面内容

之前写的两篇爬虫体验基本上涵盖了一般的Html页面提取场景,但是有些时候,如果目标页面不是纯静态的页面,而是使用js动态渲染的页面(比如one),之前的爬虫就不好使了,这种时候就要借助一些其他工具来进行实现. 一般爬取动态页面的思路是通过软件模拟浏览器行为获取到渲染后的页面镜像,然后再对渲染后的页面进行分析,常用的工具有selenium,phantomJs,puppeteer等,通过对项目维护程度.对PHP友好度的对比,我选用的是puppeteer. 根据官方介绍,谷歌在2017年开发了自家Ch

[搬运自我的CSDN博客] python抓取javascript动态生成HTML内容的实践

<注:CSDN博客在美国访问特别卡,所以转移到cnblogs来发文章> 本实验在Ubuntu14.04上完成.使用的浏览器是火狐(Firefox 33.0),python版本是2.7.6. 大家都知道用urllib配合正则表达式抓取静态HTML的内容很方便,但是如果网页中有javascript动态生成的内容,urllib就无能为力了. 此时我们要借助一个额外的工具:selenium.它的工作原理是操纵(火狐)浏览器浏览目标网页,等待网页中的javascript全部执行完毕后再对HTML源码进行

HtmlUnit爬取Ajax动态生成的页面内容

HtmlUnit说白了就是一个浏览器,这个浏览器是用Java写的无界面的浏览器,正因为其没有界面,因此执行的速度还是可以滴. HtmlUnit提供了一系列的API,这些API可以干的功能比较多,如表单的填充,表单的提交,模仿点击链接,由于内置了Rhinojs引擎,因此可以执行JavaScript 之前用的时候一直抓取不了Ajax动态生成table及其数据,用Firefox和IE浏览器查看网页源代码也看不到table和数据,但是用Firefox查看元素能看到信息 调研了HtmlUnit好久都没有用

如何用phantomjs去抓取js渲染后的页面

1.安装phantomjs 网上有很多. 2.执行官网上的示例代码 // Read the Phantom webpage '#intro' element text using jQuery and "includeJs" "use strict"; var page = require('webpage').create(); page.onConsoleMessage = function(msg) { console.log(msg); }; page.op

2)JS动态生成HTML元素的爬取

2)JS动态生成HTML元素的爬取 import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import cn.edu.hfut.dmic.webcollector.crawler.DeepCrawler; import cn.edu.hfut.dmic.webcollector.model.

爬虫之抓取js生成的数据

有很多页面,当我们用request发送请求,返回的内容里面并没有页面上显示的数据,主要有两种情况,一是通过ajax异步发送请求,得到响应把数据放入页面中,对于这种情况,我们可以查看关于ajax的请求,然后分析ajax请求路径和响应,拿到想要的数据:另外一种就是js动态加载得到的数据,然后放入页面中.这两种情况下,对于用户利用浏览器访问时,都不会发现有什么异常,会迅速的得到完整页面. 其实我们之前学过一个selenium模块,通过操纵浏览器,然后拿到浏览器显示出来的数据,这种方式是可以拿到数据的,

使用Ghost.py爬取由JS动态生成的网页

很多网站的内容是由JS动态生成的,对于这样的网站查看它的源代码是看不出什么的,常规的爬虫对于这样的网站束手无策.我自己做了一个由JS生成的图片,并成功的用Ghost.py把它爬取了下来. 对于这么个图片看似平常,那么看下它的源代码 从源代码里看不出关于这张图片的地址,而图片的地址是在后端,由JS加载进去的,爬取这类网站需要模拟浏览器执行JS语句,得到执行JS后的页面,再实现爬取. 这里需要用到一个工具:ghost.py ghost.py是一个使用python编写的封装了webkit的网络工具.官