2012-04-14 110 views
3

我想使用Jsoup來抓取僅在我登錄時可用的頁面。我想這意味着我需要登錄一個頁面並將Cookie發送到另一頁面。
我看了一些以前的職位here和寫下面的代碼:使用Jsoup登錄並抓取數據

public static void main(String[] args) throws IOException { 
    Connection.Response res = Jsoup.connect("login.yahoo.com") 
     .data("login", "myusername", "passwd", "mypassword") 
     .method(Method.POST) 
     .execute(); 

Document doc=res.parse(); 
String sessionId = res.cookie("SESSIONID"); 

Document doc2 = Jsoup.connect("http://health.groups.yahoo.com/group/asthma/messages") 
     .cookie("SESSIONID", sessionId) 
     .get(); 

Elements Eles=doc2.getElementsByClass("message"); 

String content=Eles.first().text(); 

System.out.println(content); 

我的問題是我怎麼能在這裏認識我的cookie的名稱(即「SESSIONID」)發送我的登錄信息?我用.cookies()方法來獲取所有從登錄頁面餅乾:


DK
YM
牛逼
PH
Ÿ
˚F

我想他們一個一個但沒有工作。我可以從其中的一些獲得sessionId,但是我無法從第二頁成功獲取節點,這意味着我沒有成功登錄。任何人都可以給我一些建議嗎?非常感謝!

+0

雅虎有很多cookie,通過https執行登錄和其他安全隱患。 – vikiiii 2012-04-15 04:05:18

回答

2

您是否嘗試過做這樣的事情:

Connection.Response res = Jsoup.connect("https://login.yahoo.com/config/login?") 
    .data("login", "myusername", "passwd", "mypassword") 
    .method(Method.POST) 
    .execute(); 

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

Connection connection = Jsoup.connect("http://health.groups.yahoo.com/group/asthma/messages"); 

for (Map.Entry<String, String> cookie : cookies.entrySet()) { 
    connection.cookie(cookie.getKey(), cookie.getValue());  
} 

Document doc= connection.get(); 
// #code selector 
// Example 
// Element e=doc.select(".ygrp-grdescr").first(); 
// System.out.println(e.text()); // Print => This list will be for asthmatics, and anyone whose  life is affected by it. Discussions include causes, problems, and treatment 

我希望你這適用於您的問題。

7

我一直在用jsoup登錄網站。

我想到的是一個硒webdriver和jsoup的混合。

Webdriver可以遠程控制瀏覽器,通常用於測試目的。

對於我的應用程序來說,讓瀏覽器可見並且在屏幕上亂搞是不可取的。所以我使用了「靜音」webdriver:HtmlUnitDriver。

HtmlUnitDriver driver = new HtmlUnitDriver(true); // true meaning javascript support (Using rhino i be leave) 

現在登錄到一個網站,我使用:使用jsoup

String htmlContent = driver.getPageSource(); 

開始:

String baseUrl = "http://www.thesite.com"; 

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 

driver.get(baseUrl); 

driver.findElement(By.id("TextBoxUser")).clear(); 
driver.findElement(By.id("TextBoxUser")).sendKeys("username"); 
driver.findElement(By.id("TextBoxPass")).clear(); 
driver.findElement(By.id("TextBoxPass")).sendKeys("password"); 
driver.findElement(By.id("Button1")).click(); 

獲取頁面內容,您可以使用此行代碼實例化這個

Document document = Jsoup.parse(htmlContent); 

這有工作我很棒。

Steffn Otto Jensen

+0

我想添加的一件事,除了常規硒以外,請確保添加'HtmlUnitDriver'罐。除此之外,非常感謝Jsoup在經歷了6個小時的挫折後,這是一個救星 – Tiberiu 2014-10-30 02:00:52