【问题标题】:Using Java Selenium to scrape a data across multiple pages when the url doesn't change当 url 不变时,使用 Java Selenium 跨多个页面抓取数据
【发布时间】:2018-03-04 06:29:22
【问题描述】:

我一直在尝试编写一个简单的代码来从 www.whoscored.com 抓取一些基本统计数据。 我的代码循环通过首页链接并抓取数据就好了,但是当我使用 driver.findElement(By.xpath("")).click(); 切换时到下一个表,它从第一个游戏收集数据,然后在第一个表/页面上继续循环/返回...

代码如下:

package Whoscored;

import java.io.File;


public class Datascrape {

public static void main(String[] args) throws InterruptedException, 
IOException {


        WebDriver driver = new FirefoxDriver();

        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS)

              // get the URL               
               driver.get("https://www.whoscored.com/Regions/81/Tournaments/6/Seasons/6393/Germany-Bundesliga-II");

        Thread.sleep(1000);
        driver.manage().window().maximize();

          // first loop to identify matches-list over and over again

         for (int w=0;w<=100;w++){

        List<WebElement> lista1 = 
        driver.findElements(By.cssSelector(".match-link.match-report.rc"));

          // second loop for each table

        for (int j=0;j<=lista1.size(); j++){
        lista1.get(j).click();
        driver.manage().window().maximize();


// go deeper (two clicks), grab stats and return to original position/table

   // clicks
   driver.findElement(By.xpath(".//*[@id='sub-
   navigation']/ul/li[4]/a")).click();  
   driver.findElement(By.xpath(".//*[@id='live-match-
   options']/li[3]")).click();

   // grab stats/text       
   String home6 = driver.findElement(By.xpath(".//*
   [@id='chalkboard']/div[2]/div[1]/div[3]/div[2]/span[1]")).getText();
   String away6 = driver.findElement(By.xpath(".//*
   [@id='chalkboard']/div[2]/div[1]/div[3]/div[2]/span[2]")).getText();  

          driver.navigate().back();
          Thread.sleep(5000);
          driver.navigate().back();
          Thread.sleep(5000); 
   lista1= driver.findElements(By.cssSelector(".match-link.match-
   report.rc"));

            }
   // after it finishes with first table go to second table with click

   driver.findElement(By.xpath(".//*[@id='date-
   controller']/a[1]/span")).click();
   Thread.sleep(5000);
    }   
           }
}

【问题讨论】:

  • 您指的是下一张表吗?如果能提供截图就更好了
  • 我在考虑上/下一个(在这种情况下是上一个)周比赛的表格。
  • 下一页可能是更好的表达方式。我添加了一个屏幕截图。
  • 使用带有明确等待日期更改的预期条件。
  • 你能发布一些示例代码吗?

标签: java selenium


【解决方案1】:

在阅读文档之前,您必须确保数据已加载。 例如你的电话

driver.findElement(By.xpath(".//*[@id='date-controller']a[1]/span")).click();

没问题,但你还需要确保下一个兄弟

driver.findElement(By.xpath(".//*[@id='date-controller']a[2]/span"))

已更改其值,例如初始跨度包含“2017 年 1 月 23 日 - 29 日”,onclick 应更改为“2016 年 12 月 19 日 - 25 日”

【讨论】:

    【解决方案2】:

    点击//*[@id="date-controller"]/a[3]/span后,您需要等待重新加载元素:

    ExpectedConditions.stalenessOf(....))
    

    如果您的程序变得更大更复杂,您可以使用NoraUi

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 2017-12-26
      相关资源
      最近更新 更多