2017-05-22 99 views
1

我試圖解析谷歌搜索結果的HTML來獲取每個結果的標題。這是通過機器人在私人嵌套類做如下圖所示:Jsoup谷歌搜索結果

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 ""; 
    } 

} 

我試圖解析一個例子網址:http://www.google.com/#q=i+might+site:genius.com

出於某種原因,當我運行上面的代碼,我的計數被打印成0,因此沒有元素被存儲在結果中。任何幫助深表感謝!附: docs已被初始化並且HTML頁面已正確加載

回答

1

如果您檢查Google網頁的源代碼,您會注意到它不包含瀏覽器中通常顯示的任何文本數據 - 只有一堆javascript代碼。這意味着Google會動態輸出所有搜索結果。

Jsoup將獲取該JavaScript代碼,並且它不會找到任何具有「rc」類的html代碼,這就是爲什麼您的代碼示例中計數爲零。

考慮使用Google的公開搜索API,而不是直接解析其html頁面:https://developers.google.com/custom-search/

0

我完全馬特維·西多連科同意,但使用谷歌搜索的公共API,你需要有谷歌API密鑰。但問題是,谷歌限制100個搜索每個API密鑰,超過這個,它停止工作,它會在24小時內重置。

最近我正在開發一個項目,我們需要獲取用戶提供的不同查詢的谷歌搜索結果鏈接,以便解決API限制這個問題,我做了我自己的API,直接在谷歌/ ncr並給出結果鏈接。

免費谷歌搜索API - http://freegoogleapi.azurewebsites.net/ OR http://google.bittque.com

我用HTML-UNIT庫使這個API。

您可以使用我的API或者您可以使用HTML UNIT庫來實現您所需的功能。

+0

我會看看這個。使用自定義API和直接使用Jsoup等庫來刮取網絡有什麼區別?谷歌是否沒有注意到你基本上繞過了他們的規則? – villagab4

2

此代碼將搜索谷歌中的「蘋果」一詞,並從結果中獲取所有鏈接並顯示其標題和網址。它可以在谷歌檢測到並停止提供結果後的一天內搜索多達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

此代碼將搜索谷歌中的「蘋果」一詞,並從結果中獲取所有鏈接並顯示其標題和網址。它可以在谷歌檢測到並停止提供結果後的一天內搜索多達500個字。我希望它能幫助你。 –