2012-04-14 6 views
3

Ich möchte Jsoup verwenden, um eine Seite zu durchsuchen, die nur verfügbar ist, wenn ich mich angemeldet habe. Ich schätze, dass ich mich auf einer Seite anmelden und Cookies an eine andere Seite senden muss.
Ich las etwas früheren Beitrag here und schreiben Sie den folgenden Code:Verwenden von Jsoup zum Anmelden und Crawlen von Daten

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); 

Meine Frage ist, wie ich meine Cookie-Namen wissen kann (das heißt „SESSIONID“) hier für meine Login-Infos zu senden? Ich benutzte die .cookies() Methode alle Cookies von der Login-Seite zu erhalten:

B
DK
YM
T
PH
Y
F

Ich versuchte sie ein um eins, aber keiner hat funktioniert. Ich könnte sessionId von einigen von ihnen bekommen, aber ich konnte nicht erfolgreich Knoten von der zweiten Seite bekommen, was bedeutet, dass ich mich nicht erfolgreich angemeldet habe. Könnte mir jemand einige Vorschläge geben? Danke vielmals!

+0

Yahoo hat viele Cookies, führt Login über https und andere Sicherheitsauswirkungen. – vikiiii

Antwort

2

Haben Sie so etwas wie dies zu tun versucht:

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 

Ich hoffe, dass Sie das funktioniert für Ihr Problem.

7

Ive kämpfte mit Anmeldung bei Websites mit jsoup auch.

Was ich kam, war eine Mischung aus Selen-Webdriver und Jsoup.

Webdriver kann einen Browser fernsteuern, normalerweise wird dies zu Testzwecken verwendet.

Für meine Anwendung war es nicht wünschenswert, den Browser sichtbar zu machen und auf dem Bildschirm herumzuspielen. Also habe ich den "stillen" Webdriver: HtmlUnitDriver verwendet. Sie können dies mit dieser Codezeile instanziiert:

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

Jetzt benutze ich auf eine Website anmelden:

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(); 

den Seiteninhalt Get:

String htmlContent = driver.getPageSource(); 

beginnen mit jsoup:

Document document = Jsoup.parse(htmlContent); 

Dies hat funktioniert D großartig für mich.

Steffn Otto Jensen

+0

Eine Sache, die ich hinzufügen möchte, stellen Sie sicher, dass Sie das 'HtmlUnitDriver'-Glas zusätzlich zu den regulären Selen-Gläsern hinzufügen. Abgesehen davon, vielen Dank, nach 6 Stunden Frustration mit Jsoup, war dies ein Lebensretter – Tiberiu

Verwandte Themen