使用Jsoup登录和导航

时间:2018-12-06 13:15:20

标签: java web-scraping jsoup

我正在尝试使用JSoup登录网站,我的目标是从网站中抓取一些数据,但是登录/导航时遇到一些问题。

有关当前代码的外观,请参见下面的代码。

BelongsToMany::make('Pending Users', 'pendingUsers', 'App\Nova\User'),

我也尝试添加

    try {
        Connection.Response response = Jsoup.connect("https://app.northpass.com/login")
                .method(Connection.Method.GET)
                .execute();

        response = Jsoup.connect("https://app.northpass.com/login")
                .data("educator[email]", "email123")
                .data("educator[password]", "password123")
                .cookies(response.cookies())
                .method(Connection.Method.POST)
                .execute();

        // Go to new page
        Document coursePage = Jsoup.connect("https://app.northpass.com/course")
                .cookies(response.cookies())
                .get();

        System.out.println(groupPage.title());

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

.data("commit", "Log in")

没有成功。

我得到的错误如下:

.userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21")

根据我在其他线程上阅读的内容,人们建议使用userAgent(如上所述,我已经尝试过)。预先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果尝试在浏览器中尝试登录时查看网络流量,则会看到发送了其他数据:authenticity_token。这是表单中的隐藏字段。

然后,您需要从初始响应中提取该请求,并与POST请求一起发送:

try {
    Connection.Response response = Jsoup.connect("https://app.northpass.com/login")
            .method(Connection.Method.GET)
            .execute();

    //I can't test this but will be something like
    //see https://jsoup.org/cookbook/extracting-data/selector-syntax
    Document document = response.parse();
    String token = document.select("input[hidden]").first().val();

    response = Jsoup.connect("https://app.northpass.com/login")
            .data("educator[email]", "email123")
            .data("educator[password]", "password123")
            .data("authenticity_token", token)
            .cookies(response.cookies())
            .method(Connection.Method.POST)
            .execute();

    // Go to new page
    Document coursePage = Jsoup.connect("https://app.northpass.com/course")
            .cookies(response.cookies())
            .get();

    System.out.println(groupPage.title());

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