Java加载网页并跟踪HTML中的变化

时间:2015-09-07 18:14:43

标签: java html selenium

我正在尝试加载网页http://www.twitch.tv/NAME_OF_CHANNEL/chat?opentga=1以通过网络抓取来跟踪抽搐聊天。唯一的问题是,只要有人在聊天中键入消息,就会在html代码中添加ul项。我的问题是,如果我使用Selenium或只是HTTP GET请求加载页面,我如何继续获取更新的代码,以便查找发送到聊天中的所有新聊天消息?

这是一些代码的样子。

enter image description here

正如您所看到的,ul元素有一个包含随机ID的div个元素的巨大列表。在每个div元素中都有单独的聊天消息,其中包含某些信息,例如用户发送的消息以及在什么时间发送的消息。 div元素是不断更新的元素,每次发送消息时都会添加一个元素。每次发送邮件时,如何跟踪列表中每个元素的所有div元素?谢谢!

1 个答案:

答案 0 :(得分:2)

您可以poll您特定案例的DOM。 polling的含义是将驱动程序设置为监视器状态,等待某些条件得到满足。 您可以拥有implicitexplicit waiting

这样的事情将是一个良好的开端

public static void main(String[] args) throws Exception {
    WebDriver driver = new FirefoxDriver();
    driver.get("http://www.twitch.tv/NAME_OF_CHANNEL/chat?opentga=1");

    WebDriverWait initialWait = new WebDriverWait(driver, 60);
    WebElement commentsContainer = initialWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("ul.chat-lines")));
    if(commentsContainer == null)
        throw new Exception("Page unresponsive!!!");

    int numberOfComments = commentsContainer.findElements(By.cssSelector("div[id^=ember]")).size() + 1;
    while(true) {
        String newCommentSelector = "chat-lines > div:nth-child(" + numberOfComments + ")";
        WebElement newComment = (new WebDriverWait(driver, 60))
          .until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(newCommentSelector)));
        if(newComment == null) continue;

        numberOfComments++;

        System.out.println(newComment.getText());
    }
}

这可以清理。可能存在错误,但逻辑很简单。

你等到你有评论'容器。然后,您会找到该点上的所有评论并获取其编号。在那之后你就等到你"看到" initial_number_of_comments + 1评论。

选择器可能不正确。随意改变它们。这是一个永无止境的轮询循环,所以你可能想在这里介绍一些退出逻辑。