将从不同网页抓取的数据追加到数组列表中

时间:2018-12-18 08:48:56

标签: java selenium arraylist web-scraping append

我正在从事一个涉及从网站抓取数据的项目,但是遇到了问题。我想从一个网页中抓取数据,将其追加到arraylist中,然后使搜寻器移至下一页并执行相同的操作,依此类推,等等,但是当我执行代码时,前面的数据被覆盖,最后我仅抓取了最终网页中的抓取数据。 我也遇到错误:线程“ main”中的异常org.openqa.selenium.StaleElementReferenceException:陈旧元素引用:元素未附加到页面文档   (会议信息:chrome = 71.0.3578.98)   (驱动程序信息:chromedriver = 2.42.591059(a3d9684d10d61aa0c45f6723b327283be1ebaad8),平台= Mac OS X 10.13.6 x86_64)(警告:服务器未提供任何堆栈跟踪信息) 命令持续时间或超时:0毫秒

下面是我的代码和日志。请帮忙。谢谢。 以下将抓取数据并将其附加到数组列表中:

do {

        row = (ArrayList<WebElement>) driver.findElements(By.cssSelector(".event-row-container.ng-scope"));

        WebElement element = driver.findElement(By.cssSelector(".paybillnumbers"));
        ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


        new WebDriverWait(driver,20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("li.ng-scope[translate='next']"))).click();
        times++;
        rows.addAll(row);
        }
        while(times <=6);

这是日志将错误引用到的代码:

                ArrayList<WebElement> rowDetails2 = (ArrayList<WebElement>) rowDetails.findElements(By.cssSelector(".event-market.market-3-way.market-selections-3"));

这是我的日志:

在端口3035上启动ChromeDriver 2.42.591059(a3d9684d10d61aa0c45f6723b327283be1ebaad8) 仅允许本地连接。 2018年12月18日上午11:18:53 org.openqa.selenium.remote.ProtocolHandshake createSession INFO:检测到的方言:OSS 在端口24080上启动ChromeDriver 2.42.591059(a3d9684d10d61aa0c45f6723b327283be1ebaad8) 仅允许本地连接。 2018年12月18日11:18:58 org.openqa.selenium.remote.ProtocolHandshake createSession INFO:检测到的方言:OSS 98 线程“主”中的异常org.openqa.selenium.StaleElementReferenceException:陈旧元素引用:元素未附加到页面文档   (会议信息:chrome = 71.0.3578.98)   (驱动程序信息:chromedriver = 2.42.591059(a3d9684d10d61aa0c45f6723b327283be1ebaad8),平台= Mac OS X 10.13.6 x86_64)(警告:服务器未提供任何堆栈跟踪信息) 命令持续时间或超时:0毫秒

1 个答案:

答案 0 :(得分:0)

对于StaleElementReferenceException,我们需要使用等待

    new WebDriverWait(driver, 60).until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector(".event-market.market-3-way.market-selections-3")));

此处最多可以设置60秒,您可以更改。定位器也包含数字3,执行时可能会更改定位器,因此请仔细研究。

如果等待失败,您也可以在Java中使用Thread.sleep。

推荐this