#java #eclipse #http #jsoup
#java #eclipse #http #jsoup
Вопрос:
У меня есть программа webscraper, которая переходит на несколько веб-сайтов для отслеживания статистики видеоигр и собирает статистику для определенных игроков, чьи имена были введены в электронную таблицу Google. Программа предназначена для личного использования, поэтому я доволен отключением проверки сертификации и подвергаю себя рискам, связанным с этим. В настоящее время я получаю следующую ошибку при запуске моего кода:
Exception in thread "main" org.jsoup.HttpStatusException: HTTP error
fetching URL. Status=403,
URL=https://overwatchtracker.com/profile/pc/global/ClaySymp-1875
at
org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:776)
at
org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:722)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:306)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:295)
at HtmlParser.main(HtmlParser.java:134)
Мой текущий код:
`
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.security.cert.CertificateException;
import java.util.ArrayList;
import javax.net.ssl.*;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
public class HtmlParser {
public static void main(String[] args) throws IOException {
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException
{
// TODO Auto-generated method stub
}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException
{
// TODO Auto-generated method stub
}
}};
// Ignore differences between hostnames
HostnameVerifier hv = new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1)
{
// TODO Auto-generated method stub
return true;
}
};
// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(hv);
} catch (Exception e) {}
// ROCKET LEAGUE PLAYER NAME SETUP
ArrayList<String> rlList = new ArrayList<String>();
Document rlDoc = Jsoup.connect(
"https://docs.google.com/spreadsheets/d/e/2PACX-1vRGC6L6f9jAdqE3YsVLQRxlH3pHWj451XcxOaluQoWSJsZBwUiGeFmzzrogINy81Ng_Ic-y-wM5sPoC/pubhtml")
.get();
for (Element table : rlDoc.select("table.waffle")) {
for (Element row : table.select("tr")) {
Elements tds = row.select("td");
if (tds.size() > 0) {
rlList.add(tds.get(0).text());
}
}
}
// ROCKET LEAGUE STAT COLLECTION
for (int i = 0; i < rlList.size(); i ) {
String full = "";
String url = "https://rocketleague.tracker.network/profile/xbox/" rlList.get(i);
Document rl = Jsoup.connect(url).get();
System.out.println(rlList.get(i));
for (Element table : rl.select("table.card-table.items")) {
int j = 0;
for (Element row : table.select("tr")) {
Elements tds = row.select("td");
if (tds.size() > 5) {
if (tds.get(1).text().substring(0, 6).equalsIgnoreCase("ranked")) {
String td2 = tds.get(2).text();
String td4 = tds.get(4).text();
if (td2.equals(""))
tds.get(2).html("N/A");
if (td4.equals(""))
tds.get(4).html("N/A");
if (j == 0) {
full = tds.get(1).text().substring(16) " " tds.get(2).text() " "
tds.get(3).text() " " tds.get(4).text() " " tds.get(5).text();
} else if (j == 1) {
full = tds.get(1).text().substring(19) " " tds.get(2).text() " "
tds.get(3).text() " " tds.get(4).text() " " tds.get(5).text();
} else if (j == 2) {
full = tds.get(1).text().substring(25) " " tds.get(2).text() " "
tds.get(3).text() " " tds.get(4).text() " " tds.get(5).text();
} else if (j == 3) {
full = tds.get(1).text().substring(20) " " tds.get(2).text() " "
tds.get(3).text() " " tds.get(4).text() " " tds.get(5).text();
}
System.out.println(full);
j ;
}
}
}
}
System.out.println("n");
}
// END ROCKET LEAGUE
// OVERWATCH PLAYER NAME SETUP
ArrayList<String> owList = new ArrayList<String>();
Document owDoc = Jsoup.connect(
"https://docs.google.com/spreadsheets/d/e/2PACX-1vSZ7qiTCaOniDQzn4nq0tLdT_pATKa7Y1k30CebIgoxxEd04PsRRc-K2LjfzD_rSrsREluLS4oKtAPn/pubhtml")
.get();
for (Element table : owDoc.select("table.waffle")) {
for (Element row : table.select("tr")) {
Elements tds = row.select("td");
if (tds.size() > 0) {
owList.add(tds.get(0).text());
}
}
}
// OVERWATCH STAT COLLECTION
for (int i = 0; i < owList.size(); i ) {
String url = "https://overwatchtracker.com/profile/pc/global/" owList.get(i);
System.out.println(owList.get(i));
Document ow = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36").get();
Elements elements = ow.select("div.infobox-container");
for (Element e : elements) {
System.out.println(e.text());
}
System.out.println("n");
}
// END OVERWATCH
// FORTNITE PLAYER NAME SETUP
ArrayList<String> fList = new ArrayList<String>();
Document fDoc = Jsoup.connect(
"https://docs.google.com/spreadsheets/d/e/2PACX-1vQuZI5-dcO1vAzB_Yl-FWURT_tp2Wog7G2Xg8_2BDZRgPyGJFUDFh0w_ryIkgrcJ_U1ogFdez-R4ngj/pubhtml")
.get();
for (Element table : fDoc.select("table.waffle")) {
for (Element row : table.select("tr")) {
Elements tds = row.select("td");
if (tds.size() > 0) {
fList.add(tds.get(0).text());
}
}
}
// FORTNITE STAT COLLECTION
for (int i = 0; i < fList.size(); i ) {
String full = "";
System.out.println(fList.get(i));
Document f = Jsoup.connect("https://fortnitetracker.com/profile/pc/" fList.get(i)).userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36").get();
Elements elements = f.select("div.trn-defstats.trn-defstats--width4");
for (Element e : elements) {
System.out.println(e.text());
}
}
System.out.println("n");
// END FORTNITE
}
}
и текущий полный вывод, который я получаю, является:
EZJ7
Platinum I Division II N/A 657 (Top 33%) N/A 0 Win Streak: 6
Unranked Division I N/A 1,090 (Top 21%) N/A 0
Unranked Division I N/A 568 (Top 60%) N/A 0 Losing Streak: 5
Diamond II Division III N/A 1,062 (Top 25%) N/A 0
WombatWarfare11
Diamond III Division II N/A 957 (Top 4.2%) N/A 0
Champion II Division II ~3 1,311 (Top 6%) ~27 74
Diamond II Division II N/A 912 (Top 11%) N/A 0
Champion II Division I ~12 1,283 (Top 7%) ~25 17 Losing Streak: 3
BlueFlash19
Gold III Division IV N/A 621 (Top 42%) N/A 0 Losing Streak: 5
Diamond II Division II N/A 1,030 (Top 25%) N/A 0 Losing Streak: 6
Platinum II Division I N/A 696 (Top 35%) N/A 0 Losing Streak: 2
Diamond III Division III N/A 1,161 (Top 15%) N/A 0 Losing Streak: 3
ClaySymp-1875
Exception in thread "main" org.jsoup.HttpStatusException: HTTP error
fetching URL. Status=403,
URL=https://overwatchtracker.com/profile/pc/global/ClaySymp-1875
at
org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:776)
at
org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:722)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:306)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:295)
at HtmlParser.main(HtmlParser.java:134)
Пожалуйста, не стесняйтесь обращаться ко мне за любыми ошибками, которые я делаю неправильно, поскольку я довольно новичок в работе с сетями, но я ищу решение для этого типа ошибок, которое не такое гетто, как мои решения для самозаверяющих сертификатов.
Комментарии:
1. 403 — это запрещенный код, поэтому, скорее всего, вам придется пройти аутентификацию на веб-сайте, прежде чем пытаться получить доступ к странице. Также возможно, что страница неправильно указана в вашем коде или что на страницу должен быть передан какой-то параметр.
2. @KevinO Можете ли вы подробнее рассказать о решениях для аутентификации и параметризации?