之前在Android 开发学习记录(2)---- httpclient使用(一)中介绍了httpclient最简单的模仿 HTTP 中 get 和 post 行为,这样已经可以获取到大部分网站的信息了,但对于一些需要注册登录的网站而言,单单用之前的方法就无法满足需求了。这时候就需要进一步探索了,httpclient 中已经包含了模仿账户登录的行为操作了,下面记录一下如何使用。
以最简单的登录开始,其中只涉及账号、密码两部分组成的表单信息的填写(人人网就符合这样的要求),先把源码贴上:
name = "xiaoming";
password = "123456";
client.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BEST_MATCH);
HttpPost request = new HttpPost("http://www.renren.com/");
List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
/********************header头设置******************************/
postParameters.add(new BasicNameValuePair("account",name));
postParameters.add(new BasicNameValuePair("password",password));
/**************************************************/
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
request.setEntity(formEntity);
HttpResponse response = client.execute(request);
String webInformation_1 = readWeb(response);
其实和之前介绍相比,仅仅多出来一个表单填写的操作,首先定义两个字符串 name 和 password ,用来保存账号和密码,然后创建一个键值对,将账户与name对应、密码与password对应,然后向request中加入键值对信息,后续操作与之前上一篇中的 post 操作一样。
关键点:
1、必须使用 Post 操作
2、账户密码的设置
上面代码中的 readWeb() 是我自定义的一个函数,上一篇中已经提到过了,在这儿再贴一下代码:
public String readWeb(HttpResponse response)throws ClientProtocolException, IOException{
BufferedReader in = null;
in = new BufferedReader(new InputStreamReader(response.getEntity().getContent(),"utf-8")); //要根据访问网址的编码更改对应的解码方式,这里我用的是UTF-8。
StringBuffer string = new StringBuffer("");
String lineStr = "";
while( (lineStr = in.readLine()) != null)
{
string.append(lineStr + "\n");
}
in.close();
String web = string.toString();
return web;
}
在实际编写代码时,可以将账户与密码通过用户交互手动写入。
需要注意的是:一般涉及账户登录的网址都会有Cookie校验,之前的 httpclient 还需要自己手动添加 Cookie 完成校验工作,从httpclient 4.0开始已经不需要了,这部分工作已经可以转由 httpclient 自己来完成了。(我每次在用 httpclient 进行账户登录时,都先用 HttpGet 先访问一次目标网址来获取Cookie ,也不知道是不是多余的操作、、、)
这篇讲述的登录账户的方法仅仅适用于少数要求较松的网站,很多网站都会自己添加一些隐藏的验证手段(比如验证码之类的),这就需要对登录过程进行数据挖掘了,下次有时间了再写关于涉及验证码的这一类网站登录方法。