【问题标题】:Load new elements and take them with Selenium and HtmlUnitDriver加载新元素并使用 Selenium 和 HtmlUnitDriver 获取它们
【发布时间】:2018-02-16 11:37:44
【问题描述】:

我正在尝试抓取具有标题和 cmets 的网站。加载页面时,会呈现 40 cmets,但单击“加载 cmets”按钮后会出现新的 40 cmets,依此类推。我想先加载所有的cmets,然后把它们都拿走。 问题是我只得到前 40 个。这是我的代码:

WebDriver driver = new HtmlUnitDriver();    
driver.get(www.website.com);
String title = driver.findElement(By.className("title")).getText();

while(driver.findElements(By.className("load-comments")).isDisplayed() || !driver.findElement(By.className("expand-loading")).isDisplayed()){
                    Thread.sleep(500);
                    if(!driver.findElements(By.className("loading")).isDisplayed()){
                        driver.findElements(By.className("load-comments")).click();
                    }
                }


List<WebElement> comments = (List<WebElement>) driver.findElements(By.className("comment"));
for(WebElement comm:comments){
   System.out.print(comm.getText());
}

所以,如果我需要所有 150 个 cmets,在这种情况下,我只会获得加载页面时可见的前 40 个。

我尝试了options.addArguments("--headless");ChromeDriver(options);,但速度很慢。

PS: load-cmets 按钮在所有 cmets 加载完成时隐藏,如果页面正在加载新 cmets,则显示 loading 元素。

【问题讨论】:

    标签: java selenium web-crawler


    【解决方案1】:

    您提供的网站没有显示任何 cmets。请提供准确的网址以定位元素。 为什么要使用“driver.findelements”而不是“driver.findelement”来显示条件?这个逻辑会给你编译错误。 使用 headless 时需要添加参数来设置屏幕分辨率。我建议您先使用带有 ui 的 chrome,然后检查 headless。

    【讨论】:

    • play.google.com/store/apps/… 我需要从 google play 商店为少数几个应用程序获取所有 cmets。所以我需要先加载所有的cmets,然后再全部收集。问题是我需要爬虫是无头的。当我使用 ChromeDriver 尝试此操作时,一切正常,但使用 HtmlUnitDriver,爬虫仅收集前 40 个 cmets。
    • 在给定的网络中,我找不到任何带有“load-cmets”的类。
    • 你可以试试 phantomJS 并在加载时截屏吗...如果屏幕没有最大化,那么它可能会作为未显示的元素。尝试通过添加参数来最大化浏览器
    • 代码只是一个例子,它不是真正的代码,因为它更复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 2011-08-25
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多