【问题标题】:Jsoup Google Search ResultsJsoup 谷歌搜索结果
【发布时间】:2017-05-22 20:26:30
【问题描述】:

我正在尝试解析 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 页面正在正确加载

【问题讨论】:

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


    【解决方案1】:

    此代码将在 google 中搜索“Apple”之类的单词,并从结果中获取所有链接并显示其标题和网址。在谷歌检测到它并停止给出结果后,它可以在一天内搜索多达 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);
    
    
        }
    

    【讨论】:

    • 您可能想添加一些关于您发布的代码的 cmets。这很容易理解。
    【解决方案2】:

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

    Jsoup 将获取该 javascript 代码,它不会找到任何带有“rc”类的 html 代码,这就是为什么您的代码示例中计数为零。

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

    【讨论】:

      【解决方案3】:

      我完全同意 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 库来实现您所需要的。

      【讨论】:

      • 我会调查的。使用自定义 API 和使用 Jsoup 等库直接抓取网页有什么区别? Google 没有注意到您实际上是在绕过他们的规则吗?
      猜你喜欢
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 2023-03-20
      • 2011-05-21
      • 2014-11-02
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多