在 java 中使用 Jsoup 进行数据抓取
DataScraping using Jsoup in java
我正在开发一个 java 程序来从特定站点抓取数据。我正在使用 jSoup 作为 java 模块。
http://data.bitcoinity.org/markets/tradespm/10m?c=e&t=a
那是网站
我正试图在该网站上删除下面的示例数据。
bitflyer 144 14.17%
coinbase 121 11.89%
我试过这样:
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();
}
有什么帮助吗?抓取数据
你可以通过其他方式获取回合中的数据。 Jsoup
非常适合解析静态内容,但对于动态内容,您需要另辟蹊径。如果您敏锐地观察 API 调用,那么 table 是从 http://data.bitcoinity.org/chart_data
上的 GET 请求加载的
您可以解析JSON中的内容来获取数据。我使用 OkHttp3 来检索数据。
// 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"));
}
}
以上代码将生成类似
的响应
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
我正在开发一个 java 程序来从特定站点抓取数据。我正在使用 jSoup 作为 java 模块。
http://data.bitcoinity.org/markets/tradespm/10m?c=e&t=a 那是网站
我正试图在该网站上删除下面的示例数据。
bitflyer 144 14.17%
coinbase 121 11.89%
我试过这样:
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();
}
有什么帮助吗?抓取数据
你可以通过其他方式获取回合中的数据。 Jsoup
非常适合解析静态内容,但对于动态内容,您需要另辟蹊径。如果您敏锐地观察 API 调用,那么 table 是从 http://data.bitcoinity.org/chart_data
您可以解析JSON中的内容来获取数据。我使用 OkHttp3 来检索数据。
// 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"));
}
}
以上代码将生成类似
的响应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