HTTPClient模拟登陆人人网

来源:互联网 发布:淘宝杯子宝贝卖点范文 编辑:程序博客网 时间:2024/04/29 05:31
目的:
使用HTTPClient4.0.1登录到人人网,并从特定的网页抓取数据。


总结&注意事项:

  • HttpClient(DefaultHttpClient)代表了一个会话,在同一个会话中,HttpClient对cookie自动进行管理(当然,也可以在程序中进行控制)。
  • 在同一个会话中,当使用post或是get发起一个新的请求时,一般需要对调用前一个会话的abort()方法,否则会抛出异常。
  • 有些网站登录成功后会重定向(302, 303),比如这里的人人网。如果发出的是post请求,需要从响应头中取出location,并再次向网站发送请求,以获取最终数据。
  • 抓取程序不要运行地过于频繁,大部分站点都有抵制刷网站机制。人人网访问过于频繁会锁账号。
  • 使用录制工具录制出登录时向网站发出的请求参数。在这里,我使用了badboy,导出成jmeter文件,在jmeter中就可以看到登录时向网站发送的参数列表和相应的值。

 


代码:
public class RenRen {    // The configuration items    private static String userName = "YourMailinRenren";    private static String password = "YourPassword";    private static String redirectURL = "http://blog.renren.com/blog/304317577/449470467";    // Don't change the following URL    private static String renRenLoginURL = "http://www.renren.com/PLogin.do";    // The HttpClient is used in one session    private HttpResponse response;    private DefaultHttpClient httpclient = new DefaultHttpClient();    private boolean login() {        HttpPost httpost = new HttpPost(renRenLoginURL);        // All the parameters post to the web site        List<NameValuePair> nvps = new ArrayList<NameValuePair>();        nvps.add(new BasicNameValuePair("origURL", redirectURL));        nvps.add(new BasicNameValuePair("domain", "renren.com"));        nvps.add(new BasicNameValuePair("isplogin", "true"));        nvps.add(new BasicNameValuePair("formName", ""));        nvps.add(new BasicNameValuePair("method", ""));        nvps.add(new BasicNameValuePair("submit", "登录"));        nvps.add(new BasicNameValuePair("email", userName));        nvps.add(new BasicNameValuePair("password", password));        try {            httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));            response = httpclient.execute(httpost);        } catch (Exception e) {            e.printStackTrace();            return false;        } finally {            httpost.abort();        }        return true;    }    private String getRedirectLocation() {        Header locationHeader = response.getFirstHeader("Location");        if (locationHeader == null) {            return null;        }        return locationHeader.getValue();    }    private String getText(String redirectLocation) {        HttpGet httpget = new HttpGet(redirectLocation);        // Create a response handler        ResponseHandler<String> responseHandler = new BasicResponseHandler();        String responseBody = "";        try {            responseBody = httpclient.execute(httpget, responseHandler);        } catch (Exception e) {            e.printStackTrace();            responseBody = null;        } finally {            httpget.abort();            httpclient.getConnectionManager().shutdown();        }        return responseBody;    }    public void printText() {        if (login()) {            String redirectLocation = getRedirectLocation();            if (redirectLocation != null) {                System.out.println(getText(redirectLocation));            }        }    }    public static void main(String[] args) {        RenRen renRen = new RenRen();        renRen.printText();    }}

转自:http://robblog.iteye.com/blog/638206
原创粉丝点击