2017-05-15 1 views
2

JSoup을 통해 Google 검색 결과 목록을 얻으려고합니다. 현재 사용중인 방법은 첫 페이지 (n)에서는 완벽하게 작동하지만 n + 1 페이지에서는 제대로 작동하지 않습니다. 여기에 내가 첫 번째 페이지를 받고 있어요 방법은 다음 첫 페이지 https://www.google.com/search?q=apple :JSoup로 Google 검색 결과 얻기

doc = Jsoup.connect(search).userAgent("Chrome").get(); 
links = doc.getElementsByClass("r"); 

검색 문자열은 같은 것을 포함됩니다. 그럼 내 코드는 N + 1 페이지 다음과 같습니다 https://www.google.com/#q=apple&start=10 : N + 1 페이지

for(int i = 1; i <= pages; i++){ 
    search = "https://www.google.com/#q=" + keyword + "&start=" + (i*10); 
    doc = Jsoup.connect(search).userAgent("Mozilla").get(); 
    links.addAll(doc.getElementsByClass("r")); 
} 

검색이 같이 보일 것입니다. 주요 문제는 n + 1 검색에서 doc.getElementsByClass("r")에 요소가 없다는 것입니다. 즉, r 클래스는 JSoup이 반환하는 클래스에 존재하지 않습니다. doc.toString()을 통해 검색하여이를 확인했습니다. 누구든지 어떤 제안이 있습니까?

감사합니다.

+1

검색 결과를 구문 분석하지 말고 대신 API를 사용하는 것이 좋습니다. – Kayaman

+0

@ 카야 만 어느 것? –

+0

@ 카야 만 또한 내 연구 목적으로 API를 사용하지 않으려합니다. HTML을 구문 분석하는 방법에 대한 제안 사항은 무엇입니까? – Tommy

답변

0
public class googleResults { 

    public static void main(String[] args) { 
     System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe"); 
     WebDriver driver = new FirefoxDriver(); 
     driver.manage().window().maximize(); 
     driver.get("https://www.google.com/"); 
     driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); 
     driver.findElement(By.id("lst-ib")).sendKeys("search" + Keys.ENTER); 
     driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); 
     printResults(driver); 
    } 

    public static void printResults(WebDriver driver) { 
     List<WebElement> searchResults = driver.findElements(By.className("r")); 
     for (WebElement searchResult : searchResults) { 
      System.out.println(searchResult.getText()); 
     } 
     driver.findElement(By.id("pnnext")).click(); 
     /*Limit number of calls*/ 
     driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); 
     printResults(driver); 
    } 
}