java爬虫(三)利用HttpClient和Jsoup模拟网页登陆(无验证码)

简介:

注意问题:本文是基于校园信息门户进行的实验,因为用户名密码需要的涉密,因此文中的代码不加修改肯定不能直接运行成功。如果读者二次开发过程运行代码出现问题欢迎与作者联系。可以直接留言,也可以邮箱留言1449268538@qq.com

模拟登录的原理:

  总的来说,模拟发送请求,是浏览器发送什么,我们在代码里面就发送什么,包括请求的url,请求的参数,请求的方式,及请求头。既然是登录请求,则满足登录请求所需的条件即可。这里的重点是确定登录表单的参数,确定发送登录请求时所需的参数,以及这些参数被传到哪里去了。

实现过程:

1.使用浏览器的审查元素功能(F12)查看需要访问界面的一些参数.

开启审查元素后正常输入用户名和密码进行登录操作,登录成功的过程会发现审查元素内多了很多元素。

依次点击 network-->login(找不到这个也可以点击类似的带login的其他name)-->Headers-->图中的Request URL就是下文需要添加的网址

 

2.实际操作方法

package debug;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jsoup.Connection;
import org.jsoup.Connection.Method;
import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;


public class test {
public static String LOGIN_URL = "http://authserver.tjut.edu.cn/authserver/login";//上文提到的Request URL public static String USER_AGENT = "User-Agent"; public static String USER_AGENT_VALUE = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0"; public static void main(String[] args) throws Exception {    simulateLogin("203128***", "你自己的密码"); // 第二处需要修改的位置:模拟登陆github的用户名和密码 } /** * @param userName 用户名 * @param pwd 密码 * @throws Exception */ public static void simulateLogin(String userName, String pwd) throws Exception { /* * 第一次请求 * grab login form page first * 获取登陆提交的表单信息,及修改其提交data数据(login,password) */ // get the response, which we will post to the action URL(rs.cookies()) Connection con = Jsoup.connect(LOGIN_URL); // 获取connection con.header(USER_AGENT, USER_AGENT_VALUE); // 配置模拟浏览器 Response rs = con.execute(); // 获取响应 Document d1 = Jsoup.parse(rs.body()); // 通过Jsoup将返回信息转换为Dom树 List<Element> eleList = d1.select("#casLoginForm"); // 第三处需要修改的地方:获取提交form表单,可以通过查看页面源码代码得知 // 获取cooking和表单属性 // lets make data map containing all the parameters and its values found in the form Map<String, String> datas = new HashMap<>(); for (Element e : eleList.get(0).getAllElements()) { // 第四处需要修改的内容:注意问题2:设置用户名 注意equals(这个username和password也是要去自己的登录界面input里找name值) if (e.attr("name").equals("username")) { e.attr("value", userName); } // 设置用户密码 if (e.attr("name").equals("password")) { e.attr("value", pwd); } // 排除空值表单属性 if (e.attr("name").length() > 0) { datas.put(e.attr("name"), e.attr("value")); } } /* * 第二次请求,以post方式提交表单数据以及cookie信息 */ Connection con2 = Jsoup.connect("http://authserver.tjut.edu.cn/authserver/login"); con2.header(USER_AGENT, USER_AGENT_VALUE); // 设置cookie和post上面的map数据 Response login = con2.ignoreContentType(true).followRedirects(true).method(Method.POST) .data(datas).cookies(rs.cookies()).execute(); // 报错Exception in thread "main" org.jsoup.HttpStatusException: HTTP error fetching URL. Status=500, // 报错原因:见上边注意问题2 // 打印,登陆成功后的信息 System.out.println(login.body()); // 登陆成功后的cookie信息,可以保存到本地,以后登陆时,只需一次登陆即可 Map<String, String> map = login.cookies(); for (String s : map.keySet()) { System.out.println(s + " : " + map.get(s)); } } }

3.基于本代码二次开发时注意需要修改的内容(看代码中的注释)

后期开发

在模拟登陆后,使用保存的cookies去精准抓取需要登陆才能访问的页面中需要的信息。(参照下一篇文章)

java爬虫(四)利用Jsoup获取需要登陆的网站中的内容(无验证码的登录)

原文地址:https://www.cnblogs.com/StarZhai/p/14117066.html