DataScraping en utilisant Jsoup en java


Je développe un programme java pour extraire des données d'un site spécifique. J'utilise jSoup comme module java.

Http://data.bitcoinity.org/markets/tradespm/10m?c=e&t=a c'est le site

Et j'essaie de supprimer les données d'exemple ci-dessous sur ce site Web.

Bitflyer 144 14.17%

Coinbase 121 11.89%

J'ai essayé de cette façon:

public static void main(String[] args) throws IOException {

    try {
    Document doc = Jsoup.connect(
            "http://data.bitcoinity.org/markets/tradespm/10m?c=e&t=a")
            .get();

    for (Element table : doc.select("tbody")){
        for (Element row : table.select("tr")) {
            Elements tds = row.select("td");


            System.out.println(row);
            System.out.println(tds);

        }
    }


} catch (IOException e) {
    e.printStackTrace();
}

Une aide? gratter les données

Author: Slim, 2018-06-01

1 answers

, Vous pouvez obtenir les données dans le tour d'une autre façon. Le Jsoup est très bon pour analyser le contenu statique, mais pour le contenu dynamique, vous devez trouver un autre moyen. Si vous observez attentivement les appels d'API effectués, la table est chargée à partir de la demande GET sur http://data.bitcoinity.org/chart_data

Vous pouvez analyser le contenu JSON pour obtenir les données. J'utilise OkHttp3 pour récupérer les données.

// Imports required
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.json.JSONArray;
import org.json.JSONObject;

public static void main(String[] args) throws IOException {
    OkHttpClient okHttpClient = new OkHttpClient();
    Request request = new Request.Builder()
            .url("http://data.bitcoinity.org/chart_data")
            .build();
    Response response = okHttpClient.newCall(request).execute();
    JSONObject responseBody = new JSONObject(response.body().string());
    JSONArray aggregated = responseBody.getJSONObject("data_additional")
            .getJSONArray("aggregated");
    for (int i = 0; i < aggregated.length(); ++i) {
        JSONObject rowInfo = aggregated.getJSONObject(i);
        System.out.println(rowInfo.getString("key") + ", " + rowInfo.getDouble("agg") + ", " + rowInfo.getString("share"));
    }
}

Le code ci-dessus générera la réponse comme

bit-x, 128103.3596, 4.39
bitfinex, 788172.829602228, 27.00
bitflyer, 385999.821606005, 13.22
bitstamp, 345652.20203694, 11.84
coinbase, 320228.256592679, 10.97
gemini, 99966.4119466147, 3.42
hitbtc, 222472.499999999, 7.62
itbit, 161030.4573, 5.52
kraken, 287811.61880974, 9.86
others, 179860.514253696, 6.16
 1
Author: pulkit-singhal, 2018-06-01 19:53:35