`

使用httpclient4登录百度

阅读更多

使用httpclient4.0.1登录百度,具体步骤如下:

  1. 访问百度首页获取首页HMTL内容
  2. 使用百度帐号登陆百度
  3. 重复第一步,这时可以比较两次获取的HTML的差别

如果感兴趣想测试的同学,可以去网站上下载需要的Jar包,然后执行一下看看!!

下面附上具体测试的代码:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
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.client.params.CookiePolicy;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

/**
 * 使用httpclient4登陆百度
 * @author gohands
 *
 */
public class BaiduLogin {
   
    private static String URL_CHARACTER = "gb2312"; // 统一字符集
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        //初始化
        DefaultHttpClient httpclient = new DefaultHttpClient();
        // 这一行必须要加,否则服务器无法获取登陆状态
        HttpClientParams.setCookiePolicy(httpclient.getParams(),CookiePolicy.BROWSER_COMPATIBILITY);

        // 第一次访问
        String url = "http://www.baidu.com";
        HttpGet httpget = new HttpGet(url);
        HttpResponse response = httpclient.execute(httpget);
        System.out.println("Length1::" + response.getEntity().getContentLength());
        HttpEntity entity = response.getEntity();
        BaiduLogin.printEntity(entity);

        // 登陆【使用POST方式登录】

        // 如果要直接执行,麻烦去申请个百度的帐号

        // 不好意思,给百度做广告了
        HttpPost httpost = new HttpPost("http://passport.baidu.com/?login");
        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
        nvps.add(new BasicNameValuePair("username", "gohands"));
        nvps.add(new BasicNameValuePair("password", "*******"));
        httpost.setEntity(new UrlEncodedFormEntity(nvps, BaiduLogin.URL_CHARACTER));
        response = httpclient.execute(httpost);

        // 第二次访问
        System.out.println("\n----------------------------------------");
        System.out.println(response.getStatusLine());
        List<Cookie> cookies = httpclient.getCookieStore().getCookies();
        entity = response.getEntity();
        BaiduLogin.printEntity(entity);

        System.out.println("\n----------------------------------------");

        cookies = httpclient.getCookieStore().getCookies();

        System.out.println("cookies" + cookies.size());
        httpget = new HttpGet(url);
        // httpget.setr
        // httpget.setHeader(name, value)
        response = httpclient.execute(httpget);
        System.out.println("Length2::"
                + response.getEntity().getContentLength());
        entity = response.getEntity();
        BaiduLogin.printEntity(entity);
    }

    /**
     * 输出entity内容,获取和输出返回的HTML文
     * @param entity
     * @throws IllegalStateException
     * @throws IOException
     */
    private static void printEntity(HttpEntity entity)
            throws IllegalStateException, IOException {

        if (entity == null) {
            return;
        }
        System.out.println("HttpEntity start >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        System.out.println("Response content length: " + entity.getContentLength());
        InputStream is = entity.getContent();
        BufferedReader in = new BufferedReader(new InputStreamReader(is));
        List<Byte> li = new ArrayList();
        int i;

        //之所以写的如此复杂是因为了解决中文问题
        while ((i = is.read()) != -1) {
            li.add((byte) i);
        }
        byte a[] = new byte[li.size()];
        for (i = 0; i < a.length; i++) {
            a[i] = (byte) li.get(i);
        }
        System.out.println(new String(a, BaiduLogin.URL_CHARACTER)); // 打印HTML内容
        entity.consumeContent(); // entity销毁
        System.out.println("HttpEntity END >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    }
}

如果有疑问或好的想法随时可以跟我沟通,谢谢阅读!

依赖的Jar包

apache-mime4j-0.6.jar
commons-codec-1.3.jar
commons-logging-1.1.1.jar
httpclient-4.0.1.jar
httpcore-4.0.1.jar
httpmime-4.0.1.jar

 

-----------------------------------------------------------

2015/02/02:

好几年前写的代码了,

现在前端渲染开发比较多,画面上全是JS封装的,

这段代码已经不能正常使用了。

 

 

4
0
分享到:
评论
8 楼 holleyangyanges 2014-05-06  
name327 写道
LZ说句打击你的话, 首先不说Https的事情, 先说说你提交的参数, 最重要的token你这都没有。你自己我估计都没登陆成功过。


应该怎么写,你有没有写过的例子
7 楼 holleyangyanges 2014-05-06  
,没有登陆成功啊!
6 楼 name327 2012-06-13  
LZ说句打击你的话, 首先不说Https的事情, 先说说你提交的参数, 最重要的token你这都没有。你自己我估计都没登陆成功过。
5 楼 gohands 2011-11-17  
java1997 写道
博主,百度现在登录网址跳转到了https://passport.baidu.com/?login,你的代码用不了了,有没有新的可用代码可以共享下,谢谢。

这是当时学习用的,下次有时间试试!
可以使用浏览器禁用JScript看看HTML文。
4 楼 java1997 2011-11-10  
博主,百度现在登录网址跳转到了https://passport.baidu.com/?login,你的代码用不了了,有没有新的可用代码可以共享下,谢谢。
3 楼 tomfish88 2011-07-29  
再有个问题请教

我用的4.1.1 返回 HTTP/1.1 302 的时候页面打印的内容是转向内容,
<html><body>You are being <a href="http://tomfish88.iteye.com/login">redirected</a>.</body></html>

然后如何进一步到登陆后的页面呢,然后我继续用get打印内容里面有
<a href="/login" class="welcome" title="登录">您还未登录 !</a>
    <a href="http://www.iteye.com/all" style="color:red">我的应用</a>
    <a href="/login">登录</a>
    <a href="/signup" class="nobg">注册</a>

我知道我没有登陆成功

HttpResponse rsp= httpclient.execute(httpget,localContext);

我又这样了一次 ,有什么问题么?是因为没带cookie么?


ps,你这里的回复我那里没反映,方便到我的空间回复一下么,非常感谢http://tomfish88.iteye.com
2 楼 gohands 2011-07-21  
tomfish88 写道
为啥要先get,后post呢,不能直接post么? 请解答?

虽然没有测试,但是我想应该可以,其实前后并没有直接关联。
只是为了描述完成过程而已。
1 楼 tomfish88 2011-06-28  
为啥要先get,后post呢,不能直接post么? 请解答?

相关推荐

    httpclient4之百度模拟登陆,回复与58同城自动登陆

    本主题将深入探讨如何使用HttpClient4库进行百度和58同城的模拟登陆操作。HttpClient4是一个强大的Java库,它提供了丰富的功能来执行HTTP请求,非常适合进行网页交互。 首先,我们来了解HttpClient4的基本用法。...

    httpclient绕过登陆验证码直接抓取内部数据

    在使用 HttpClient 时,我们可以通过 setCookieStore 方法将 Cookie 添加到 HttpClient 中,这样在下次请求中,HttpClient 会自动携带 Cookie。但是,这种方法需要注意 Cookie 的路径、域名和过期时间等信息,如果不...

    C#版本模拟登陆百度,2018年4月27日可用

    本项目"**C#版本模拟登陆百度,2018年4月27日可用**"提供了一个C#语言编写的程序,专门用于模拟用户登录百度网站,而且在发布时是有效的。这个程序的独特之处在于,它不仅能够完成基本的登录操作,还为开发者提供了...

    模拟登陆百度的Java实现

    这篇博客“模拟登陆百度的Java实现”提供了一个使用Java编程语言来模拟登录百度网站的实例。以下将详细介绍这个过程中的关键知识点。 首先,我们需要理解HTTP协议的基础,特别是GET和POST请求。在登录过程中,...

    Java模拟登录百度Demo

    在Java中,我们可以使用`HttpURLConnection`类或者第三方库如Apache HttpClient或OkHttp来实现。这里我们可能主要使用`HttpURLConnection`,因为它是Java标准库的一部分,无需额外引入依赖。 1. **构建请求头**: ...

    c# winform 自动登录 百度账户 源代码

    在C#中,我们可以使用`System.Net.WebClient`或`System.Net.Http.HttpClient`类来发送POST请求。在本例中,可能需要获取登录页面的CSRF令牌,这通常隐藏在HTML源码中的一个输入字段内,然后将其添加到登录数据中。 ...

    模拟登陆百度

    在Java中,我们可以使用HttpURLConnection、HttpClient或Apache的OkHttp等库来完成网络请求。本例中,我们以HttpURLConnection为例,因为它是Java标准库的一部分,无需额外引入依赖。 1. **构建登录请求**: - ...

    模拟百度登录

    本篇将深入探讨如何使用Java语言来实现模拟百度登录的过程。 首先,我们需要了解登录过程的基本步骤。通常,登录一个网站涉及以下几个环节: 1. 用户输入用户名和密码。 2. 发送HTTP请求到服务器,携带用户名和...

    人脸识别登陆

    对于标签"Java",在实现这个过程时,Java开发者可能会使用诸如`HttpURLConnection`或者第三方库如Apache HttpClient来发起HTTP请求,与百度AI的服务器通信。同时,他们还需要处理返回的结果,根据API文档解析JSON...

    一款网站客户端开发的案例.zip

    这是一款网站客户端开发的案例,该案例实现了用到了图书馆的一些数据,图书馆用的系统又没提供数据接口,所以老规矩,用HttpClient和Jsoup这两大开源工程上,用Android手机来模拟图书馆查询的请求与响应,网站是学校...

    Java源码 SpringMVC Mybatis Shiro Bootstrap Rest Webservice

    8. Httpclient破解验证码,登陆联通充值平台 9. 汉字、英文拆分、可以用作文档关键字搜索等。 10. Base64图片处理,支持PC,Android,IOS 11. Service Socket 、Client Socket 通信技术(已经做过GPRS数据获取,并...

    一款网站客户端开发的案例

    这是一款一款网站客户端开发的案例,该案例实现了用到了图书馆的一些数据,图书馆用的系统又没提供数据接口,所以老规矩,用HttpClient和Jsoup这两大开源工程上,用Android手机来模拟图书馆查询的请求与响应,网站是...

Global site tag (gtag.js) - Google Analytics