2017-05-15 13 views
2

JSoupでGoogle検索結果のリストを取得しようとしています。私が現在使っている方法は最初のページ(n)では完璧に動作しますが、n + 1ページではうまく動作しません。ここでは、私が最初のページを取得しています方法です:最初のページのhttps://www.google.com/search?q=appleJSoupで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

@Kayamanどちらか? –

+0

@Kayamanまた、私の研究の目的のために、私は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); 
    } 
} 
関連する問題