JavaでGoogle検索結果を解析する方法?


Googleは素晴らしいリソースですが、Google検索結果を本当に解析するAPIはありません.これは、Googleの検索結果を解析するのに役立つと書いたJavaコードです.

どのようにGoogle検索動作しますか?
たとえば、あなたが「JavaでGoogle検索結果を解析する方法」を捜しているならば、これはあなたが打つことを望むURLです:https://www.google.com/search?q=How+to+parse+Google+Search+result+in+Java&num=10
“Q”の後の部分は、クエリと“num”を渡すために使用されます:これはどのように多くの結果を返すようにGoogleに指示します.

HTML検索結果
これはGoogleを検索し、ページのHTMLを返すコードです.
/**
   * The method will return the search page result in a {@link String} object
   *
   * @param googleSearchQuery the google search query
   * @return the content as {@link String} object
   * @throws Exception
   */
  public static String getSearchContent(String googleSearchQuery) throws Exception {
    //URL encode string in JAVA to use with google search
    System.out.println("Searching for: " + googleSearchQuery);
    googleSearchQuery = googleSearchQuery.trim();
    googleSearchQuery = URLEncoder
        .encode(googleSearchQuery, StandardCharsets.UTF_8.toString());
    String queryUrl = "https://www.google.com/search?q=" + googleSearchQuery + "&num=10";
    System.out.println(queryUrl);
    final String agent = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";
    URL url = new URL(queryUrl);
    final URLConnection connection = url.openConnection();
    /**
     * User-Agent is mandatory otherwise Google will return HTTP response
     * code: 403
     */
    connection.setRequestProperty("User-Agent", agent);
    final InputStream stream = connection.getInputStream();
    return getString(stream);
  }
上記のコードは「URL」を与えられた検索用語ストリングをコード化して、それから与えられた検索ストリングでGoogleを呼び出して、結果をURLConnectionクラスを使用しているJavaで返すでしょう.あなたは、Googleがあなたをブロックするのを防ぐために、同様にヘッダーを変えることができます.

の検索結果からの解析結果
Google検索から本当の結果を見つけたいだけです、そして、これのために、我々はJavaでこの単純なjSinkベースのHTMLパーサーを使うことができます:
/**
   * Parse all links
   *
   * @param html the page
   * @return the list with all URLSs
   * @throws Exception
   */
  public static List<String> parseLinks(final String html) throws Exception {
    List<String> result = new ArrayList<String>();
    Document doc = Jsoup.parse(html);
    Elements results = doc.select("a > h3");
    for (Element link : results) {
      Elements parent = link.parent().getAllElements();
      String relHref = parent.attr("href");
      if (relHref.startsWith("/url?q=")) {
        relHref = relHref.replace("/url?q=", "");
      }
      String[] splittedString = relHref.split("&sa=");
      if (splittedString.length > 1) {
        relHref = splittedString[0];
      }
      //System.out.println(relHref);
      result.add(relHref);
    }
    return result;
  }
上記のコードは少しトリッキーです.それで、「A」の中で最初に「H 3」要素を見つけています.次に、現在のノードの親要素を見ます.親ノードから、URLを見つけます.
Google検索結果URLは「/url ??」で始まるので、この文字列を削除するためにregexを使います.また、URLは“& sa =”に続くので、我々はこの文字でストリングを分割して、URLの最初の部分を使います.

フルコードはhttps://system.camp/searching-google-results-and-parsing-in-java/