Как использовать метод jsoup document

Я новичок и новичок в мире 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", "ifiih@rupayamail.com")
            .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). Это может показаться глупым вопросом, но для меня он очень важен.

Как я могу назвать это в одном классе?

Кто-нибудь здесь, чтобы мне помочь?

Java_Beginner 06.11.2018 11:27
0
1
67
1

Ответы 1

для этого самым простым и более эффективным решением для получения документа, а также карты файлов 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 14.11.2018 12:55

@Java_Beginner, вам просто нужно реализовать фрагмент кода, который я написал для основного класса, каждый раз, когда вы хотите получить документ и файлы cookie, я не знаю, что вы хотите сделать, поэтому ваша задача решить, когда использовать это метод! Извините, что не могу вам помочь! Мы все были новичками, так что продолжайте практиковаться!

alvarobartt 14.11.2018 13:46

Я пытаюсь получить данные с веб-сайта metalbulletin с помощью простого Jsoup. Пожалуйста, помогите мне это исправить

Java_Beginner 15.11.2018 12:46

Другие вопросы по теме