工具介绍

本篇文章主要是解说怎样模拟登陆CSDN。使用的工具是HttpClient+Jsoup

当中HttpClient主要是负责发送请求,而Jsoup主要是解析HTML

你可能对HttpClient的API不太了解,只是没关系。往下看就好了~

Jsoup的语法类似jQuery的选择器。相信有一定web基础的人都能够非常快的掌握

当中select(String selector)就是最强大的选择器。另外还提供一系列的细化的方法,比方:

getElementById(String id), getElementsByClass(String class), getElementsByTag(String tagName)

是不是非常亲切?对~这个就跟javascript的方法类似了~

所以Jsoup对于开发WEB的朋友的学习成本是相当的低的!那么,继续吧骚年!

步骤分析



第一步、首先须要拿到模拟登陆的请求地址,在CSDN登陆页就能够找到:https://passport.csdn.net/account/login,不错,第一步已经成功

第二步、抓包得到post请求须要发送的參数,能够用FF或chrome来抓。例如以下图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjM0NTI4Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">


第三步、当中username和password是由我们填的,那么后面三个參数呢?不急,看看登陆页面的源码

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjM0NTI4Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

原来在这儿呢!到这里一切都异常的顺利~

整理一下思路,不要被顺利冲昏了头脑~
1、首先我们须要发送一个get请求来得到登陆页面。并从登陆页面上得到三个请求參数
2、用从1中得到的请求參数和账号password模拟发送post请求到登陆请求地址
3、最后分析post返回的结果推断登陆是否成功

有了思路之后,我们还须要借助编程来实现它,这里须要一个工具——HttpClient

怎样简单高速使用HttpClient



可能你对HttpClient的API不熟悉。那么怎样在项目中高速使用HttpClient呢?

这里已经封装了两个最经常使用的get和post请求方法,所以之前就让你别操心啦~^_^

假设不想花时间看API的话直接拿去用就能够了

/**
* Http工具类
*
* @author Zhu
*
*/
public class HttpUtils { private static CloseableHttpClient httpClient = HttpClients.createDefault();
private static HttpClientContext context = new HttpClientContext(); private HttpUtils() { } public static String sendGet(String url) {
CloseableHttpResponse response = null;
String content = null;
try {
HttpGet get = new HttpGet(url);
response = httpClient.execute(get, context);
HttpEntity entity = response.getEntity();
content = EntityUtils.toString(entity);
EntityUtils.consume(entity);
return content;
} catch (Exception e) {
e.printStackTrace();
if (response != null) {
try {
response.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
return content;
} public static String sendPost(String url, List<NameValuePair> nvps) {
CloseableHttpResponse response = null;
String content = null;
try {
// HttpClient中的post请求包装类
HttpPost post = new HttpPost(url);
// nvps是包装请求參数的list
if (nvps != null) {
post.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
}
// 运行请求用execute方法,content用来帮我们附带上额外信息
response = httpClient.execute(post, context);
// 得到对应实体、包含响应头以及对应内容
HttpEntity entity = response.getEntity();
// 得到response的内容
content = EntityUtils.toString(entity);
// 关闭输入流
EntityUtils.consume(entity);
return content;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (response != null) {
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content;
}
}

如今get和post对你来说都已经轻而易举了。那么開始模拟登陆吧~

模拟登陆实战


依照我们先前的思路来前进吧!

1、首先我们须要发送一个get请求来得到登陆页面,并从登陆页面上得到三个请求參数
	/**
* 获取必要的登陆參数信息
*
* @throws IOException
*/
private void fetchNecessaryParam() throws IOException {
// 查看CSDN登陆页面源代码发现登陆时须要post5个參数
// name、password,另外三个在页面的隐藏域中,a good start
logger.info("获取必要的登陆信息。。。。。");
// 这样登陆不行,由于第一次须要訪问须要拿到上下文context
// Document doc = Jsoup.connect(LOGIN_URL).get();
String html = HttpUtils.sendGet(LOGIN_URL);
Document doc = Jsoup.parse(html);
Element form = doc.select(".user-pass").get(0);
lt = form.select("input[name=lt]").get(0).val();
execution = form.select("input[name=execution]").get(0).val();
_eventId = form.select("input[name=_eventId]").get(0).val();
logger.info("获取成功。。。 。 。");
}

2、用从1中得到的请求參数和账号password模拟发送post请求到登陆请求地址

3、最后分析post返回的结果推断登陆是否成功
	private boolean mockLogin() {
logger.info("開始登陆。。 。 。。");
boolean result = false;
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("username", username));
nvps.add(new BasicNameValuePair("password", password));
nvps.add(new BasicNameValuePair("lt", lt));
nvps.add(new BasicNameValuePair("execution", execution));
nvps.add(new BasicNameValuePair("_eventId", _eventId));
String ret = HttpUtils.sendPost(LOGIN_URL, nvps);
if (ret.indexOf("redirect_back") > -1) {
logger.info("登陆成功。。。。 。");
result = true;
} else if (ret.indexOf("登录太频繁") > -1) {
logger.info("登录太频繁。请稍后再试。 。 。 。 。 ");
} else {
logger.info("登陆失败。。。。。");
}
return result;
}

题外话:


模拟登陆之后你就能够随心所欲的操作了~能够写个直接发blog的小程序或者是刷訪问量之类的~
只是訪问的太频繁可能会被封IP之类的~~~~

模拟登陆CSDN仅仅是抛砖引玉。你也能够用此法模拟登陆各种平台,百度啊、新浪微博啊等等
CSDN这里仅仅是一个基础的模拟的登陆,别的可能还会涉及到SSL等各种技术、有兴趣的朋友能够试试

若有问题,欢迎大家指正~

模拟登陆CSDN——就是这么简单的更多相关文章

  1. win10 uwp httpClient 登陆CSDN

    本文告诉大家如何模拟登陆csdn,这个方法可以用于模拟登陆其他网站. HttpClient 使用 Cookie 我们可以使用下面代码让 HttpClient 使用 Cookie ,有了这个才可以保存登 ...

  2. pytho简单爬虫_模拟登陆西电流量查询_实现一键查询自己的校园网流量

    闲来无事,由于校园内网络是限流量的,查询流量很是频繁,于是萌生了写一个本地脚本进行一键查询自己的剩余流量. 整个部分可以分为三个过程进行: 对登陆时http协议进行分析 利用python进行相关的模拟 ...

  3. python模拟登陆豆瓣——简单方法

    学爬虫有一段时间了,前面没有总结又重装了系统,导致之前的代码和思考都没了..所以还是要及时整理总结备份.下面记录我模拟登陆豆瓣的方法,方法一登上了豆瓣,方法二重定向到了豆瓣中“我的喜欢”列表,获取了第 ...

  4. Java模拟登陆02【转载】

    在使用java访问URL时,如果该URL需要身份验证,那么就不能够直接访问,因为没有登陆.那么,如何解决这个问题呢?     方法是使用java模拟登陆,登陆后记录下cookie信息,在下次发起请求时 ...

  5. 使用OKHttp模拟登陆知乎,兼谈OKHttp中Cookie的使用!

    本文主要是想和大家探讨技术,让大家学会Cookie的使用,切勿做违法之事! 很多Android初学者在刚开始学习的时候,或多或少都想自己搞个应用出来,把自己学的十八般武艺全都用在这个APP上,其实这个 ...

  6. 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

  7. 模拟登陆,selenium,线程池

    一 . 模拟登陆案例(识别验证码)  1 . 打码平台 - 云打码 : www.yundama.com  使用步骤 : - 注册两个账户,普通用户和开发者用户 : - 登陆 普通用户查看余额 登陆开发 ...

  8. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

  9. Python模拟登陆新浪微博

    上篇介绍了新浪微博的登陆过程,这节使用Python编写一个模拟登陆的程序.讲解与程序如下: 1.主函数(WeiboMain.py): import urllib2 import cookielib i ...

随机推荐

  1. 读书笔记--C陷阱与缺陷(三)

    第三章 1. 指针与数组 书中强调C中数组注意的两点: 1)     C语言只有一维数组,但是数组元素可以是任何类型对象,是另外一个数组时就产生了二维数组.数组大小是常数(但GCC实现了变长数组..) ...

  2. require和import的区别

    require:是一种common协议,大家按照这个约定书写自己的代码,实现模块化. import:是ES6的模块语法实现.是语言自身的模块实现.

  3. 【oracle】入门学习(二)

    oracle登录身份有三种:normal 普通身份sysdba 系统管理员身份sysoper 系统操作员身份每种身份对应不同的权限 sysdba权限:●启动和关闭操作●更改数据库状态为打开/装载/备份 ...

  4. Laravel 程序架构设计思路:使用动作类

    当我们谈论到应用程序的架构的时候,经常会问到一个经典的问题,那就是"这段代码应该放在哪里比较好". 因为 Laravel 是一个相当灵活的框架,所以要回答这个问题其实没那么容易.我 ...

  5. python图片处理和matlab图片处理的区别

    作者:波布兰链接:https://www.zhihu.com/question/28218420/answer/39904627来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  6. [经典算法题]寻找数组中第K大的数的方法总结

    [经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26   字体:[大 中 小] 打印复制链接我要评论   今天看算法分析是,看到一个这样的问题,就是在一堆数据 ...

  7. 20155309 2016-2017-2《Java程序设计》课程总结

    预备作业1http://www.cnblogs.com/nhx19970709/p/6155580.html 第一次写博客,也是第一次用Markdown,具体流程都还不是很熟悉 预备作业2http:/ ...

  8. html meta标签使用总结(转)

    之前学习前端中,对meta标签的了解仅仅只是这一句. <meta charset="UTF-8"> 但是打开任意的网站,其head标签内都有一列的meta标签.比如我博 ...

  9. Delphi与Socket

    一.Delphi与Socket计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的TCPIP和UDP协议.TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登陆B ...

  10. android拾遗——Android之Service与IntentService的比较

    不知道大家有没有和我一样,以前做项目或者练习的时候一直都是用Service来处理后台耗时操作,却很少注意到还有个IntentService,前段时间准备面试的时候看到了一篇关于IntentServic ...