3

こんにちは、私はJavaが初めてで、インターネットからデータを取得しようとしています。例として、Google を検索し、結果の数と検索時間を保存します。jsoup DOM 機能を使用することを考えましたが、その特定の要素の値を取得する方法がわかりません。

Google chromeを使用して要素を検査する場合、興味のあるビットは

<div id="resultStats">
About 6,480,000,000 results
<nobr>  (0.26 seconds)&nbsp;</nobr>
</div>    

それが私が仕事をすることができる唯一のものですが、ドキュメントにはその要素が含まれていません。

import org.jsoup.nodes.Document;


import java.io.IOException;

public class google_time {
    public static void main(String[] args) throws IOException {
        String url = "https://www.google.com/webhp?hl=en&tab=Tw&q=data#hl=en&newwindow=1&output=search&sclient=psy-ab&q=data&oq=data&gs_l=hp.12...0.0.0.1682.0.0.0.0.0.0.0.0..0.0.les%3B..0.0...1c.Q9UUbwkFy-I&pbx=1&bav=on.2,or.r_gc.r_pw.r_cp.r_qf.&fp=6a12f0870d3ff179&biw=1066&bih=483";

        Document doc = Jsoup.connect(url).get();
        System.out.println(doc);

    }
}

では、そのビット resultStatic とそこにあるテキストだけを取得するにはどうすればよいでしょうか。

4

1 に答える 1

1

最初の問題:

https://www.google.com/webhpGoogle検索ページの動的レンダリングにURLが使用されているようです。つまり、AJAXを使用して検索結果を取得し、javascriptを使用してページにレンダリングします。jsoupはブラウザではなく、javascriptを実行しないため、使用するhtmlには検索jsoup結果がありません。

したがって、代わりにを使用できますhttps://www.google.com/search。これにより、AJAXhooplahのない結果の通常のhtmlページがレンダリングされます。ただし、Googleは引き続きブラウザ以外のソースからのリクエストをブロックするため、次のようにリクエストにUserAgentヘッダーを追加する必要があります。Jsoup

Jsoup.connect(url)
    .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1;"+
        " en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
    .get();

そして、最終的なコードは次のようになります。

import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.jsoup.nodes.Element;
import org.jsoup.Jsoup;
import java.util.Iterator;
import java.io.IOException;

public class GoogleScraper {
    public static void main(String[] args) throws IOException {
        String url = "https://www.google.com/search?"+
        "hl=en&tab=Tw&q=data#hl=en&newwindow=1&"+
        "output=search&sclient=psy-ab&q=data&oq=data"+
        "&gs_l=hp.12...0.0.0.1682.0.0.0.0.0.0.0.0..0.0.les"+
        "%3B..0.0...1c.Q9UUbwkFy-I&pbx=1&bav=on.2,"+
        "or.r_gc.r_pw.r_cp.r_qf.&fp=6a12f0870d3ff179&biw=1066&bih=483";

        try{

            Document doc = Jsoup.connect(url)
            .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1;"+
                " en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
            .get();

            //Prints the whole markup
            //System.out.println(doc.toString());

            Elements resultDivElems = doc.select("div#resultStats");
            Iterator<Element> itr = resultDivElems.iterator();

            //Prints only what you need, ie the result details
            while(itr.hasNext()){
                System.out.println(((Element)itr.next()).text());
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
于 2012-09-27T06:51:21.527 に答える