JSOUP - 如何抓取"需要登录"使用JSOUP的页面

时间:2016-05-18 02:06:06

标签: java session cookies web-crawler jsoup

我无法抓取我希望抓取的确定网站。问题是:成功登录该网站后,我无法访问需要有效登录的链接。

例如:

public Document executeLogin(String user, String password) {
    try {
        Connection.Response loginForm = Jsoup.connect(url)
                .method(Connection.Method.GET)
                .execute();

        Document mainPage = Jsoup.connect(login-validation-url)
                .data("user", user)
                .data("senha", password)
                .cookies(loginForm.cookies())
                .post();

        Document evaluationPage = Jsoup.connect(login-required-url)
                .get();

       return evaluationPage;
    } catch (IOException ioe) {
        return null;
    }

我在这里做的是:

  • 从登录页面获取cookie,以便我可以正确登录;
  • 然后我发布到登录验证网址,登录后返回主页面;
  • 最后我尝试在登录主页后访问登录所需的URL,但该请求返回登录页面,就像会话已过期一样。

我知道我必须存储cookie才能使会话保持活动状态,但是当我连接到登录验证网址时,它会返回一个Document对象,并且没有cookie可以从该对象获取。

有没有办法获得"会话"由成功登录创建并在其他Jsoup.connects中发送?我想要做的是抓取一个只能由登录用户访问的页面。

非常感谢你。

1 个答案:

答案 0 :(得分:4)

登录后获取cookie:

    Connection.Response loginForm = Jsoup.connect(url)
            .method(Connection.Method.GET)
            .execute();

    Connection.Response mainPage = Jsoup.connect(login-validation-url)
            .data("user", user)
            .data("senha", password)
            .cookies(loginForm.cookies())
            .execute();

    Map<String, String> cookies = mainPage.cookies();

    Document evaluationPage = Jsoup.connect(login-required-url)
            .cookies(cookies)
            .execute.parse();

   return evaluationPage;

当您获得第二个网页时,您还必须使用cookie:

(来源:几天前我遇到了这个问题)

因此,将Cookie放在Map

中会更容易
Map<String, String> cookies = loginForm.cookies();

使用这些Cookie提交表单。

相关问题