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<String, String> 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<String, String> 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<String, String> return_data = new HashMap<String, String>();

        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<String, String> 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<NameValuePair> params = new ArrayList<NameValuePair>();

            //参数
            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;
    }
}

以上是代码,以下是依赖,因为我还写了别的,所以依赖较多,有一部分对本项目没用,可以忽略

<dependencies>
    <dependency>
      <groupId>org.jsoup</groupId>
      <artifactId>jsoup</artifactId>
      <version>1.11.2</version>
    </dependency>
    <dependency>
      <groupId>com.mks.api</groupId>
      <artifactId>mksapi-jar</artifactId>
      <version>4.10.9049</version>
    </dependency>
    <dependency>
      <groupId>com.mks.api</groupId>
      <artifactId>mksapi-jar</artifactId>
      <version>4.10.9049</version>
    </dependency>
    <!-- httpcore -->
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpcore</artifactId>
      <version>4.4.10</version>
    </dependency>

    <!-- httpclient -->
    <dependency>
      <groupId>commons-httpclient</groupId>
      <artifactId>commons-httpclient</artifactId>
      <version>3.1</version>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.21</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.21</version>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>com.rabbitmq</groupId>
      <artifactId>http-client</artifactId>
      <version>2.0.1.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>1.11</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.33</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>
    <dependency>
      <groupId>com.twelvemonkeys.common</groupId>
      <artifactId>common-io</artifactId>
      <version>3.1.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.7</version>
    </dependency>
  </dependencies>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值