Jsoup Google搜索结果

时间:2017-05-22 20:26:31

标签: java android web-scraping jsoup google-search

我正在尝试解析Google搜索结果的HTML以获取每个结果的标题。这是通过android在一个私有嵌套类中完成的,如下所示:

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页面正确加载

3 个答案:

答案 0 :(得分:2)

此代码将搜索类似&#34; Apple&#34;在谷歌和从结果中获取所有链接并显示他们的标题和网址。它可以在google检测到并停止给出结果后的一天内搜索最多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);


    }

答案 1 :(得分:1)

如果您查看Google页面的源代码,您会发现它不包含浏览器中正常显示的任何文本数据 - 只有一堆javascript代码。这意味着Google会动态输出所有搜索结果。

Jsoup将获取该javascript代码,它将找不到任何带有&#34; rc&#34;的html代码。类,这就是为什么你的代码示例中没有计数的原因。

考虑使用Google的公共搜索API,而不是直接解析其html网页:https://developers.google.com/custom-search/

答案 2 :(得分:0)

我完全同意 Matvey Sidorenko ,但是要使用Google公共搜索API,您需要拥有 Google Api密钥。但问题是谷歌限制每个api密钥100次搜索,超过这个,它会停止工作并在24小时内重置。

最近我正在开展一个项目,我们需要为用户提供的不同查询获取谷歌搜索结果链接,以便克服这个API限制问题,我制作了自己的API直接搜索 google / ncr 并为您提供结果链接。

免费的Google搜索API - http://freegoogleapi.azurewebsites.net/http://google.bittque.com

我使用 HTML-UNIT 库来制作此API。

您可以使用我的API,也可以使用HTML UNIT库来实现您的需求。