2016-05-18 62 views
2

我在抓取我希望抓取的確定網站時遇到問題。問題是:成功登錄到該網站後,我無法訪問需要有效登錄的鏈接。JSOUP - 如何使用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; 
    } 

我在這裏做的是:

  • 從登錄頁面獲取餅乾,這樣我就可以正常登錄;
  • 然後我發佈到登錄驗證網址,該網址在登錄後返回主頁面;
  • 最後,我嘗試在登錄到主頁面後訪問登錄所需的url,但該請求返回了登錄頁面,就好像會話已過期。

我知道我必須存儲cookie以保持會話活着,但是當我連接到登錄驗證url時,它會返回一個Document對象,並且沒有從該對象獲取的cookie。

有什麼辦法可以獲得成功登錄創建的「會話」,並在其他Jsoup.connects內發送它?我想要做的是抓取一個只能被登錄用戶訪問的頁面。

非常感謝您提前。

回答

4

獲取餅乾你登錄後:

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:

(來源:我前幾天有這個問題)

所以它更容易只是把餅乾在Map

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

然後使用這些cookie提交表單。

+0

你絕對正確,它完全奏效!非常感謝你。但是,請幫助我澄清最後一件事:將這些cookie發送到登錄帖時,他們是否會遭受任何修改?再次感謝,它幫助了我很多。 –

+0

@IvanAssalim不,他們不。就像在開發者控制檯中檢查網絡選項卡一樣,Cookie基本上是在那裏列出的Cookie,除了在「幻想」地圖中。 – Meinkraft

+0

該代碼可以僅使用來自登錄的cookie,用於所有後續請求,而不會。幾乎沒有使用純粹的基於cookie的驗證的網站,該cookie會改變(除了WordPress)。 –