我是怀着无比激动的心情写下的这篇文章,搞了我一周多终于算是成功的模拟了登录。我是在看这位博主的一篇博客以后,对他的代码做了部分改动,才弄好的大家赶紧去看啊,晚了就没了。
我先说怎么改的,省的有些人性子急,看不下去。
文中提到的博主的项目没有使用maven的形式,而是采用了jar包,我down下来他的代码,运行以后,控制台报错,一个是SSL的错,一个就是说jsoup.parse方法,解析了空数据。我去博主下面留了言,他告诉我说要换一个HttpClient方法。好在这几天研究这个比较多,果断的换了一个HttpClient创建的方法,结果jar包不支持,于是乎,有了这一版maven形式的。大家也可以参考一下。
整理一下思路吧:
第一次请求登录获取页面信息,不仅仅有账号和密码哟,还有cookie(很重要)等。
第二次登录,设置用户名,密码,还有第一次获得的cookie
怎么能确定是否登录成功呢?输出document查看控制台就行。如果你们不知道document里放的是啥,那我就锤死你们。
package com.csdn;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.Consts;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
public class Spilider {
public static void main(String[] args) {
//1. 获取登录所需的信息
Map login_info = getLoginInfo();
//2. 模拟登录获取Cookie
String cookie = getCookie(login_info);
//3. 携带Cookie访问目标页(换成自己的)
//String target_url = "http://blog.csdn.net/tmaskboy";
String target_url = "http://blog.csdn.net/dashuaixv";
//携带登录获取的Cookie
String result = getData(target_url, cookie);
Document document = Jsoup.parse(result);
System.out.println(document); //可以看到控制台上已经打印出登陆后页面看到的数据,完成!。
}
/**
* 获取登录时和用户名密码一起提交过去的参数
* @return
*/
public static Map getLoginInfo(){
//login_url即为F12下header里的referer所指的路径
String login_url = "https://passport.csdn.net/account/login?ref=toolbar";
//login_url即为F12下header里的origin所指的路径
String login_host = "https://passport.csdn.net"; //表单中获取的登录地址不带域名,需自行添加,拼接域名需注意‘/’,不要多加或漏加
Map return_data = new HashMap();
try {
Document document = Jsoup.connect(login_url)
.userAgent("ozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36")
.get();
//获取登录的表单
Elements element = document.select("#fm1");
// System.out.println(element);
//获取登录所需要的一些参数
return_data.put("lt", element.select("input[name=lt]").attr("value"));//登录流水号
return_data.put("execution", element.select("input[name=execution]").attr("value"));
return_data.put("_eventId", element.select("input[name=_eventId]").attr("value"));
//获取点击登录的请求地址
return_data.put("action", login_host + element.attr("action"));
}catch (IOException e) {
e.printStackTrace();
}
return return_data;
}
/**
* 模拟提交账号信息,获取cookie
* @param data
* @return
*/
public static String getCookie(Map data){
String cookie = "";
try{
//HttpClient httpClient = new DefaultHttpClient();
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost post = new HttpPost(data.get("action"));
/* 模拟登录所需要的参数,有些网站登录时会检测,
如果存在基本上为必须,但CSDN发现并没有检测,故没有添加
在Chrome开发者平台中可查看,粘贴过来即可
*/
// post.setHeader("Host", "passport.csdn.net");
// post.setHeader("Referer","https://passport.csdn.net/account/login?ref=toolbar");
// post.setHeader("Origin", "https://passport.csdn.net");
// post.setHeader("Content-Type","application/x-www-form-urlencoded");
List params = new ArrayList();
//参数
params.add(new BasicNameValuePair("lt", data.get("lt")));
params.add(new BasicNameValuePair("execution", data.get("execution")));
params.add(new BasicNameValuePair("_eventId", data.get("_eventId")));
//用户名和密码(*号),替换为自己的
params.add(new BasicNameValuePair("username", "*********"));
params.add(new BasicNameValuePair("password", "**********"));
post.setEntity(new UrlEncodedFormEntity(params,Consts.UTF_8));
HttpResponse response = httpClient.execute(post);
int statusCode = response.getStatusLine().getStatusCode();
if(statusCode != 200){
System.out.print(statusCode);
}
Header[] map = response.getAllHeaders();
//如需查看所有的响应头,取消以下注释即可
/*System.out.println("显示响应Header信息\n");
for (Header entry : map)
{
System.out.println("Key : " + entry.getName() + " ,Value : " + entry.getValue());
}*/
//对于登录,主要为获取响应头中的Cookie信息,拼接Cookie
for (Header entry : map)
{
if(entry.getName().contains("Set-Cookie")){
cookie += entry.getValue() + ";";
}
}
System.out.println("Cookie信息:" + cookie);
}catch (Exception e) {
e.printStackTrace();
}
return cookie;
}
public static String getData(String target_url, String cookie){
String result = null;
try{
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(target_url);
//传入Cookie信息
httpGet.setHeader("Cookie", cookie);
HttpResponse response = httpClient.execute(httpGet);
int statusCode = response.getStatusLine().getStatusCode();
if(statusCode != 200){
System.out.print(statusCode);
}
HttpEntity entity = response.getEntity();
if (entity != null) {
result = EntityUtils.toString(entity, "utf-8");
}
}catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
以上是代码,以下是依赖,因为我还写了别的,所以依赖较多,有一部分对本项目没用,可以忽略
org.jsoup
jsoup
1.11.2
com.mks.api
mksapi-jar
4.10.9049
com.mks.api
mksapi-jar
4.10.9049
org.apache.httpcomponents
httpcore
4.4.10
commons-httpclient
commons-httpclient
3.1
org.slf4j
slf4j-api
1.7.21
org.slf4j
slf4j-log4j12
1.7.21
commons-logging
commons-logging
1.2
com.rabbitmq
http-client
2.0.1.RELEASE
commons-codec
commons-codec
1.11
com.alibaba
fastjson
1.2.33
junit
junit
4.12
com.twelvemonkeys.common
common-io
3.1.1
org.apache.commons
commons-lang3
3.7