【问题标题】:How to read youtube comments using Selenium?如何使用 Selenium 阅读 youtube 评论?
【发布时间】:2014-04-24 03:32:38
【问题描述】:

我正在尝试使用以下代码阅读 youtube 视频 cmets:

FirefoxDriver driver = new FirefoxDriver();
driver.get("https://www.youtube.com/watch?v=JcbBNpYkuW4");

WebElement element = driver.findElementByCssSelector("#watch-discussion");
System.out.println(element.getText()); // this prints: loading..

// scrolll down so that comments start to load
driver.executeScript("window.scrollBy(0,500)", "");

Thread.sleep(10000);

element = driver.findElementByCssSelector("#watch-discussion");
System.out.println(element.getText());

最后一条语句打印一个空字符串。为什么?

【问题讨论】:

  • 在<div> watch-discussion里面有一个iframe,你需要switchTo()那个框架,webdriver才能看到它的内容。

标签: java javascript selenium youtube


【解决方案1】:

我建议您尝试this API,它非常简单/可靠,而不是依赖元素的 X 路径。此外,您不能依赖 Xpath 来获取动态页面/内容。

【讨论】:

    【解决方案2】:

    这有点棘手,因为所有的 cmets 都写在 watch 讨论中的一个单独的 iframe 标记中。您必须先使用 driver.switchTo().frame("put ID or Name here");但 iframe id 是随机值。切换到该 iframe 后,您可以在 div 中找到类名为“Ct”的所有 cmets,以便您可以使用 XPATH 获取这些 cmets。请参阅下面的工作代码

    FirefoxDriver driver = new FirefoxDriver();
    driver.get("https://www.youtube.com/watch?v=JcbBNpYkuW4");
    
    WebElement element = driver.findElementByCssSelector("#watch-discussion");
    System.out.println(element.getText()); // this prints: loading..
    
    // scrolll down so that comments start to load
    driver.executeScript("window.scrollBy(0,500)", "");
    
    Thread.sleep(20000);
    
    List<WebElement> iframes = driver.findElements(By.xpath("//iframe"));
    
    for(WebElement e : iframes) {       
        if(e.getAttribute("id") != null && e.getAttribute("id").startsWith("I0_")) {
        // switch to iframe which contains comments
        driver.switchTo().frame(e);
        break;
        }
    }
    
    // fetch all comments
    List<WebElement> comments = driver.findElements(By.xpath("//div[@class='Ct']"));
    for(WebElement e : comments) {      
        System.out.println(e.getText());
    }
    

    【讨论】:

    • 您的代码是返回所有可能的 cmets,还是受到 YouTube API 可以返回的最大 cmets 数量的限制?
    • 不,此代码仅用于访问 youtube cmets 部分。如果 cmets 的数量更多,you tube 不会在第一次加载时提供所有 cmets。您需要进行更改才能获取所有内容,例如点击页面末尾的“显示更多”按钮。
    • 我在运行你的脚本时遇到了一些问题(我之前没有通过 cmd 运行 java)。如果你已经在 cmd 中运行了你的脚本,你能建议我如何运行它吗?从现在开始,我有javac -classpath "C:\selenium-2.42.2\selenium-server-standalone-2.42.2.jar;C:\selenium-2.42.2\selenium-java-2.42.2.jar;C:\selenium-2.42.2\selenium-firefox-driver-2.42.2.jar" comments.java java comments,但返回了一个关于 firefox-driver 的异常错误。谢谢!
    • 你能用 eclipse 运行你的程序吗?
    • 我以前从未使用过eclipse。我会试一试,但我最感兴趣的是在 cmd 中运行它。感谢您的回复。
    猜你喜欢
    • 2013-02-17
    • 2015-03-31
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多