2017-10-06 2 views
-2

웹 페이지 https://iaeme.com/ijmet/index.asp에서 모든 pdf 파일을 다운로드하려고합니다.루프에 실패하지 않고 for 루프에서 다음 페이지로 이동합니까?

페이지마다 다른 링크가 있습니다. 각 링크에는 여러 개의 다운로드와 더 많은 페이지가 있습니다. 다음 페이지를 탐색하고 루프를 계속 진행하려고합니다.

package flow; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.net.URL; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.StandardCopyOption; 
import java.util.List; 
import java.util.NoSuchElementException; 

import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 
import org.apache.tools.ant.taskdefs.Java; 
import org.apache.tools.ant.types.FileList.FileName; 
import org.openqa.selenium.By; 
import org.openqa.selenium.JavascriptExecutor; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebDriver.Navigation; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.chrome.ChromeDriver; 
import org.w3c.dom.Text; 

import jxl.common.Assert; 
//kindly ignore the imports 


public class excel { 

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

     System.setProperty("webdriver.chrome.driver", "C:\\Users\\User_2\\Downloads\\chromedriver_win32\\chromedriver.exe"); 
     WebDriver d=new ChromeDriver(); 
     d.manage().window().maximize(); 
     d.get("https://iaeme.com/ijmet/index.asp");     
     java.util.List<WebElement> catvalues=d.findElements(By.className("issue")); 
     for(int i=0;i<=catvalues.size();i++){ 
      catvalues.get(i).click();      
      java.util.List<WebElement> downcount=d.findElements(By.linkText("Download")); 
      System.out.println(downcount.size()); 

      for(int k=1;k<=downcount.size();k++){ 
       downcount.get(k).click();             
       Thread.sleep(5000);       
      } 

      d.navigate().back(); 
      catvalues = d.findElements(By.className("issue")); 
     } 
    } 
} 

다른 방법을 시도했지만 실패했습니다. 당신이 https://iaeme.com/ijmet/index.asp 페이지를 검사하는 경우

답변

1

, 당신은 온 클릭 속성이 사장님 ID 각 클래스 점에 유의 할 수 있습니다. 이 속성에는 관심있는 모든 페이지를 열 때 필요한 정보가 있습니다.

예 :

:

패턴은

onclick="journalpissue('8','9','IJMET')" 

이에서이 예제에서,

https://iaeme.com/ijmet/issues.asp?JType=IJMET&VType=8&IType=9

그래서이 링크를 만들어야합니다

012 모든 링크가 있으면 3,516,

VTYPE는 = 8 ITYPE = 9 JType = IJMET

, 당신은 모든 페이지에 반복 할 수 있습니다.

각 페이지에 대해 클래스 ID가 인 모든 요소의 href 속성 값을 jounl으로 가져와야합니다.

일단 PDF 링크가 있으면 "컬"명령을 계속 사용합니다. 당신은 셀레늄 모든 파일을 다운로드하려면이 대답 유용 할 수 https://stackoverflow.com/a/37664671/3881320

public class Stackoverflow { 

public static void main(String args[]) { 
     WebDriver driver = new FirefoxDriver(); 
     driver.get("https://iaeme.com/ijmet/index.asp"); 
     java.util.List<WebElement> likValues = driver.findElements(By.className("lik")); 
     LinkedList<String> allUrl = new LinkedList<>(); 
     String baseUrl = "https://iaeme.com/ijmet/"; 
     for (WebElement el : likValues) { 
      String journalpissue = el.getAttribute("onclick"); 
      String relativeUrl = parseJournalpissue(journalpissue); 
      allUrl.add(relativeUrl); 
     } 

     for (String url : allUrl) { 
      analyzePage(driver, baseUrl + url, true); 
     } 

    } 

private static void analyzePage(WebDriver driver, String url, boolean searchOtherPages) { 
     driver.get(url); 
     List<WebElement> allA = null; 
     if (searchOtherPages) { 
      List<WebElement> tdlist = driver.findElements(By.cssSelector("table[class='contant'] tr td")); 
      WebElement pages = tdlist.get(tdlist.size() - 1); 
      System.out.println(pages.getText()); 
      allA = pages.findElements(By.tagName("a")); 
     } 

     java.util.List<WebElement> jounl = driver.findElements(By.className("jounl")); 
     for (WebElement wel : jounl) { 
      String href = wel.getAttribute("href"); 
      if (href.contains(".pdf")) { 
       System.out.println("File to download: " + href); 
       downloadFile(href); 
      } 
     } 

     if (allA != null) { 
      for (WebElement a : allA) { 
       String href = a.getAttribute("href"); 
       System.out.println(href); 
       analyzePage(driver, href, false); 
      } 
     } 
    } 


private static void downloadFile(String file) { 
     try { 
      String[] CMD_COMPOSED = { 
       "/bin/bash", 
       "-c", 
       "curl -O " + file,}; 
      String output; 

      Process p = Runtime.getRuntime().exec(CMD_COMPOSED); 
      StringBuilder outputBuilder; 
      outputBuilder = new StringBuilder(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream(), StandardCharsets.UTF_8)); 
      String line = null; 

      while ((line = reader.readLine()) != null) { 
       outputBuilder.append(line + "\n"); 
      } 
      output = outputBuilder.toString(); 
     } catch (IOException ex) { 
      Logger.getLogger(Stackoverflow.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    private static String parseJournalpissue(String journalpissue) { 
     String finalUrl = null; 

     StringTokenizer st = new StringTokenizer(journalpissue, "'"); 
     st.nextToken(); 
     String vType = st.nextToken(); 
     st.nextToken(); 
     String iType = st.nextToken(); 
     st.nextToken(); 
     String jType = st.nextToken(); 

     finalUrl = "issues.asp?JType=" + jType + "&VType=" + vType + "&IType=" + iType; 
     System.out.println(finalUrl); 
     return finalUrl; 

    } 
} 

참고 : 나는 (다운로드 할 수있는 PDF 파일이 있습니다) 이러한 페이지 중 하나에있는 것을 고려하지 않았다가 더 많은 페이지가 될 수 있습니다 (설명에서 "더 많은 페이지"). 이를 위해 동일한 접근법을 사용할 수 있습니다.

편집 : 클래스 명 "의 상수"로 테이블에

enter image description here

: 페이지 수에 대한

정보를 정기적으로는에 있습니다. 특히 마지막 요소입니다.

그래서 :

List<WebElement> tdlist = driver.findElements(By.cssSelector("table[class='contant'] tr td")); 
WebElement pages = tdlist.get(tdlist.size() - 1); 

우리는 "A"태그 이름에 대한 관심이 :

List<WebElement> allA = pages.findElements(By.tagName("a")); 

지금 우리는 또한 다른 모든 페이지의 URL을 가지고있다. 우리는 pdf 파일을 제거하기 위해 이전과 동일한 접근법을 사용할 수 있습니다.

+0

감사합니다, 나는 이것을 시도 할 것입니다. – SarathChandar

+0

친구 나는 다운로드 할 수 있었다, 나는 다음 페이지에 항해 할 수 없었다, 저를 도울 수 있는가 ?? – SarathChandar

+0

답변을 편집하고 다른 페이지에서 탐색 할 수있는 부분을 삽입했습니다. 나는 최종 목표를 얻는 다른 (최선의) 방법이 있다고 확신한다. 이런 종류의 문제에 대한 해결책을 찾는 방법을 이해하는 데 도움이되기를 바랍니다. –

관련 문제