我正在尝试以通常的方式登录网页,以便对数据进行Webscrap /提取。一切都可以在“登录”部分正常运行,但是我得到的响应是HTML页面,其中显示“正在登录,请稍候”。
我想要的返回页面是“序列”中的最后一个。
有什么办法可以跳过吗?我有什么想念的吗?
很抱歉,如果重复的话,我在StackOverflow上已读过,却没有发现类似的东西。
代码如下:
public static void main(String[] args) throws IOException, ParseException{
final String USER_AGENT = "\"Mozilla/5.0 (Windows NT\" +\n" +
" \" 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2\"";
String username = "xxx";
String password = "xxx";
HashMap<String, String> cookies = new HashMap<>();
HashMap<String, String> formData = new HashMap<>();
String loginFormUrl = "https://id.ice.no/oauth2/account/login?returnUrl=%2Foauth2%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3DSelfService%26redirect_uri%3Dhttps%253A%252F%252Fminside.ice.no%252Fsignin-callback.html%26response_type%3Did_token%2520token%26scope%3Dopenid%2520profile%2520roles%2520SelfService%26state%3D7f6047df0ddd4949b2992761ed98dd3b%26nonce%3Dbfc111c39548438c9a39b327c745947f%26acr_values%3DreturnUrl%2520Lw%253D%253D";
String loginActionUrl= "https://id.ice.no/oauth2/account/login?returnUrl=%2Foauth2%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3DSelfService%26redirect_uri%3Dhttps%253A%252F%252Fminside.ice.no%252Fsignin-callback.html%26response_type%3Did_token%2520token%26scope%3Dopenid%2520profile%2520roles%2520SelfService%26state%3D6ef2cad2efd24b3db7d61343aacc29f5%26nonce%3Db8b29eea53ae4952b8ffec5c43a9882a%26acr_values%3DreturnUrl%2520L2Fib25uZW1lbnQvMTYxODYwNjIvc2VuZHNtcw%253D%253D";
Connection.Response loginForm = Jsoup.connect(loginFormUrl).method(Connection.Method.GET).userAgent(USER_AGENT).execute();
Document loginDoc = loginForm.parse(); // this is the document that contains response html
cookies.putAll(loginForm.cookies()); // save the cookies, this will be passed on to next request
formData.put("username", username);
formData.put("Password", password);
String authToken = loginDoc.select("#form > input[type=hidden]:nth-child(8)")
.first()
.attr("value");
formData.put("__RequestVerificationToken", authToken);
Connection.Response homePage = Jsoup.connect(loginActionUrl)
.cookies(cookies)
.data(formData)
.method(Connection.Method.POST)
.userAgent(USER_AGENT)
.execute();
System.out.println(homePage.parse().html());
答案 0 :(得分:1)
如果没有真实的登录名和密码来检查那里发生的事情,很难说,所以我不得不猜测。很少评论:
使用用户名输入的名称为Username
,但是您正在使用username
设置formData。这可能会引起问题。
登录表单输入很少,但您只输入用户名,密码和令牌。这可能会引起问题。您应该始终包括所有字段,所以您会丢失:
String returnUrl = loginDoc.select("input[name=ReturnUrl]").first().attr("value");
formData.put("ReturnUrl", returnUrl);
formData.put("RememberLogin", "false");
formData.put("button", "login");
对于用户浏览器的调试器来说,查看真正提交的数据始终是一个好主意:
String authToken = loginDoc.select("#form > input[type=hidden]:nth-child(8)").first().attr("value");
您可以简单地使用:
String authToken = loginDoc.select("input[name=__RequestVerificationToken]").first().attr("value");
ReturnUrl
中定义的URL。 Jsoup无法处理javascript重定向,因此您必须手动请求该页面。实际上,无论如何,这就是您的浏览器会执行的操作-使用最新的Cookie再次发出请求。您处在正确的轨道上,因此在代码末尾,您还应该使用获得的Cookie来获取所需的页面: cookies.putAll(homePage.cookies());// get the cookies after successful login
Connection.Response finalPage = Jsoup.connect(returnUrl) //this should be the URL of the page you want to visit in the first place
.cookies(cookies)
.userAgent(USER_AGENT)
.execute();
编辑: 哦,这些确实是正确的凭据。但是我在Chrome调试器的“网络”标签中看到了更多的信息和更多的重定向。由于新URL的一部分是由Javascript生成的,因此很复杂。为了克服Jsoup的局限性,请尝试使用Selenium Webdriver。