工具介绍

本篇文章主要是讲解如何模拟登陆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的朋友的学习成本是相当的低的!那么,继续吧骚年!

步骤分析



可能你对HttpClient的API不熟悉,那么如何在项目中快速使用HttpClient呢?

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

如果不想花时间看API的话直接拿去用就可以了

[java] view plaincopy
  1. /**
  2. * Http工具类
  3. *
  4. * @author Zhu
  5. *
  6. */
  7. public class HttpUtils {
  8. private static CloseableHttpClient httpClient = HttpClients.createDefault();
  9. private static HttpClientContext context = new HttpClientContext();
  10. private HttpUtils() {
  11. }
  12. public static String sendGet(String url) {
  13. CloseableHttpResponse response = null;
  14. String content = null;
  15. try {
  16. HttpGet get = new HttpGet(url);
  17. response = httpClient.execute(get, context);
  18. HttpEntity entity = response.getEntity();
  19. content = EntityUtils.toString(entity);
  20. EntityUtils.consume(entity);
  21. return content;
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. if (response != null) {
  25. try {
  26. response.close();
  27. } catch (IOException e1) {
  28. e1.printStackTrace();
  29. }
  30. }
  31. }
  32. return content;
  33. }
  34. public static String sendPost(String url, List<NameValuePair> nvps) {
  35. CloseableHttpResponse response = null;
  36. String content = null;
  37. try {
  38. // HttpClient中的post请求包装类
  39. HttpPost post = new HttpPost(url);
  40. // nvps是包装请求参数的list
  41. if (nvps != null) {
  42. post.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
  43. }
  44. // 执行请求用execute方法,content用来帮我们附带上额外信息
  45. response = httpClient.execute(post, context);
  46. // 得到相应实体、包括响应头以及相应内容
  47. HttpEntity entity = response.getEntity();
  48. // 得到response的内容
  49. content = EntityUtils.toString(entity);
  50. // 关闭输入流
  51. EntityUtils.consume(entity);
  52. return content;
  53. } catch (Exception e) {
  54. e.printStackTrace();
  55. } finally {
  56. if (response != null) {
  57. try {
  58. response.close();
  59. } catch (IOException e) {
  60. e.printStackTrace();
  61. }
  62. }
  63. }
  64. return content;
  65. }
  66. }

现在get和post对你来说都已经轻而易举了,那么开始模拟登陆吧~

模拟登陆实战

[java] view plaincopy
  1. /**
  2. * 获取必要的登陆参数信息
  3. *
  4. * @throws IOException
  5. */
  6. private void fetchNecessaryParam() throws IOException {
  7. // 查看CSDN登陆页面源码发现登陆时需要post5个参数
  8. // name、password,另外三个在页面的隐藏域中,a good start
  9. logger.info("获取必要的登陆信息。。。。。");
  10. // 这样登陆不行,因为第一次需要访问需要拿到上下文context
  11. // Document doc = Jsoup.connect(LOGIN_URL).get();
  12. String html = HttpUtils.sendGet(LOGIN_URL);
  13. Document doc = Jsoup.parse(html);
  14. Element form = doc.select(".user-pass").get(0);
  15. lt = form.select("input[name=lt]").get(0).val();
  16. execution = form.select("input[name=execution]").get(0).val();
  17. _eventId = form.select("input[name=_eventId]").get(0).val();
  18. logger.info("获取成功。。。。。");
  19. }

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

3、最后分析post返回的结果判断登陆是否成功
[java] view plaincopy
  1. private boolean mockLogin() {
  2. logger.info("开始登陆。。。。。");
  3. boolean result = false;
  4. List<NameValuePair> nvps = new ArrayList<NameValuePair>();
  5. nvps.add(new BasicNameValuePair("username", username));
  6. nvps.add(new BasicNameValuePair("password", password));
  7. nvps.add(new BasicNameValuePair("lt", lt));
  8. nvps.add(new BasicNameValuePair("execution", execution));
  9. nvps.add(new BasicNameValuePair("_eventId", _eventId));
  10. String ret = HttpUtils.sendPost(LOGIN_URL, nvps);
  11. if (ret.indexOf("redirect_back") > -1) {
  12. logger.info("登陆成功。。。。。");
  13. result = true;
  14. } else if (ret.indexOf("登录太频繁") > -1) {
  15. logger.info("登录太频繁,请稍后再试。。。。。");
  16. } else {
  17. logger.info("登陆失败。。。。。");
  18. }
  19. return result;
  20. }

题外话:

模拟登陆CSDN——就是这么简单相关推荐

  1. 模拟登陆CSDN -- Python爬虫练习之正则表达式和cookie

    这周学习的主题是正则表达式和cookie,原本是计划每天晚上11点下班到家,练上一两个钟就把这部分过了,结果这周各种事情和不再状态,所以没整完,直至今天才把相关问题过掉.其实这部分也挺不错的,也并没有 ...

  2. python项目实战:模拟登陆CSDN

    2019独角兽企业重金招聘Python工程师标准>>> 前言 今天为大家介绍一个利用Python模拟登陆CSDN的案例,虽然看起来很鸡肋,有时候确会有大用处,在这里就当做是一个案例练 ...

  3. python 大众点评模拟登陆_python项目实战:模拟登陆163邮箱,简单到爆

    前言 相信大家都会做一些有趣的Python项目,对于小白的我们来说,如果成功了的话,那成就感是非常爆棚的的,这也是非常有助学习. 接下来,为大家介绍一个selenium 模拟登陆163邮箱的代码 首先 ...

  4. 利用requests 模拟登陆csdn

    环境:python3.6.1 + lxml4.0.0 + requests2.18.4 坑一:登陆时请求的网址需要构造,数据在form标签属性里, 坑二:表单数据的提取 坑三:登陆后的跳转,不然无法访 ...

  5. Python 模拟登陆神库!集合了20+个平台的模拟登陆脚本

    Awesome-python-login-model 是一个国人开发的模拟登陆仓库,在这个仓库上有20几个网站的模拟登陆脚本,你可以基于这个仓库实现的代码做简易的修改,以实现自己的自动化功能. 仓库地 ...

  6. 【转】使用C#发送Http 请求实现模拟登陆(以博客园为例)

    [转]使用C#发送Http 请求实现模拟登陆(以博客园为例) 模拟登陆的原理很简单,就是发送一个Http 请求服务器获得响应,然后客户端获取到cookie即可实现模拟登陆,比如一些抢票软件的原理无非也 ...

  7. python如何实现模拟登录_超详细的Python实现新浪微博模拟登陆(小白都能懂)

    最近由于需要一直在研究微博的爬虫,第一步便是模拟登陆,从开始摸索到走通模拟登陆这条路其实还是挺艰难的,需要一定的经验,为了让朋友们以后少走点弯路,这里我把我的分析过程和代码都附上来. 首先,我们先用正 ...

  8. 使用C#发送Http 请求实现模拟登陆(以博客园为例)

    使用C#发送Http 请求实现模拟登陆(以博客园为例) 原文:使用C#发送Http 请求实现模拟登陆(以博客园为例) 模拟登陆的原理很简单,就是发送一个Http 请求服务器获得响应,然后客户端获取到c ...

  9. DecryptLogin:python模拟登陆模块

    DecryptLogin一个利用requests来模拟登录各大网站的开源包.(项目地址)它支持多个平台的模拟登陆. 一.简单登陆 infos_return:返回一个字典对象,包含用户信息 sessio ...

最新文章

  1. iOS progressive Web App (PWA) 技术
  2. mean,std,var
  3. 索引超出矩阵维度_搜索引擎技术之倒排索引原理详解,及案例分析
  4. 巧用lock解决缓存击穿的解决方案
  5. SQL 强制指定索引加快查询速度
  6. opensplice dds v6.3.2_给你看个宝贝,近乎完美的DDS正弦波信号音生成器
  7. vuex中actions配合mutation处理axios请求
  8. 风变python学习2---字符串,整数,浮点型数据分析,应用
  9. Python——语言基础
  10. php易宝支付扫码支付代码_刷脸支付将颠覆扫码支付——汇刷刷脸支付
  11. meltdown linux 补丁,宋宝华: ARM64 Linux meltdown修复补丁KPTI的最重要3个patch
  12. UnityEditor三自定义窗口 案例2
  13. 分享五个绝对称得上妖艳古怪精灵的前端代码效果
  14. 【mysql】---php链接数据库---【巷子】
  15. 《塞尔达传说》与氛围游戏的兴起:在游戏中感受禅意
  16. 上海滩第一代炒股大户沉浮录
  17. 修改Android app图标(Android Studio)
  18. python datetime 时区_Python datetime 如何处理时区信息
  19. python实现数据可视化软件_基于Python实现交互式数据可视化的工具
  20. 说说视频号最近有趣的事

热门文章

  1. mysql从库有张表不同步_mysql主从数据库不同步的2种解决方法
  2. Chrome中的GPU加速合成
  3. VVC中对CU进行分类,同时进行分区模式选择
  4. 差分隐私:原理,应用与展望
  5. 拆解 米家扫地机器人_小米米家机器人值得买吗?小米米家扫地机器人拆解图解...
  6. thisis incompatible with sql_mode=only_full_group
  7. 「学习笔记」多项式的蛇皮操作
  8. 操作系统之虚拟存储管理 java python 实现 最优(Optimal)置换算法 先进先出(FIFO)页面置换算法 LRU(Least Recently Used)置换算法
  9. JSON文件读写操作详解
  10. django orm性能优化