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.Links;
import cn.edu.hfut.dmic.webcollector.model.Page;/** JS爬取* Refer: http://blog.csdn.net/smilings/article/details/7395509*/
public class WebCollector3 extends DeepCrawler {public WebCollector3(String crawlPath) {super(crawlPath);// TODO Auto-generated constructor stub}@Overridepublic Links visitAndGetNextLinks(Page page) {/*HtmlUnitDriver可以抽取JS生成的数据*/
//      HtmlUnitDriver driver=PageUtils.getDriver(page,BrowserVersion.CHROME);
//      String content = PageUtils.getPhantomJSDriver(page);WebDriver driver = PageUtils.getWebDriver(page);
//        List<WebElement> divInfos=driver.findElementsByCssSelector("#feed_content");List<WebElement> divInfos=driver.findElements(By.cssSelector("#feed_content span"));for(WebElement divInfo:divInfos){System.out.println("Text是:" + divInfo.getText());}return null;}public static void main(String[] args) {WebCollector3 crawler=new WebCollector3("/home/hu/data/wb");for(int page=1;page<=5;page++)
//        crawler.addSeed("http://www.sogou.com/web?query="+URLEncoder.encode("编程")+"&page="+page);crawler.addSeed("http://cq.qq.com/baoliao/detail.htm?294064");try {crawler.start(1);} catch (Exception e) {e.printStackTrace();}}}

PageUtils.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;import com.gargoylesoftware.htmlunit.BrowserVersion;import cn.edu.hfut.dmic.webcollector.model.Page;public class PageUtils {public static HtmlUnitDriver getDriver(Page page) {HtmlUnitDriver driver = new HtmlUnitDriver();driver.setJavascriptEnabled(true);driver.get(page.getUrl());return driver;}public static HtmlUnitDriver getDriver(Page page, BrowserVersion browserVersion) {HtmlUnitDriver driver = new HtmlUnitDriver(browserVersion);driver.setJavascriptEnabled(true);driver.get(page.getUrl());return driver;}public static WebDriver getWebDriver(Page page) {
//      WebDriver driver = new HtmlUnitDriver(true);//     System.setProperty("webdriver.chrome.driver", "D:\\Installs\\Develop\\crawling\\chromedriver.exe");
//      WebDriver driver = new ChromeDriver();System.setProperty("phantomjs.binary.path", "D:\\Installs\\Develop\\crawling\\phantomjs-2.0.0-windows\\bin\\phantomjs.exe");WebDriver driver = new PhantomJSDriver();driver.get(page.getUrl());//       JavascriptExecutor js = (JavascriptExecutor) driver;
//      js.executeScript("function(){}");return driver;}public static String getPhantomJSDriver(Page page) {Runtime rt = Runtime.getRuntime();Process process = null;try {process = rt.exec("D:\\Installs\\Develop\\crawling\\phantomjs-2.0.0-windows\\bin\\phantomjs.exe " + "D:\\workspace\\crawlTest1\\src\\crawlTest1\\parser.js " +page.getUrl().trim());InputStream in = process.getInputStream();InputStreamReader reader = new InputStreamReader(in, "UTF-8");BufferedReader br = new BufferedReader(reader);StringBuffer sbf = new StringBuffer();String tmp = "";while((tmp = br.readLine())!=null){    sbf.append(tmp);    }return sbf.toString();} catch (IOException e) {e.printStackTrace();}return null;}
}

2.1)HtmlUnitDriver getDriver是selenium 1.x的作法,已经outdate了,现在用WebDriver getWebDriver

2.2)这里用了几种方法:HtmlUnitDriver, ChromeDriver, PhantomJSDriver, PhantomJS,参考 http://blog.csdn.net/five3/article/details/19085303,各自之间的优缺 点如下:

driver类型 优点 缺点 应用
真实浏览器driver 真实模拟用户行为 效率、稳定性低 兼容性测试
HtmlUnit 速度快 js引擎不是主流的浏览器支持的 包含少量js的页面测试
PhantomJS 速度中等、模拟行为接近真实 不能模拟不同/特定浏览器的行为 非GUI的功能性测试

* 真实浏览器driver 包括 Firefox, Chrome, IE

2.3)用PhantomJSDriver的时候,遇上错 误:ClassNotFoundException: org.openqa.selenium.browserlaunchers.Proxies,原 因竟然是selenium 2.44 的bug,后来通过maven找到phantomjsdriver-1.2.1.jar 才解决了。

2.4)另外,我还试了PhantomJS 原生调用(也就是不用selenium,直接调用PhantomJS,见上面的方法),原生要调用JS,这里的parser.js代码如下:

system = require('system')
address = system.args[1];//获得命令行第二个参数 接下来会用到
//console.log('Loading a web page');
var page = require('webpage').create();
var url = address;
//console.log(url);
page.open(url, function (status) {   //Page is loaded!   if (status !== 'success') {   console.log('Unable to post!');   } else {    //此处的打印,是将结果一流的形式output到java中,java通过InputStream可以获取该输出内容console.log(page.content);   }      phantom.exit();
});

3)后话

3.1)HtmlUnitDriver + PhantomJSDriver是当前最可靠的动态抓取方案。

3.2)这过程中用到很多包、exe,遇到很多的墙~,有需要的朋友可以找我要。

Reference

http://www.ibm.com/developerworks/cn/web/1309_fengyq_seleniumvswebdriver/
http://blog.csdn.net/smilings/article/details/7395509
http://phantomjs.org/download.html
http://blog.csdn.net/five3/article/details/19085303
http://phantomjs.org/quick-start.html

... ...

动态网页爬取例子(WebCollector+selenium+phantomjs)

2)JS动态生成HTML元素的爬取相关推荐

  1. 利用scrapy+splash+redis实现对JS动态生成网页的增量爬取

    文章目录 一.任务内容 二.Scrapy安装.配置.调试 三.splash安装.配置.调试 开启hyper-v 安装Docker Desktop 拉取和开启Splash 安装scrapy-splash ...

  2. JS动态生成的元素,其对应的方法不响应(比如单击事件,鼠标移动事件等)...

    主要原因:在页面给元素注册点击事件的时候[ $(function () {  XXX }); ],JS动态生成的元素还尚未生成,所以click事件就没有生效 解决方法: 方案一:js动态生成元素后再给 ...

  3. Python《突破JS动态加载,成功爬取漫画》

    今天就先挑战另外个动态加载的漫画网站,dmzj 漫画太多了,我们先挑选几个漫画下载试一试. 比如我们点击第一部漫画,进去后看看. 这里有很多章节,获得所有的章节这里不难. 接下来我们点击一个章节进去看 ...

  4. js动态生成的DOM绑定事件失效的问题

    事件委托原理:事件冒泡机制. 优点:1. 可以大量节省内存占用,减少事件注册.比如ul 上代理所有li 的click 事件. 2. 可以实现当新增子对象时,无需再对其事件进行绑定.对动态内容部分尤为合 ...

  5. js 动态生成html(js根据后台返回数据生成html页面中的table标签)(转义字符)

    js 动态生成html table标签中内容js生成 html代码 js代码 js 动态生成html 触发事件传参字符转义 table标签中内容js生成 html代码 <div><t ...

  6. HTML通过JS动态生成简单网页

    HTML通过JS动态生成简单网页 <!DOCTYPE html> <html><head><meta charset="UTF-8"> ...

  7. 抓取js动态生成的数据分析案例

    需求: 爬取https://www.xuexi.cn/f997e76a890b0e5a053c57b19f468436/data018d244441062d8916dd472a4c6a0a0b.htm ...

  8. html设置根rem,经过js动态设置根元素的rem方案

    rem目前是响应式开发移动端一个很重要也是经常使用的一个元素,可是在网上看的各类文章都会超级懵逼.因此我在下面给出两个方案,也列举出使用方法,让你们一目了然.前提是设计稿以750为准.其中测试的设计稿 ...

  9. js动态生产html元素,js 动态创建 html元素

    js 动态创建 html元素 js学习之动态创建html元素 body{margin:0;padding:0;} .sky{background:#000;width:1000;height:500p ...

最新文章

  1. 【超赞】技术架构的战略和战术原则
  2. linux中的gun含义,linux中gun的含义
  3. 基于ECS部署LAMP环境实验记录
  4. 真是,原来可以这样啊
  5. 生活质量衡量系统_数据质量与数据质量八个维度指标
  6. linux大内存拷贝优化,Linux 下基础设施及系统网络优化
  7. odoo10参考系列--ORM API 二(新旧API兼容性、模型参考和方法修饰符)
  8. BZOJ 1007 水平可见直线
  9. Winform 实现像菜单一样弹出层
  10. c#从Access数据库中选择时,Select条件有日期时间型字段的问题
  11. Codeforces D546:Soldier and Number Game
  12. java多线程Thread.sleep方法用法详解
  13. u盘装杀毒软件给计算机杀毒,安装在U盘的杀毒软件时刻护卫U盘文件安全
  14. ppt背景图片计算机教学知识,数学课件ppt背景图片
  15. 12种无线接入方式简析
  16. idea中的常用快捷键(新手必看)
  17. ES6.x版本单机三节点配置discovery.zen.ping.unicast.hosts 错误
  18. 2021/05/07 1031 查验身份证 (15 分)
  19. MATLAB交换图片红绿颜色通道,matlab的颜色映射colormap
  20. 看 YGG SEA 如何玩赚东南亚市场 | AMA回顾

热门文章

  1. java多线程 门闩_Java线程与并发编程实践----同步器(倒计时门闩,同步屏障)...
  2. 华为linux笔记本开售,华为 MateBook D Linux 版明天开售 一种价格两种版本
  3. python常考题_python面试总结2(函数常考题和异常处理)
  4. reddit android app,reddit安卓版app
  5. linux 打印函数宏,linux内核中的嵌入式汇编宏函数
  6. 判断一个list集合是否为空,用isEmpty 还是 null?
  7. mysql大表修改表名原理_MySQL修改大表工具pt-online-schema-change原理
  8. python之路 mysql 博客园_教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql...
  9. 什么时候用redis_C++传参什么时候用引用, 什么时候用指针?
  10. c语言自定义函数程序设计,ch3自定义函数设计 C语言 《解析C程序设计》.ppt