Java爬虫模拟登录-----用HttpClient模拟登录CSDN,用jsoup解析

我是怀着无比激动的心情写下的这篇文章,搞了我一周多终于算是成功的模拟了登录。我是在看这位博主的一篇博客以后,对他的代码做了部分改动,才弄好的大家赶紧去看啊,晚了就没了。
我先说怎么改的,省的有些人性子急,看不下去。
文中提到的博主的项目没有使用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
    
  

你可能感兴趣的:(java爬虫)