JAVA--利用HttpClient模拟浏览器登陆请求获取响应的Cookie
在通过java采集网页数据时,我们常常会遇到这样的问题: 站点需要登陆才能访问
而这种网站,一般都会对请求进行账号密码的验证,验证的方式也有多种,需要具体分析.
今天分析其中的一种情况: 站点对登陆密码进行动态加密,作为Cookie响应给客户端,之后的请求需要携带加密后的密码进行访问
登陆成功的响应头如下图:
之后的请求头:
因为每次登陆生成一个新的加密密码,所以之前的密码会失效
所以,需要在每次采集之前,先模拟登陆获取响应的密码,再作为cookie继续请求,我们选择采用HttpClient模拟请求.
我们模拟访问千瓜数据,代码如下:
import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; @Test public void testLogin() throws IOException { //时间戳 long timestamp = new Date().getTime(); //请求地址 String url = "http://api.qian-gua.com/login/Login?_=" + timestamp; HttpClient client = new HttpClient(); //post请求方式 PostMethod postMethod = new PostMethod(url); //推荐的数据存储方式,类似key-value形式 NameValuePair telPair = new NameValuePair(); telPair.setName("tel"); telPair.setValue("18182230732"); NameValuePair pwdPair = new NameValuePair("pwd","a123456"); //封装请求参数 postMethod.setRequestBody(new NameValuePair[]{telPair,pwdPair}); //这里是设置请求内容为json格式,根据站点的格式决定 //因为这个网站会将账号密码转为json格式,所以需要这一步 postMethod.setRequestHeader("Content_Type","application/json"); //执行请求 client.executeMethod(postMethod); //通过Post/GetMethod对象获取响应头信息 String cookie = postMethod.getResponseHeader("Set-Cookie").getValue(); //截取需要的内容 String sub = cookie.substring(cookie.indexOf("&"), cookie.lastIndexOf("&")); String[] splitPwd = sub.split("="); String pwd = splitPwd[1]; System.out.println(pwd); }
这样,就可以在之后的请求中携带加密的密码访问了
相关推荐
houmenghu 2020-11-17
kentrl 2020-11-10
逍遥友 2020-10-26
jincheng 2020-09-01
Blueberry 2020-08-15
xclxcl 2020-08-03
zmzmmf 2020-08-03
阳光之吻 2020-08-03
PkJY 2020-07-08
hzyuhz 2020-07-04
89407707 2020-06-27
服务器端攻城师 2020-06-26
阳光岛主 2020-06-25
笨重的蜗牛 2020-06-20
xuanwenchao 2020-06-14
Lophole 2020-06-13
明瞳 2020-06-12
songerxing 2020-06-11