2017-05-22 20 views
1

Googleの検索結果のHTMLを解析して、各結果のタイトルを取得しようとしています。これは、以下に示すプライベートネストされたクラスでアンドロイドを介して行われます:Jsoup Google検索の結果

private class WebScraper extends AsyncTask<String, Void, String> { 

    public WebScraper() {} 

    @Override 
    protected String doInBackground(String... urls) { 
     Document doc; 
     try { 
      doc = Jsoup.connect(urls[0]).get(); 
     } catch (IOException e) { 
      System.out.println("Failed to open document"); 
      return ""; 
     } 
     Elements results = doc.getElementsByClass("rc"); 
     int count = 0; 
     for (Element lmnt : results) { 
      System.out.println(count++); 
      System.out.println(lmnt.text()); 
     } 
     System.out.println("Count is : " + count); 
     String key = "test"; 
     //noinspection Since15 
     SearchActivity.this.songs.put(key, SearchActivity.this.songs.getOrDefault(key, 0) + 1); 
     // return requested 
     return ""; 
    } 

} 

私が解析しようとしているURL例:私は上記のコードを実行したときに、私の数は次のように印刷され、何らかの理由でhttp://www.google.com/#q=i+might+site:genius.com

を0のため、結果に要素が格納されません。どんな助けでも大歓迎です! P.S. docsが正しく初期化され、HTMLページが正しく読み込まれている

答えて

1

Googleのページのソースコードを確認すると、ブラウザに通常表示されるテキストデータは含まれていないことがわかります。 JavaScriptコード。つまり、Googleはすべての検索結果を動的に出力します。

Jsoupはjavascriptコードを取得しますが、 "rc"クラスのhtmlコードは見つからないため、コードサンプルでゼロカウントを取得できます。

htmlページの直接解析ではなく、Googleの公開検索APIを使用することを検討してください:https://developers.google.com/custom-search/

0

私は完全にMatveyシドレンコに同意するが、Googleパブリック検索APIを使用するためには、キーGoogleのAPIを持っている必要があります。しかし、問題は、Google は、APIキーあたり100検索を制限し、それを超えると動作を停止し、24時間後にリセットされるということです。

最近私は、API制限のこの問題を克服するために、ユーザーが提供するさまざまなクエリのGoogle検索結果リンクを取得する必要があるプロジェクトに取り組んでいました。私は自分のAPIをgoogle/ncrとあなたに結果のリンクを提供します。

無料Google検索API- http://freegoogleapi.azurewebsites.net/ OR http://google.bittque.com

私はこのAPIを作るためHTML-UNITライブラリを使用していました。

私のAPIを使用することも、必要なものを実現するためにHTML UNITライブラリを使用することもできます。

+0

これを調べます。カスタムAPIを使用してJsoupなどのライブラリで直接Webをスクラップすることの違いは何ですか? Googleはあなたが本質的にそのルールをバイパスしていることに気付かないのですか? – villagab4

2

このコードは、Googleの「Apple」のような単語を検索し、結果からすべてのリンクを取得し、そのタイトルとURLを表示します。それはGoogleがそれを検出して結果を与えるのをやめた後、1日に500単語まで検索することができます。

search="Apple"; //your word to be search on google 
    String userAgent = "ExampleBot 1.0 (+http://example.com/bot)"; 
    Elements links=null; 
    try { 
      links = Jsoup.connect(google + 
        URLEncoder.encode(search,charset)). 
        userAgent(userAgent).get().select(".g>.r>a"); 
     } catch (UnsupportedEncodingException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
     } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    for (Element link : links) { 
       String title = link.text(); 
       String url = link.absUrl("href"); // Google returns URLs in 
    format "http://www.google.com/url?q=<url>&sa=U&ei=<someKey>". 
       try { 
        url = URLDecoder.decode(url.substring(url.indexOf('=') + 
    1, url.indexOf('&')), "UTF-8"); 
       } catch (UnsupportedEncodingException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       if (!url.startsWith("http")) { 
        continue; // Ads/news/etc. 
       } 

       System.out.println("Title: " + title); 
       System.out.println("URL: " + url); 


    } 
+0

あなたが投稿したコードに関するコメントをいくつか追加したいかもしれません。これは理解しやすいでしょう。 – Nipun

+0

このコードは、Googleの "Apple"のような単語を検索し、結果からすべてのリンクを取得し、タイトルとURLを表示します。それはGoogleがそれを検出して結果を与えるのをやめた後、1日に500単語まで検索することができます。それがあなたを助けることを願っています。 –

関連する問題