小優YoU 2017-12-09 00:47 采纳率: 100%
浏览 1834
已采纳

selenium-java + phantomjs 怎么捕获网页不定时推送的元素事件

我要用 selenium-java + phantomjs 爬取某网页上<div class="system-msg-list">下的内容,这个<div>是一个系统消息推送节点,特点如下:


1、打开网页后,这个最初 div节点是空的(应该是通过class做了js事件监听)
2、保持网页不刷新,这个div节点会 不定时 地收到系统消息(不需要本地发送请求,这是被动接收的消息),然后会新增一些子节点<div class="system-msg">
3、一旦刷新网页,这个<div>节点会被清空,会继续等待新的系统消息

我现在用 selenium + phantomjs 尝试捕获这个节点的系统消息,于是就遇到一个问题:

** phantomjs打开网页后,网页会保持在打开那个瞬间的镜像,即使有系统消息推送过来,phantomjs也不会刷新<div>节点。而我一旦刷新网页,网站就会清空<div>节点的内 容。**

贴出我部分代码,这个问题困扰我很久,有没有熟悉selenium的同学给点建议?

 WebDriver driver = browserDriver.getWebDriver();   // 我自己封装的类,返回的是 PhantomJS 驱动
driver.get(httpUrl);    // 打开网页
while(isStop() == false) {
    WebElement chatMsgList = driver.findElement(By.className("system-msg-list"));

    // 系统消息: 这个节点一直是空的
    List<WebElement> systems = chatMsgList.findElements(By.className("system-msg"));
    for(WebElement element : systems) {
        WebElement content = element.findElement(By.className("msg-content"));
        WebElement link = content.findElement(By.name("a"));
        String url = link.getAttribute("herf");
        String desc = link.getText();

        System.out.println(url + ", " + desc);
    }

    // 若刷新网页,由于网页机制导致 system-msg-list 一直是空的
    // 若不刷新,则PhantomJS加载的网页一直都是同一个镜像,收不到系统推送的消息
//  browserDriver.refresh(driver);  
//  driver.getPageSource(); 
}
  • 写回答

5条回答 默认 最新

  • beiyuelai 2017-12-09 00:53
    关注

    建议,分析下网页的那个ajax请求,然后直接模拟个请求抓取需要的数据。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 flask项目,怎么使用AJAX传数据库数据到echarts图表的data里,实现异步加载数据。
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题