本文转载自:点击打开链接

本篇文章是利用Jsoup模拟登陆GitHub。这里仅限交流学习用,如利用代码进行恶意攻击他网站,和作者无关 ^ ^!

开始前准备:

Stept 1): 安装一个火狐/google的Chrome浏览器,作用是利用Firebug插件进行分析提交协议,虽然IE从7开始也有了类似的功能,但毫无疑问仍然没有火狐和Chrome好用。

Firefox和firebug百度网盘资源:点击打开链接,密码:点击打开链接

Stept 2): 构建一个Jsoup项目,普通的java项目即可,并且导入Jsoup的Jar包。如果还不了解Jsoup是什么的,请参照文章:「Jsoup到底是什么」如果是Maven项目就可以直接在pom.xml中引入Jsoup即可,也可以参照另一篇文章:「模拟浏览器:get方式简单获取网页数据(一)」

Stept 3): 分析提交表单,以便我们确定两件重要的事情「重要」:

  • 所有请求的表单参数
  • 哪些表单数据需要被提交

下面的是github登陆的界面及form:

这里注意图中的几个重要信息:其中form标签中的action属性代表表单数据最终会提交到哪里(可以在下面代码中第二次提交的代码块中看到该地址)action="/session",另外需要关注表单中所有被提交的input标签,这里更重要的是hidden属性的input,这种隐藏的input就是一种防爬虫机制,它类似一种web的流水号,你在提交表达的时候带有这个流水号,才能证明用户真正的进入了webflow流程,如果带有一个错误的,或者不带有这个流水号,那么网站会认为用户非法进入了webflow流程(被认为是机器人/爬虫),类似我们去医院看病前需挂号一样。

Stept 4): 利用Firebug抓取post提交的数据包,来确认最终模拟提交的参数「重要」:

下面的是Firebug的抓取界面(先在火狐浏览器安装Firebug插件后,按F12呼出,点击网络Net,在登陆界面填写用户名密码,点击登陆按钮,在Firebug中找到第一个提交方式Method为POST的请求):

同样在Firebug抓取界面也要注意几个重要信息:1).注意URL,可以确定该URL和表单的action值对应,即为最终表达提交地址。2).注意Post值,可以确定该列表值与表单中input值对应相等。3).其他信息:点击图中Headers可以看到相关其他信息,比如header值,cookies相关,reference等,有的时候模拟登陆的时候这些值都需要一并提交过去

代码实现:一旦post提交参数及最终提交的URL地址确定后,就可以利用Jsoup进行模拟登陆,代码如下:

/** * GITHUBLoginApater.java * * Function:Jsoup model apater class. * *   ver     date           author * ────────────────────────────────── *   1.0     2017/06/22     bluetata * * Copyright (c) 2017, [https://github.com/] All Rights Reserved. */
package com.datacrawler.service.model.github.com;  import java.util.HashMap;
import java.util.List;
import java.util.Map;  import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.Connection.Method;
import org.jsoup.Connection.Response;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;  /** * @since      crawler(datasnatch) version(1.0)</br> * @author     bluetata / dietime1943@gmail.com</br> * @reference  http://blog.csdn.net/dietime1943/</br> * @version    1.0</br> */
public class GITHUBLoginApater {  public static String LOGIN_URL = "https://github.com/login";  public static String USER_AGENT = "User-Agent";  public static String USER_AGENT_VALUE = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0";  public static void main(String[] args) throws Exception {  simulateLogin("bluetata", "password01234"); // 模拟登陆github的用户名和密码  }  /** * @param userName 用户名 * @param pwd 密码 * @throws Exception */  public static void simulateLogin(String userName, String pwd) throws Exception {  /*  * 第一次请求  * grab login form page first * 获取登陆提交的表单信息,及修改其提交data数据(login,password) */  // get the response, which we will post to the action URL(rs.cookies())  Connection con = Jsoup.connect(LOGIN_URL);  // 获取connection  con.header(USER_AGENT, USER_AGENT_VALUE);   // 配置模拟浏览器  Response rs = con.execute();                // 获取响应  Document d1 = Jsoup.parse(rs.body());       // 转换为Dom树  List<Element> eleList = d1.select("form");  // 获取提交form表单,可以通过查看页面源码代码得知  // 获取cooking和表单属性  // lets make data map containing all the parameters and its values found in the form  Map<String, String> datas = new HashMap<>();  for (Element e : eleList.get(0).getAllElements()) {  // 设置用户名  if (e.attr("name").equals("login")) {  e.attr("value", userName);  }  // 设置用户密码  if (e.attr("name").equals("password")) {  e.attr("value", pwd);  }  // 排除空值表单属性  if (e.attr("name").length() > 0) {  datas.put(e.attr("name"), e.attr("value"));  }  }  /* * 第二次请求,以post方式提交表单数据以及cookie信息 */  Connection con2 = Jsoup.connect("https://github.com/session");  con2.header(USER_AGENT, USER_AGENT_VALUE);  // 设置cookie和post上面的map数据  Response login = con2.ignoreContentType(true).followRedirects(true).method(Method.POST)  .data(datas).cookies(rs.cookies()).execute();  // 打印,登陆成功后的信息  // parse the document from response  System.out.println(login.body());  // 登陆成功后的cookie信息,可以保存到本地,以后登陆时,只需一次登陆即可  Map<String, String> map = login.cookies();  for (String s : map.keySet()) {  System.out.println(s + " : " + map.get(s));  }  }
}  

最后运行返回的html即为,github成功登陆后的个人仓库相关更新信息,以此可以判断是否登陆成功,如果不成功则还停留在登陆界面。

成功后打印的cookies信息:

user_session : xkXvNQyNzKFTrBMtbXdieZ29FtimemTz1943fAmo7w4xOSK
__Host-user_session_same_site : xkXvNQyNzKFTrBluetataXWvhdLmkYmTzblueqfAmo7w4xOSK
_gh_sess : eyJsYXN0X3dyaXRlIjoxNDk4MTEyODQ5NDQ1LCJmbGdie=I6eyJtimeNjYXJkIj1943Wx5dGljc19kpb24iLCJhbmFseXRpY3NfbG9jYXRpb24iXSwiZmxhc2hlcyI6eyJhbmFseXRpY3NfZGltZW5zaW9uIjp7Im5hbWUidietime1943lbnNpb241IiwidmFsdWUiOiJMb2dnZWQgSW4ifSwiYW5hbHl0aWNzX2xvY2F0aW9uIjoiL2Rhc2hib2FyZCJ9fSwic2Vzc2lvbl9pZCI6IjFkNGQ1MWE3NmM4MzU5MTUzbluetataxZGzgzIiwiY29udGV4dCI6Ii8ifQ%3D%3D--af5c70cdfbluec01be903dtata083ce2e53eb
logged_in : yes
dotcom_user : bluetata 

爬虫(java+jsoup)相关推荐

  1. java jsoup 网络爬虫 jsoup解析html Java爬虫 Jsoup爬虫 jsoup例子

    java jsoup 网络爬虫 java jsoup 网络爬虫 学习例子(一)抓取豆瓣电影名称+推荐星级 java jsoup 网络爬虫 学习例子(二)只抓取豆瓣电影5星(力荐)电影名称 java j ...

  2. Java爬虫之JSoup使用教程

    title: Java爬虫之JSoup使用教程 date: 2018-12-24 8:00:00 +0800 update: 2018-12-24 8:00:00 +0800 author: me c ...

  3. java jsoup 多线程爬虫Miner

    java jsoup 多线程爬虫Miner 需要配置项: 1.URL包含关键字. 2.存储方式:DB-数据库存储;FILE-文件存储. 3.爬取页面最大深度. 4.下载页面线程数. 5.分析页面线程数 ...

  4. java毕业设计——基于java+Jsoup+HttpClient的网络爬虫技术的网络新闻分析系统设计与实现(毕业论文+程序源码)——网络新闻分析系统

    基于java+Jsoup+HttpClient的网络爬虫技术的网络新闻分析系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Jsoup+HttpClient的网络爬虫技术的网络 ...

  5. java jsoup 网络爬虫 学习例子(八)京东和淘宝商品比价 PhantomJS

    java jsoup 网络爬虫 学习例子(八)京东和淘宝商品比价 PhantomJS /** filename getHtml.js* phantomjs.exe 2.0.0* author InJa ...

  6. Java+Jsoup爬虫小红书

    源码链接:https://pan.baidu.com/s/1oOAxJqSMCyVJPNv-iAYW7A 提取码:1co9 Java+Jsoup爬虫小红书,微博,B站 爬取地址:https://www ...

  7. Java+Jsoup爬虫微博

    源码链接:https://pan.baidu.com/s/1oOAxJqSMCyVJPNv-iAYW7A 提取码:1co9 Java+Jsoup爬虫小红书,微博,B站 爬取地址:https://wei ...

  8. java jsoup 网络爬虫 学习例子(六)京东和当当商品比价

    java jsoup 网络爬虫 学习例子(六)京东和当当商品比价 package com.iteye.injavawetrust.jdvsdd;import java.util.List;/*** * ...

  9. java jsoup 网络爬虫 学习例子(七)京东和淘宝商品比价 htmlunit

    java jsoup 网络爬虫 学习例子(七)京东和淘宝商品比价 htmlunit package com.iteye.injavawetrust.pricecheck;import java.uti ...

  10. [完整爬虫]java爬虫基础对36Kr快讯数据进行爬取以及数据筛选过滤

    由于九月事件把爬虫推到风口浪尖 而我写这些只是分享技术 不涉及隐私等个人资料的获取 并且是在不会对对方服务器造成压力的情况下进行的爬取 特此声明 36Kr 也叫36氪,是一个我非常喜欢的网站,网罗天下 ...

最新文章

  1. 面向对象的多态性(2)
  2. hdu 1087 Super Jumping! Jumping! Jumping! 动态规划
  3. oracle 查看用户状态,Oracle数据库查看用户状态
  4. MySQL存储过程中的循环怎么写
  5. 基于SSM的高校后勤管理系统Java项目
  6. 3.windows图形界面
  7. 阿里巴巴数据中台实践(PPT)
  8. 完美解决office07或2010安装错误1706
  9. Linux基础篇——Linux用户管理、组管理、权限管理
  10. QT小项目练手——用QTimer做一个倒计时程序
  11. PaddleOCR实现高精度车牌识别
  12. qq空间进入游戏显示服务器拒绝,显示ptlogin2.qq.com,QQ空间打不开的快速解决办法...
  13. 计算机配置里面没有网络选项,解决win10网络设置中没有以太网的方法
  14. Twitter 没有在美国总统竞选期间宕机
  15. 北京区块链技术应用协会第一届第四次会员大会顺利召开
  16. 麻省理工学院计算机科学,麻省理工学院素以世界顶尖的工程学和计算机科学而享誉世界[1-2] ,位列2015-16年世...
  17. Windows终端美化
  18. 教你一招:Win10切换输入法与Win7一样(Ctrl + 空格)
  19. Java唐诗学习系统
  20. 山东教师教育网研修平台-首页

热门文章

  1. 噪声和信噪比的转换(如何在数据集中添加噪声)
  2. 如何判断是否适合学编程?
  3. MarkDown编辑器中缩进
  4. jquery 将下拉框重置_select下拉框之默认选项清空
  5. 北京理工大学 计算机考研真题,北京理工大学考研真题汇总
  6. 【Py】基于Python的身份证读卡器二开全记录
  7. STM32使用SPI方式读写SD 卡
  8. win7计算机启动修复,win7启动修复功能无法正常进入系统的解决方法
  9. 小知识点:ARM 架构 Linux 大数据集群基础环境搭建(Hadoop、MySQL、Hive、Spark、Flink、ZK、Kafka、Nginx、Node)
  10. 傅里叶变换与快速傅里叶变换