Я новичок и новичок в мире Java. У меня есть этот код
public class Test2 {
public static void main(String[] args) throws IOException {
try {
String url = "http://www.metalbulletin.com/Login.html?ReturnURL=%2fdefault.aspx&";
String articleURL = "https://www.metalbulletin.com/Article/3838710/Home/CHINA-REBAR-Domestic-prices-recover-after-trading-pick-up.html";
Connection.Response loginForm = Jsoup.connect(url)
.method(Connection.Method.GET)
.execute();
Document welcomePage = loginForm.parse();
Element formElement = welcomePage.body().getElementsByTag("form").get(0);
String formAction = formElement.attr("action");
Elements input = welcomePage.select("input[name=idsrv.xsrf]");
String securityTokenValue =input.attr("value");
Connection.Response mainPage = Jsoup.connect("https://account.metalbulletin.com"+formAction)
.data("idsrv.xsrf", securityTokenValue)
.data("username", "[email protected]")
.data("password", "Kh457544")
.cookies(loginForm.cookies())
.method(Connection.Method.POST)
.execute();
Map<String, String> cookies = mainPage.cookies();
System.out.println("\n\nloginForm.cookies()==>\n"+loginForm.cookies());
System.out.println("\n\nmainPage.cookies()==>\n"+mainPage.cookies());
Document articlePage = Jsoup.connect(articleURL).cookies(cookies).get();
Element article = articlePage.getElementById("article-body");
Elements lead1 = article.getElementsByClass("articleContainer");
System.out.println("\n\nNews Article==>\n"+lead1);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Как я могу провести рефакторинг до этого:
private Map<String, String> cookies = new HashMap<String, String>();
private Document get(String url) throws IOException {
Connection connection = Jsoup.connect(url);
for (Map.Entry<String, String> cookie : cookies.entrySet()) {
connection.cookie(cookie.getKey(), cookie.getValue());
}
Response response = connection.execute();
cookies.putAll(response.cookies());
return response.parse();
}
Я не уверен, как я могу вызвать этот метод private Document get(String url). Это может показаться глупым вопросом, но для меня он очень важен.
Как я могу назвать это в одном классе?

для этого самым простым и более эффективным решением для получения документа, а также карты файлов cookie было бы создание нового класса с именем TestThreadHandler, как показано ниже:
public class TestThreadHandler implements Runnable {
private String url;
private Document doc;
private Map<String, String> cookies;
private Semaphore barrier;
public TestThreadHandler (String url, Document doc, Map<String, String> cookies, Semaphore barrier) {
this.url = url;
this.doc = doc;
this.cookies = cookies;
this.barrier = barrier;
}
public void run () {
try {
Connection connection = Jsoup.connect(this.url);
for (Map.Entry<String, String> cookie : this.cookies.entrySet()) {
connection.cookie(cookie.getKey(), cookie.getValue());
}
Response response = connection.execute();
this.cookies.putAll(response.cookies());
this.doc = response.parse();
} catch (IOException e) {
e.printStackTrace();
}
this.barrier.release();
}
}
И вызовите этот поток из своего класса Test2 из любого места, где вы хотите его вызвать, но пример вызова этого потока будет:
public class Test2 {
public static void main(String[] args) throws IOException {
try {
...
String url = "https://www.google.com";
Document doc;
Map<String, String> cookies = new HashMap<String, String>();
Semaphore barrier = new Semaphore(0);
Thread taskThread = new Thread( new TestThreadHandler(url, doc, cookies, barrier) );
taskThread.start();
barrier.acquireUninterruptibly(1); // Wait until Thread ends
// NOW YOU HAVE BOTH DOC AND COOKIES FILLED AS DESCRIBED IN TestThreadHandler
...
} catch (IOException e) {
e.printStackTrace();
}
}
}
Таким образом вы можете перезаписать переменные, которые вы передаете в качестве аргумента потоку, и получить как файлы cookie, так и документ JSOUP.
Для дальнейшего объяснения проверьте Java-документацию ThreadHandling или не стесняйтесь спрашивать меня!
Надеюсь, это вам помогло! +1
Я благодарна тебе. Спасибо. Не могли бы вы обновить свой ответ и добавить мой требуемый код в основной метод. Я очень новичок в Java
@Java_Beginner, вам просто нужно реализовать фрагмент кода, который я написал для основного класса, каждый раз, когда вы хотите получить документ и файлы cookie, я не знаю, что вы хотите сделать, поэтому ваша задача решить, когда использовать это метод! Извините, что не могу вам помочь! Мы все были новичками, так что продолжайте практиковаться!
Я пытаюсь получить данные с веб-сайта metalbulletin с помощью простого Jsoup. Пожалуйста, помогите мне это исправить
Кто-нибудь здесь, чтобы мне помочь?