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

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

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题