You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium Java爬取多页数据导出Excel仅显示最后一页问题求助

问题根因分析
  • 核心原因:每页写入Excel时都从行索引i=0开始创建/覆盖行,前面页写入的内容被后续页的数据直接覆盖,最终只能保留最后一页内容
  • 次要问题1:进入循环后首先点击「下一页」按钮,筛选后的第一页数据完全没被抓取,直接从第二页开始爬取
  • 次要问题2:未判断「下一页」按钮是否可点击,爬完最后一页后点击会抛出元素不存在异常
  • 次要问题3:代码中部分XPath使用绝对路径,页面结构稍有变动就会定位失败,且赞助商字段的XPath和有效期字段完全重复,会拿到相同错误数据
修复后核心代码
@Test(priority=2)
public void fetchdata() throws InterruptedException, IOException {
    // 全局行偏移量,记录已经写入了多少行数据,避免覆盖旧行
    int rowOffset = 0;
    int totalPage = 106;
    int currentPage = 1;

    while(currentPage <= totalPage) {
        // 先爬当前页数据,再点击下一页
        java.util.List<WebElement> companyname1 = driver.findElements(By.xpath("/html/body/div[3]/div[2]/div/div/div/div[1]/div[1]/h3/a/div"));
        for (int i=0;i<companyname1.size();i++) {
            sh.createRow(rowOffset + i).createCell(1).setCellValue(companyname1.get(i).getText());
        }

        java.util.List<WebElement> appraisalleader1 = driver.findElements(By.xpath("/html/body/div/div/div/div/div/div[2]/div[1]/div/small"));
        for (int j=0;j<appraisalleader1.size();j++) {
            sh.getRow(rowOffset + j).createCell(2).setCellValue(appraisalleader1.get(j).getText());
        }

        java.util.List<WebElement> partner1  = driver.findElements(By.xpath("/html/body/div[3]/div/div/div/div/div[2]/div[3]/div/small"));
        for (int k=0;k<partner1.size();k++) {
            sh.getRow(rowOffset + k).createCell(3).setCellValue(partner1.get(k).getText());
        }

        java.util.List<WebElement> validity1  = driver.findElements(By.xpath("/html/body/div[3]/div[2]/div/div/div/div[3]/div[2]/div/small"));
        for (int l=0;l<validity1.size();l++) {
            sh.getRow(rowOffset + l).createCell(4).setCellValue(validity1.get(l).getText());
        }

        // 注意:此处原代码XPath和有效期字段重复,请自行替换为赞助商字段的正确定位路径
        java.util.List<WebElement> sponser1= driver.findElements(By.xpath("替换为赞助商字段的正确XPath"));
        for (int m=0;m<sponser1.size();m++) {
            sh.getRow(rowOffset + m).createCell(5).setCellValue(sponser1.get(m).getText());
        }

        // 行偏移量累加当前页的行数
        rowOffset += companyname1.size();
        currentPage++;

        // 最后一页不需要点击下一页
        if(currentPage <= totalPage) {
            WebElement next = driver.findElement(By.xpath("//a[text()='Next']"));
            next.click();
            // 等待页面加载完成,可替换为显式等待更稳定
            Thread.sleep(3000);
        }
    }

    // 写入文件并自动关闭资源
    try (FileOutputStream fos = new FileOutputStream(file);
         XSSFWorkbook useWb = wb) {
        useWb.write(fos);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        driver.quit();
    }
}
额外优化建议
  • 替换固定的106页循环为判断下一页按钮是否存在/是否可点击的逻辑,避免页面总页数变动导致报错
  • 替换绝对路径XPath为相对路径,按类名、属性定位元素,提高代码稳定性
  • 把Thread.sleep替换为WebDriverWait显式等待,等待目标元素加载完成再抓取数据,避免拿到空数据
  • 可以先添加表头行,方便后续Excel数据读取

内容的提问来源于stack exchange,提问作者gudi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:54:02