GVKun编程网logo

java 版 chsi.com.cn 模拟登陆(java模拟登录系统)

1

本文将带您了解关于java版chsi.com.cn模拟登陆的新内容,同时我们还将为您解释java模拟登录系统的相关知识,另外,我们还将为您提供关于Flask-testing(一)——模拟登陆、gith

本文将带您了解关于java 版 chsi.com.cn 模拟登陆的新内容,同时我们还将为您解释java模拟登录系统的相关知识,另外,我们还将为您提供关于Flask-testing(一)—— 模拟登陆、github 模拟登陆、htmlunit 模拟登陆 https、HttpClient + Jsoup 模拟登陆,解析 HTML, 信息筛选(广工图书馆)的实用信息。

本文目录一览:

java 版 chsi.com.cn 模拟登陆(java模拟登录系统)

java 版 chsi.com.cn 模拟登陆(java模拟登录系统)

直接上代码登陆 chsi.com.cn 测试:


		// TODO Auto-generated method stub
		String url = "https://account.chsi.com.cn/passport/login?service=https://my.chsi.com.cn/archive/j_spring_cas_security_check";
		String userAgent = "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36";
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(5000*10)   //设置连接超时时间
                .setConnectionRequestTimeout(5000*10) // 设置请求超时时间
                .setSocketTimeout(5000*10)
                .setRedirectsEnabled(true)//默认允许自动重定向
                .build();
        CloseableHttpClient httpCilent = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(url);
        httpGet.setHeader("User-Agent",userAgent);
        httpGet.setConfig(requestConfig);
        HttpResponse httpResponse = httpCilent.execute(httpGet);
        HttpEntity entity = httpResponse.getEntity();
        String contentString = EntityUtils.toString(entity,"utf-8");
        Document document = Jsoup.parse(contentString);
        Elements eles = document.select("input[type=hidden]");
        List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>();
        for (Element element : eles) {
			String nameString = element.attr("name");
			String valueString = element.attr("value");
			list.add(new BasicNameValuePair(nameString, valueString));
		}
        
        list.add(new BasicNameValuePair("username", "你的用户名"));
        list.add(new BasicNameValuePair("password", "你的密码"));
        
        HttpPost post = new HttpPost(url);
        post.setHeader("User-Agent",userAgent);
        post.setHeader("Referer","https://account.chsi.com.cn/passport/login?service=https://my.chsi.com.cn/archive/j_spring_cas_security_check");
        HttpEntity ent = new UrlEncodedFormEntity(list, "UTF-8");
        post.setEntity(ent);
        httpResponse = httpCilent.execute(post);
        
        
       // httpGet = new HttpGet("https://my.chsi.com.cn/archive/gdjy/xj/show.action");
        httpGet = new HttpGet("https://account.chsi.com.cn/account/account!show");
        httpGet.setHeader("User-Agent",userAgent);
        httpGet.setConfig(requestConfig);
        httpResponse = httpCilent.execute(httpGet);
        entity = httpResponse.getEntity();
        contentString = EntityUtils.toString(entity,"utf-8");
        System.out.println("======================-----下面就是登陆后的东西 请拷贝查看-----=================");
        System.out.println(contentString);
	

 

Flask-testing(一)—— 模拟登陆

Flask-testing(一)—— 模拟登陆

web单元测试

web单元测试可以分为三类:

  1. 测试对象较独立,无需依赖于cookie之类的上下文

  2. 依赖于上下文

  3. web前端的测试。

测试方式推荐:

  1. 第一种类型只需要使用unittest的常规测试即可

  2. 第三种类型可使用selenium,但是编写selenium工作量比较大,且不够直观,且不够只管,建议使用其他方式或者人工测试

  3. 第二种类型,例如对于login_required类型的endpoint,可使用app.test_client()返回测试客户端,同时附带上合适的数据。推荐使用flask-testing插件。同时,由于这类依赖比较常见,所以推荐将其独立成类。

代码组织推荐:

  1. 尽量只再endpoint中编写参数解析与response封装工作,其他代码再独立成为一个逻辑函数

  2. 测试时,依赖于某些数据,除非测试数据的增删改,否则建议编写数据导入函数(后续写),可以减少工作量

flask-testing简介

Flask-testing是对unittest的一个封装,
使用之前需要先用create_app()返回一个app即可使用,可以使用client属性模拟客户端访问,
例如:client.get(''/'', headers={''Cookie'':cookie})
例如:client.post(''/'', data=parama, follow_redirects=True)
其他使用方式与unittest相似。

登陆

有一些测试实例需要登陆后才能执行,为了方便登陆管理,建议把登陆相关独立成为一个Plugin类。调用该类即可。

  1. 传入unittest实例,通过unittest实例的get,post方法登陆

  2. 先用get方法获得登陆页,在html中提取csrf_token

  3. 再用post方法,将phone,passwod,csrf_token发送,follow_redirects=True跳转

  4. 在判断是否还停留再登陆页

  5. 将cookie提取出来,用于以后登陆携带访问

class LoginPlugin(object):
    def __init__(self, flask_unittest):
        self.unittest = flask_unittest
        self.cookie = None

    def create_app(self):
        www = create_www_app(''testing'')
        db.init_app(www)
        return www

    def login(self, phone=''13800000008'', password=''123456''):
        # 获取csrf_token
        login_html = self.unittest.client.get(url_for(''auth.login'')).data
        login_bs = BeautifulSoup(login_html, ''html5lib'')
        csrf_token = login_bs.find(id=''csrf_token'')[''value'']
        if not re.search(''登陆'', login_html):
            # 登陆页打不开
            return False

        # 访问数据库
        params = {''phone'': phone, ''password'': password, ''csrf_token'': csrf_token}
        result = self.unittest.client.post(url_for(''auth.login''), data=params, follow_redirects=True)
        self.cookie = result.headers[''Set-Cookie'']
        result_data = result.data

        # True为登陆成功,False未登陆失败
        return not re.search(''登陆'', result_data)

    def get_cookie(self):
        return self.cookie

    def logout(self):
        return self.unittest.client.post(''/logout'')

使用例子


    class CartTest(TestCase):
        is_login = None
    
        def create_app(self):
            self.login_plugin = LoginPlugin(self)
            return self.login_plugin.create_app()
    
        def setUp(self):
            self.login_plugin.login()
            self.cookie = self.login_plugin.get_cookie()
    
        def test_show_cart_json(self):
            json_info = self.client.get(url_for(''order.show_cart_json''), \
                headers={''Cookie'': self.cookie}).data  # order.show_cart_json''依赖于current_user.get_id()所以得先登陆
            result = json.loads(json_info)
            self.assertEqual(len(result[''data'']), 2)

github 模拟登陆

github 模拟登陆

import requests
from bs4 import BeautifulSoup

USERNAME = ''*****''
PWD = ''*******''

LoginUrl_GET = ''https://github.com/login''
LoginUrl = ''https://github.com/session''

headers = {
    ''Host'': ''github.com'',
    ''User-Agent'': ''Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:47.0) Gecko/20100101 Firefox/47.0'',
    ''Accept'': ''text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'',
    ''Accept-Language'': ''en-US,en;q=0.5'',
    ''Accept-Encoding'': ''gzip, deflate, br'',
    ''Referer'': ''https://github.com'',
    ''Connection'': ''keep-alive'',
}
formData = {
    ''commit'': ''Sign+in'',
    ''utf8'': "✓",
    "login": USERNAME,
    "password": PWD,

}
s = requests.Session()
RESULT = s.get(LoginUrl_GET, headers=headers)


content = RESULT.content

with open(''login.html'', ''wb'') as fp:
    fp.write(content)
html = open(''login.html'', ''r'')
soup = BeautifulSoup(html, "html.parser")
token = soup.find(''input'', {''name'': ''authenticity_token''})[''value'']



formData[''authenticity_token''] = token





# RESULT = s.post(LoginUrl, headers=headers, data=formData,)
RESULT = s.post(LoginUrl, data=formData,)


content=RESULT.content
print RESULT.url

print RESULT.status_code
print RESULT.cookies

with open(''bitbucket.html'', ''w'') as fp:
    fp.write(content)

https://github.com/FizLBQ/SpiderPython

htmlunit 模拟登陆 https

htmlunit 模拟登陆 https

htmlunit 模拟登陆 https 博客分类: java
public static void htmlUnitUrl(String url, String ip, String port)
			throws Exception {
		WebClient client=null;
		try {
			 client = new WebClient(BrowserVersion.FIREFOX_24,ip,Integer.valueOf(port));  
	         client.getOptions().setUseInsecureSSL(true);
	         client.getOptions().setCssEnabled(false);
	         client.getOptions().setJavaScriptEnabled(false);
	        //获取某网站页面  
	        HtmlPage page = client.getPage(url); 
		} catch (Exception e) {
			logger.error("激活连接出错", e);
		} finally {
			if(client!=null){
				client.closeAllWindows();
			}
		}
	}

 

HttpClient + Jsoup 模拟登陆,解析 HTML, 信息筛选(广工图书馆)

HttpClient + Jsoup 模拟登陆,解析 HTML, 信息筛选(广工图书馆)

 HttpClient + Jsoup 模拟登陆,解析 HTML 获取信息

 

微博:http://weibo.com/375061590

QQ :375061590

最近在做一个校园综合 Android 客户端,主要是想把学校各类网站信息进行整合,放在一个平台上,供学校学生阅览。

 

思路如下:

拿广东工业大学图书馆网站作为一个例子

实现目标:用个人账号登陆图书馆并获取到个人借阅情况。

登陆地址 http://222.200.98.171:81/login.aspx

这里会用到 Chrome 的开发者工具(浏览器按 F12 可以开启)



 
 

打开登陆界面的源码,下面是源码中的 form 标签

 

Html 代码 
  1. <form name="aspnetForm" method="post" action="login.aspx?ReturnUrl=%2fuser%2fuserinfo.aspx" onsubmit="javascript:return WebForm_OnSubmit();" id="aspnetForm">  
  2. <div>  
  3. <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />  
  4. <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />  
  5. <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE0MjY3MDAxNzcPZBYCZg9kFgoCAQ8PFgIeCEltYWdlVXJsBRt+XGltYWdlc1xoZWFkZXJvcGFjNGdpZi5naWZkZAICDw8WAh4EVGV4dAUt5bm/5Lic5bel5Lia5aSn5a2m5Zu+5Lmm6aaG5Lmm55uu5qOA57Si57O757ufZGQCAw8PFgIfAQUcMjAxM+W5tDAz5pyIMDXml6UgIOaYn+acn+S6jGRkAgQPZBYEZg9kFgQCAQ8WAh4LXyFJdGVtQ291bnQCCBYSAgEPZBYCZg8VAwtzZWFyY2guYXNweAAM55uu5b2V5qOA57SiZAICD2QWAmYPFQMTcGVyaV9uYXZfY2xhc3MuYXNweAAM5YiG57G75a+86IiqZAIDD2QWAmYPFQMOYm9va19yYW5rLmFzcHgADOivu+S5puaMh+W8lWQCBA9kFgJmDxUDCXhzdGIuYXNweAAM5paw5Lmm6YCa5oqlZAIFD2QWAmYPFQMUcmVhZGVycmVjb21tZW5kLmFzcHgADOivu+iAheiNkOi0rWQCBg9kFgJmDxUDE292ZXJkdWVib29rc19mLmFzcHgADOaPkOmGkuacjeWKoWQCBw9kFgJmDxUDEnVzZXIvdXNlcmluZm8uYXNweAAP5oiR55qE5Zu+5Lmm6aaGZAIID2QWAmYPFQMbaHR0cDovL2xpYnJhcnkuZ2R1dC5lZHUuY24vAA/lm77kuabppobpppbpobVkAgkPZBYCAgEPFgIeB1Zpc2libGVoZAIDDxYCHwJmZAIBD2QWBAIDD2QWBAIBDw9kFgIeDGF1dG9jb21wbGV0ZQUDb2ZmZAIHDw8WAh8BZWRkAgUPZBYGAgEPEGRkFgFmZAIDDxBkZBYBZmQCBQ8PZBYCHwQFA29mZmQCBQ8PFgIfAQWlAUNvcHlyaWdodCAmY29weTsyMDA4LTIwMDkuIFNVTENNSVMgT1BBQyA0LjAxIG9mIFNoZW56aGVuIFVuaXZlcnNpdHkgTGlicmFyeS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuPGJyIC8+54mI5p2D5omA5pyJ77ya5rex5Zyz5aSn5a2m5Zu+5Lmm6aaGIEUtbWFpbDpzenVsaWJAc3p1LmVkdS5jbmRkZL5QuJMrEZz+0UxuTVpXZ/EaY5A4" />  
  6. </div>  
  7.   
  8. <script type="text/javascript">  
  9. //<![CDATA[ 
  10. var theForm = document.forms[''aspnetForm'']; 
  11. if (!theForm) { 
  12.     theForm = document.aspnetForm; 
  13. } 
  14. function __doPostBack(eventTarget, eventArgument) { 
  15.     if (!theForm.onsubmit || (theForm.onsubmit() != false)) { 
  16.         theForm.__EVENTTARGET.value = eventTarget; 
  17.         theForm.__EVENTARGUMENT.value = eventArgument; 
  18.         theForm.submit(); 
  19.     } 
  20. } 
  21. //]]>  
  22. </script>  
  23.   
  24.   
  25. <script src="/WebResource.axd?d=kbLQnwjf5uNQN4GcWRC5kD1rIySOzkR3uLyKE5xUO0j4Fa2lQPZwQlk_qYaspRXtlojncSBfRJNkA00qXOMQqsKd8WY1&amp;t=634751988274393221" type="text/javascript"></script>  
  26.   
  27.   
  28. <script src="/WebResource.axd?d=nsbO6ZJty6_6fuRufFNYnRiJ-xEoD0xQr70NX6g0v64gngATPLSnyyt7jyZkELLW6THXmh92_m0Y5TyvhES_-JroQeU1&amp;t=634751988274393221" type="text/javascript"></script>  
  29. <script type="text/javascript">  
  30. //<![CDATA[ 
  31. function WebForm_OnSubmit() { 
  32. if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) return false; 
  33. return true; 
  34. } 
  35. //]]>  
  36. </script>  
  37.   
  38. <div>  
  39.   
  40.     <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBQKa7ezdCwKOmK5RApX9wcYGAsP9wL8JAqW86pcIaBhXmFYzd5pGDTk/afln2TfArPw=" />  
  41. </div>  
  42. <input name="ctl00$ContentPlaceHolder1$txtlogintype" type="hidden" id="ctl00_ContentPlaceHolder1_txtlogintype" value="0" />  
  43. <div id="Login" class="clearFix">  
  44.     <div class="LoginTitle">  
  45.         登录我的图书馆  
  46.     </div>  
  47.       
  48.       
  49.     <div class="LeftLogin">  
  50.             <div class="LoginDiv">  
  51.                   
  52.                 <div class="loginContent">  
  53.                     <div class="loginInfo">  
  54.                         <span class="leftInfo"> 图书证号:</span>  
  55.                         <span class="rightInfo">  
  56.                             <input name="ctl00$ContentPlaceHolder1$txtUsername_Lib" type="text" id="ctl00_ContentPlaceHolder1_txtUsername_Lib" class="txtInput" autocomplete="off" /><span id="ctl00_ContentPlaceHolder1_rfv_UserName_Lib" style="color:Red;display:none;"> 请输入证号 </span>  
  57.                         </span>  
  58.                     </div>  
  59.                     <div class="loginInfo">  
  60.                         <span class="leftInfo"> 密 & nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 码:</span>  
  61.                         <span class="rightInfo">  
  62.                             <input name="ctl00$ContentPlaceHolder1$txtPas_Lib" type="password" id="ctl00_ContentPlaceHolder1_txtPas_Lib" class="txtInput" /><span id="ctl00_ContentPlaceHolder1_rfv_Password_Lib" style="color:Red;display:none;"> 请输入密码 </span>  
  63.                         </span>  
  64.                     </div>  
  65.                     <div>  
  66.                         <span id="ctl00_ContentPlaceHolder1_lblErr_Lib"></span>  
  67.                     </div>  
  68.                     <div class="loginInfo">  
  69.                         <input type="submit" name="ctl00$ContentPlaceHolder1$btnLogin_Lib" value="登录" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$ContentPlaceHolder1$btnLogin_Lib&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" id="ctl00_ContentPlaceHolder1_btnLogin_Lib" class="btn" />  
  70.                         <input type="button" value="清空" onclick="rset()" class="btn"/>  
  71.                     </div>  
  72.                 </div>  
  73.             </div>  
  74.         </div>  
  75.         <div class="RightDescription">  
  76.         <img src="images/pin.gif" />  <br/>  
  77.         1.  如果您使用的是公共电脑,请在使用完毕后,务必退出登录,以保安全。<br />  
  78.         2.  首次登录,请先 <a href="changepas.aspx"> 修改初始密码 </a>。  
  79.         </div>  
  80.           
  81.           
  82.           
  83.       
  84.       
  85. </div>  
  86.   
  87. <script type="text/javascript">  
  88. //<![CDATA[ 
  89. var Page_Validators =  new Array(document.getElementById("ctl00_ContentPlaceHolder1_rfv_UserName_Lib"), document.getElementById("ctl00_ContentPlaceHolder1_rfv_Password_Lib")); 
  90. //]]>  
  91. </script>  
  92.   
  93. <script type="text/javascript">  
  94. //<![CDATA[ 
  95. var ctl00_ContentPlaceHolder1_rfv_UserName_Lib = document.all ? document.all["ctl00_ContentPlaceHolder1_rfv_UserName_Lib"] : document.getElementById("ctl00_ContentPlaceHolder1_rfv_UserName_Lib"); 
  96. ctl00_ContentPlaceHolder1_rfv_UserName_Lib.controltovalidate = "ctl00_ContentPlaceHolder1_txtUsername_Lib"; 
  97. ctl00_ContentPlaceHolder1_rfv_UserName_Lib.focusOnError = "t"; 
  98. ctl00_ContentPlaceHolder1_rfv_UserName_Lib.errormessage = "请输入证号"; 
  99. ctl00_ContentPlaceHolder1_rfv_UserName_Lib.display = "Dynamic"; 
  100. ctl00_ContentPlaceHolder1_rfv_UserName_Lib.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid"; 
  101. ctl00_ContentPlaceHolder1_rfv_UserName_Lib.initialvalue = ""; 
  102. var ctl00_ContentPlaceHolder1_rfv_Password_Lib = document.all ? document.all["ctl00_ContentPlaceHolder1_rfv_Password_Lib"] : document.getElementById("ctl00_ContentPlaceHolder1_rfv_Password_Lib"); 
  103. ctl00_ContentPlaceHolder1_rfv_Password_Lib.controltovalidate = "ctl00_ContentPlaceHolder1_txtPas_Lib"; 
  104. ctl00_ContentPlaceHolder1_rfv_Password_Lib.focusOnError = "t"; 
  105. ctl00_ContentPlaceHolder1_rfv_Password_Lib.errormessage = "请输入密码"; 
  106. ctl00_ContentPlaceHolder1_rfv_Password_Lib.display = "Dynamic"; 
  107. ctl00_ContentPlaceHolder1_rfv_Password_Lib.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid"; 
  108. ctl00_ContentPlaceHolder1_rfv_Password_Lib.initialvalue = ""; 
  109. //]]>  
  110. </script>  
  111.   
  112.   
  113. <script type="text/javascript">  
  114. //<![CDATA[ 
  115.  
  116. var Page_ValidationActive = false; 
  117. if (typeof(ValidatorOnLoad) == "function") { 
  118.     ValidatorOnLoad(); 
  119. } 
  120.  
  121. function ValidatorOnSubmit() { 
  122.     if (Page_ValidationActive) { 
  123.         return ValidatorCommonOnSubmit(); 
  124.     } 
  125.     else { 
  126.         return true; 
  127.     } 
  128. } 
  129.         //]]>  
  130. </script>  
  131. </form>  

 

里面很多代码,我们要从中提取出我们登陆所需要的表单信息,input 和 select 这些标签都是作为登陆表单内容,这里只有 input 标签我们就提取它就好了,代码如下:

initLoginParmas (String userName,StringpassWord) 和 getLoginFormData (String url) 两个方法

Java 代码 
  1. /** 
  2.      * 初始化参数 
  3.      *  
  4.      * @param userName 
  5.      * @param passWord 
  6.      * @return  
  7.      * @throws ParseException 
  8.      * @throws IOException 
  9.      */  
  10.     public static List<NameValuePair> initLoginParmas(String userName,  
  11.             String passWord) throws ParseException, IOException {  
  12.         List<NameValuePair> parmasList = new ArrayList<NameValuePair>();  
  13.         HashMap<String, String> parmasMap = getLoginFormData(LoginUrl);  
  14.         Set<String> keySet = parmasMap.keySet();  
  15.   
  16.         for (String temp : keySet) {  
  17.             if (temp.contains("Username")) {  
  18.                 parmasMap.put(temp, userName);  
  19.             } else if (temp.contains("txtPas")) {  
  20.                 parmasMap.put(temp, passWord);  
  21.             }  
  22.         }  
  23.   
  24.         Set<String> keySet2 = parmasMap.keySet();  
  25.         System.out.println("表单内容:");  
  26.         for (String temp : keySet2) {  
  27.             System.out.println(temp + " = " + parmasMap.get(temp));  
  28.         }  
  29.         for (String temp : keySet2) {  
  30.             parmasList.add(new BasicNameValuePair(temp, parmasMap.get(temp)));  
  31.         }  
  32.   
  33.         // System.out.println("initParams \n" + parmasMap);  
  34.   
  35.         return parmasList;  
  36.   
  37.     }  
Java 代码 
  1. /** 
  2.      * 获取登录表单 input 内容 
  3.      *  
  4.      * @param url 
  5.      * @return  
  6.      * @throws IOException 
  7.      * @throws ParseException 
  8.      */  
  9.     public static HashMap<String, String> getLoginFormData(String url)  
  10.             throws ParseException, IOException {  
  11.         Document document = Jsoup.parse(getHtml(url));  
  12.         Elements element1 = document.getElementsByTag("form");// 找出所有 form 表单  
  13.         Element element = element1.select("[method=post]").first();// 筛选出提交方法为 post 的表单  
  14.         Elements elements = element.select("input[name]");// 把表单中带有 name 属性的 input 标签取出  
  15.         HashMap<String, String> parmas = new HashMap<String, String>();  
  16.         for (Element temp : elements) {  
  17.             parmas.put(temp.attr("name"), temp.attr("value"));// 把所有取出的 input,取出其 name,放入 Map 中  
  18.         }  
  19.         return parmas;  
  20.     }  

 

最后表单结果是:

表单内容:

Java 代码 
  1. ctl00$ContentPlaceHolder1$txtlogintype = 0  
  2. __VIEWSTATE = /wEPDwULLTE0MjY3MDAxNzcPZBYCZg9kFgoCAQ8PFgIeCEltYWdlVXJsBRt+XGltYWdlc1xoZWFkZXJvcGFjNGdpZi5naWZkZAICDw8WAh4EVGV4dAUt5bm/5Lic5bel5Lia5aSn5a2m5Zu+5Lmm6aaG5Lmm55uu5qOA57Si57O757ufZGQCAw8PFgIfAQUcMjAxM+W5tDAz5pyIMDXml6UgIOaYn+acn+S6jGRkAgQPZBYEZg9kFgQCAQ8WAh4LXyFJdGVtQ291bnQCCBYSAgEPZBYCZg8VAwtzZWFyY2guYXNweAAM55uu5b2V5qOA57SiZAICD2QWAmYPFQMTcGVyaV9uYXZfY2xhc3MuYXNweAAM5YiG57G75a+86IiqZAIDD2QWAmYPFQMOYm9va19yYW5rLmFzcHgADOivu+S5puaMh+W8lWQCBA9kFgJmDxUDCXhzdGIuYXNweAAM5paw5Lmm6YCa5oqlZAIFD2QWAmYPFQMUcmVhZGVycmVjb21tZW5kLmFzcHgADOivu+iAheiNkOi0rWQCBg9kFgJmDxUDE292ZXJkdWVib29rc19mLmFzcHgADOaPkOmGkuacjeWKoWQCBw9kFgJmDxUDEnVzZXIvdXNlcmluZm8uYXNweAAP5oiR55qE5Zu+5Lmm6aaGZAIID2QWAmYPFQMbaHR0cDovL2xpYnJhcnkuZ2R1dC5lZHUuY24vAA/lm77kuabppobpppbpobVkAgkPZBYCAgEPFgIeB1Zpc2libGVoZAIDDxYCHwJmZAIBD2QWBAIDD2QWBAIBDw9kFgIeDGF1dG9jb21wbGV0ZQUDb2ZmZAIHDw8WAh8BZWRkAgUPZBYGAgEPEGRkFgFmZAIDDxBkZBYBZmQCBQ8PZBYCHwQFA29mZmQCBQ8PFgIfAQWlAUNvcHlyaWdodCAmY29weTsyMDA4LTIwMDkuIFNVTENNSVMgT1BBQyA0LjAxIG9mIFNoZW56aGVuIFVuaXZlcnNpdHkgTGlicmFyeS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuPGJyIC8+54mI5p2D5omA5pyJ77ya5rex5Zyz5aSn5a2m5Zu+5Lmm6aaGIEUtbWFpbDpzenVsaWJAc3p1LmVkdS5jbmRkZL5QuJMrEZz+0UxuTVpXZ/EaY5A4  
  3. ctl00$ContentPlaceHolder1$txtPas_Lib = 密码不告诉你  
  4. __EVENTVALIDATION = /wEWBQKa7ezdCwKOmK5RApX9wcYGAsP9wL8JAqW86pcIaBhXmFYzd5pGDTk/afln2TfArPw=  
  5. ctl00$ContentPlaceHolder1$txtUsername_Lib = 3110006527  
  6. ctl00$ContentPlaceHolder1$btnLogin_Lib = 登录  

 

 

接下来是要登陆获取权限也就是获取到 Cookie

代码如下:

Java 代码 
  1. /** 
  2.      * 图书馆登陆 
  3.      *  
  4.      * @param context 
  5.      * @return 返回登陆后的界面 Html 代码 
  6.      * @throws ClientProtocolException 
  7.      * @throws IOException 
  8.      */  
  9.     public static String login() throws ClientProtocolException, IOException {  
  10.         List<NameValuePair> parmasList = new ArrayList<NameValuePair>();  
  11.         parmasList = initLoginParmas("3110006527""2787457");  
  12.         HttpPost post = new HttpPost(LoginUrl);  
  13.         post.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, false);  
  14.         // 阻止自动重定向,目的是获取第一个 ResponseHeader 的 Cookie 和 Location  
  15.         post.setHeader("Content-Type",  
  16.                 "application/x-www-form-urlencoded;charset=gbk");  
  17.         // 设置编码为 GBK  
  18.         post.setEntity(new UrlEncodedFormEntity(parmasList, "GBK"));  
  19.         HttpResponse response = new DefaultHttpClient().execute(post);  
  20.         cookie = response.getFirstHeader("Set-Cookie").getValue();  
  21.         // 取得 cookie 并保存起来  
  22.         // System.out.println("cookie= " + cookie);  
  23.         location = response.getFirstHeader("Location").getValue();  
  24.         // 重定向地址,目的是连接到主页  
  25.         mainUrl = Host + location;  
  26.         // 构建主页地址  
  27.         String html = getHtml(mainUrl);  
  28.         return html;  
  29.   
  30.     }  

 

登陆获取 Cookie 时候会遇到返回状态码是 302,这个时候 Post 方法的话,系统会自动重定向到 Location 地址,这时候你看到的 ResponseHeader 已经不是你登陆后返回的那个了,而是你访问重定向地址时候返回的 ResponseHeader,而 cookie 是含在登陆时候返回的 ResponseHeader 里面所以特别要注意添加语句

Java 代码 
  1. post.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS,false);  

 

 

给 Post 设置参数,这样就会阻止重定向,从而可以获取 Cookie 和 Location (为了访问主页界面)

Java 代码 
  1. cookie =response.getFirstHeader("Set-Cookie").getValue();  

 

 

接下来需要做的是根据 Location 得到主页地址,用 Jsoup 去解析主页,分析出我的借书情况的页面地址

接下来我们访问其他网页的时候就需要用到 cookie 了,所以在用 post 或者 get 方法的时候要调用 addHeader()或者 setHeader(); 把 Cookie 设置进去

Java 代码 
  1. /** 
  2.  * 获取网页 HTML 源代码 
  3.  *  
  4.  * @param url 
  5.  * @return  
  6.  * @throws ParseException 
  7.  * @throws IOException 
  8.  */  
  9.   
  10. private static String getHtml(String url) throws ParseException,  
  11.         IOException {  
  12.     // TODO Auto-generated method stub  
  13.     HttpGet get = new HttpGet(url);  
  14.     if ("" != cookie) {  
  15.         get.addHeader("Cookie", cookie);  
  16.     }  
  17.     HttpResponse httpResponse = new DefaultHttpClient().execute(get);  
  18.     HttpEntity entity = httpResponse.getEntity();  
  19.     return EntityUtils.toString(entity);  
  20. }  

 

通过 Chrome 浏览器分析页面源码,可以看到该标签

Java 代码 
  1. <a href="bookborrowed.aspx" > 当前借阅情况和续借 </a>  

bookborrowed.aspx  这一段就是我们需要的

 

获取代码如下:

Java 代码 
  1. public static void getMyBorrowedBooks() {  
  2.         try {  
  3.             Document document = Jsoup.parse(login());  
  4.             Elements elements1 = document  
  5.                     .getElementsContainingOwnText("当前借阅情况和续借");// 通过 text 关键字找到所要的 <a> 标签  
  6.             String url = elements1.first().attr("href");  
  7.             borrowedBooksUrl = mainUrl.substring(0,  
  8.                     mainUrl.lastIndexOf("/") + 1) + url;// 取值和 mainUrl 进行拼凑组织借阅情况地址  
  9.             getBookBorrowedData(getHtml(borrowedBooksUrl));  
  10.   
  11.         } catch (IOException e) {  
  12.             // TODO Auto-generated catch block  
  13.             e.printStackTrace();  
  14.         }  
  15.     }  

 

 

       获取到借书情况的地址后,我们就去访问这个地址,获取源码。

我们所需要的事这部分的数据(只截取一部分):

Java 代码 
  1. <tr>              
  2.            <td width="5%">  
  3.              
  4.              
  5.            续满  
  6.              
  7.              
  8.            </td>  
  9.            <td width="10%">2013-04-10</td>  
  10.            <td width="35%"><a href="../bookinfo.aspx?ctrlno=571892" target="_blank"> 编写高质量代码 [专著]:改善 Java 程序的 151 个建议=Writing solw Java cove:151 suggestons to improve your Java program/秦小波著 </a></td>  
  11.            <td width="5%"> </td>  
  12.            <td width="8%"> 中文图书 </td>  
  13.            <td width="7%">A2973844</td>  
  14.            <td width="10%">2012-12-05</td>  
  15.         </tr>  
  16.          
  17.        <tr>         

 

 

    通过下面代码  用 Jsoup 进行筛选         

Java 代码 
  1. /** 
  2.      * 获取借书情况具体数据(List<BookEntity>) 
  3.      *  
  4.      * @param src 
  5.      * @return List<BookEntity> 
  6.      */  
  7.     private static List<BookEntity> getBookBorrowedData(String src) {  
  8.         List<BookEntity> data = new ArrayList<BookEntity>();  
  9.         Document document = Jsoup.parse(src);  
  10.         Element element = document.select("[id=borrowedcontent]").first()  
  11.                 .getElementsByTag("table").first();  
  12.         Elements elements2 = element.getElementsByTag("tr");  
  13.         for (Element temp2 : elements2) {  
  14.             Elements elements3 = temp2.getElementsByTag("td");  
  15.             BookEntity entity = new test().new BookEntity()  
  16.                     .setIsFullData(elements3.get(0).text())  
  17.                     .setData2Return(elements3.get(1).text())  
  18.                     .setName(elements3.get(2).text())  
  19.                     .setData2Borrowed(elements3.get(6).text());  
  20.             data.add(entity);  
  21.   
  22.         }  
  23.         data.remove(0);  
  24.         System.out.println("借书情况 \n");  
  25.   
  26.         for (BookEntity temp : data) {  
  27.             System.out.println(temp.getName() + "\n" + temp.getData2Borrowed()  
  28.                     + "\n" + temp.getData2Return() + "\n"  
  29.                     + temp.getIsFullData());  
  30.         }  
  31.         return data;  
  32.   
  33.     }  

 

 

    最后打印出来结果是:

Java 代码 
  1. 借书情况  
  2.   
  3. 编写高质量代码 [专著]:改善 Java 程序的 151 个建议=Writing solw Java cove:151 suggestons to improve your Java program/秦小波著  
  4. 2012-12-05  
  5. 2013-04-10  
  6. 续满  
  7. 疯狂 Java [专著]:突破程序员基本功的 16 课/李刚编著  
  8. 2012-12-05  
  9. 2013-04-10  
  10. 续满  
  11. 程序员修炼之道 [专著]:从小工到专家=The pragmatic programmer:From journeyman to master:评注版/(美) Andrew Hunt,(美) David Thomas 著;周爱民,蔡学镛评注  
  12. 2012-11-22  
  13. 2013-04-10  
  14. 续满  
  15. 重构:改善既有代码的设计=Refactoring:improving the design of existing code/(美) Martin Fowler 著;熊节译  
  16. 2012-11-22  
  17. 2013-04-10  
  18. 续满  
  19. Android 高薪之路 [专著]:Android 程序员面试宝典/李宁编著  
  20. 2012-11-29  
  21. 2013-04-10  
  22. 续满  
  23. Android 技术内幕 [专著]・系统卷=Android internals・System/杨丰盛著  
  24. 2012-12-04  
  25. 2013-04-10  
  26. 续满  
  27. 我编程, 我快乐 [专著]:程序员职业规划之道=The passionate programmer:creating a remarkable career in software development/(美) Chad Fowler 著;于梦瑄译  
  28. 2013-01-17  
  29. 2013-04-17  
  30. 续满  
Java 代码 
  1. <strong> 完整代码:</strong>  
  2. package moniLogin;  
  3.   
  4. import java.io.IOException;  
  5. import java.util.ArrayList;  
  6. import java.util.HashMap;  
  7. import java.util.Iterator;  
  8. import java.util.List;  
  9. import java.util.Set;  
  10.   
  11. import org.apache.http.Header;  
  12. import org.apache.http.HeaderElement;  
  13. import org.apache.http.HttpEntity;  
  14. import org.apache.http.HttpResponse;  
  15. import org.apache.http.NameValuePair;  
  16. import org.apache.http.ParseException;  
  17. import org.apache.http.client.ClientProtocolException;  
  18. import org.apache.http.client.entity.UrlEncodedFormEntity;  
  19. import org.apache.http.client.methods.HttpGet;  
  20. import org.apache.http.client.methods.HttpPost;  
  21. import org.apache.http.client.params.ClientPNames;  
  22. import org.apache.http.impl.client.DefaultHttpClient;  
  23. import org.apache.http.message.BasicNameValuePair;  
  24. import org.apache.http.util.EntityUtils;  
  25. import org.jsoup.Jsoup;  
  26. import org.jsoup.nodes.Document;  
  27. import org.jsoup.nodes.Element;  
  28. import org.jsoup.select.Elements;  
  29.   
  30. public class test {  
  31.     private static String LoginUrl = "http://222.200.98.171:81/login.aspx";  
  32.     private static String Host = "http://222.200.98.171:81";  
  33.     private static String mainUrl = "";  
  34.     private static String borrowedBooksUrl = "";  
  35.     private static String cookie = "";  
  36.     private static String location = "";  
  37.   
  38.     /** 
  39.      * @param args 
  40.      */  
  41.     public static void main(String[] args) {  
  42.         // TODO Auto-generated method stub  
  43.         getMyBorrowedBooks();  
  44.     }  
  45.   
  46.     public static void getMyBorrowedBooks() {  
  47.         try {  
  48.             Document document = Jsoup.parse(login());  
  49.             Elements elements1 = document  
  50.                     .getElementsContainingOwnText("当前借阅情况和续借");// 通过 text 关键字找到所要的 <a> 标签  
  51.             String url = elements1.first().attr("href");  
  52.             borrowedBooksUrl = mainUrl.substring(0,  
  53.                     mainUrl.lastIndexOf("/") + 1) + url;// 取值和 mainUrl 进行拼凑组织借阅情况地址  
  54.             getBookBorrowedData(getHtml(borrowedBooksUrl));  
  55.   
  56.         } catch (IOException e) {  
  57.             // TODO Auto-generated catch block  
  58.             e.printStackTrace();  
  59.         }  
  60.     }  
  61.   
  62.     /** 
  63.      * 获取借书情况具体数据(List<BookEntity>) 
  64.      *  
  65.      * @param src 
  66.      * @return List<BookEntity> 
  67.      */  
  68.     private static List<BookEntity> getBookBorrowedData(String src) {  
  69.         List<BookEntity> data = new ArrayList<BookEntity>();  
  70.         Document document = Jsoup.parse(src);  
  71.         Element element = document.select("[id=borrowedcontent]").first()  
  72.                 .getElementsByTag("table").first();  
  73.         Elements elements2 = element.getElementsByTag("tr");  
  74.         for (Element temp2 : elements2) {  
  75.             Elements elements3 = temp2.getElementsByTag("td");  
  76.             BookEntity entity = new test().new BookEntity()  
  77.                     .setIsFullData(elements3.get(0).text())  
  78.                     .setData2Return(elements3.get(1).text())  
  79.                     .setName(elements3.get(2).text())  
  80.                     .setData2Borrowed(elements3.get(6).text());  
  81.             data.add(entity);  
  82.   
  83.         }  
  84.         data.remove(0);  
  85.         System.out.println("借书情况 \n");  
  86.   
  87.         for (BookEntity temp : data) {  
  88.             System.out.println(temp.getName() + "\n" + temp.getData2Borrowed()  
  89.                     + "\n" + temp.getData2Return() + "\n"  
  90.                     + temp.getIsFullData());  
  91.         }  
  92.         return data;  
  93.   
  94.     }  
  95.   
  96.     /** 
  97.      * 图书馆登陆 
  98.      *  
  99.      * @param context 
  100.      * @return 返回登陆后的界面 Html 代码 
  101.      * @throws ClientProtocolException 
  102.      * @throws IOException 
  103.      */  
  104.     public static String login() throws ClientProtocolException, IOException {  
  105.         List<NameValuePair> parmasList = new ArrayList<NameValuePair>();  
  106.         parmasList = initLoginParmas("3110006527""密码不告诉你");  
  107.         HttpPost post = new HttpPost(LoginUrl);  
  108.         post.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, false);  
  109.         // 阻止自动重定向,目的是获取第一个 ResponseHeader 的 Cookie 和 Location  
  110.         post.setHeader("Content-Type",  
  111.                 "application/x-www-form-urlencoded;charset=gbk");  
  112.         // 设置编码为 GBK  
  113.         post.setEntity(new UrlEncodedFormEntity(parmasList, "GBK"));  
  114.         HttpResponse response = new DefaultHttpClient().execute(post);  
  115.         cookie = response.getFirstHeader("Set-Cookie").getValue();  
  116.         // 取得 cookie 并保存起来  
  117.         // System.out.println("cookie= " + cookie);  
  118.         location = response.getFirstHeader("Location").getValue();  
  119.         // 重定向地址,目的是连接到主页  
  120.         mainUrl = Host + location;  
  121.         // 构建主页地址  
  122.         String html = getHtml(mainUrl);  
  123.         return html;  
  124.   
  125.     }  
  126.   
  127.     /** 
  128.      * 获取网页 HTML 源代码 
  129.      *  
  130.      * @param url 
  131.      * @return  
  132.      * @throws ParseException 
  133.      * @throws IOException 
  134.      */  
  135.   
  136.     private static String getHtml(String url) throws ParseException,  
  137.             IOException {  
  138.         // TODO Auto-generated method stub  
  139.         HttpGet get = new HttpGet(url);  
  140.         if ("" != cookie) {  
  141.             get.addHeader("Cookie", cookie);  
  142.         }  
  143.         HttpResponse httpResponse = new DefaultHttpClient().execute(get);  
  144.         HttpEntity entity = httpResponse.getEntity();  
  145.         return EntityUtils.toString(entity);  
  146.     }  
  147.   
  148.     /** 
  149.      * 初始化参数 
  150.      *  
  151.      * @param userName 
  152.      * @param passWord 
  153.      * @return  
  154.      * @throws ParseException 
  155.      * @throws IOException 
  156.      */  
  157.     public static List<NameValuePair> initLoginParmas(String userName,  
  158.             String passWord) throws ParseException, IOException {  
  159.         List<NameValuePair> parmasList = new ArrayList<NameValuePair>();  
  160.         HashMap<String, String> parmasMap = getLoginFormData(LoginUrl);  
  161.         Set<String> keySet = parmasMap.keySet();  
  162.   
  163.         for (String temp : keySet) {  
  164.             if (temp.contains("Username")) {  
  165.                 parmasMap.put(temp, userName);  
  166.             } else if (temp.contains("txtPas")) {  
  167.                 parmasMap.put(temp, passWord);  
  168.             }  
  169.         }  
  170.   
  171.         Set<String> keySet2 = parmasMap.keySet();  
  172.         System.out.println("表单内容:");  
  173.         for (String temp : keySet2) {  
  174.             System.out.println(temp + " = " + parmasMap.get(temp));  
  175.         }  
  176.         for (String temp : keySet2) {  
  177.             parmasList.add(new BasicNameValuePair(temp, parmasMap.get(temp)));  
  178.         }  
  179.   
  180.         // System.out.println("initParams \n" + parmasMap);  
  181.   
  182.         return parmasList;  
  183.   
  184.     }  
  185.   
  186.     /** 
  187.      * 获取登录表单 input 内容 
  188.      *  
  189.      * @param url 
  190.      * @return  
  191.      * @throws IOException 
  192.      * @throws ParseException 
  193.      */  
  194.     public static HashMap<String, String> getLoginFormData(String url)  
  195.             throws ParseException, IOException {  
  196.         Document document = Jsoup.parse(getHtml(url));  
  197.         Elements element1 = document.getElementsByTag("form");// 找出所有 form 表单  
  198.         Element element = element1.select("[method=post]").first();// 筛选出提交方法为 post 的表单  
  199.         Elements elements = element.select("input[name]");// 把表单中带有 name 属性的 input 标签取出  
  200.         HashMap<String, String> parmas = new HashMap<String, String>();  
  201.         for (Element temp : elements) {  
  202.             parmas.put(temp.attr("name"), temp.attr("value"));// 把所有取出的 input,取出其 name,放入 Map 中  
  203.         }  
  204.         return parmas;  
  205.     }  
  206.   
  207.     class BookEntity {  
  208.         /** 
  209.          * 书名 
  210.          *  
  211.          */  
  212.         private String name;  
  213.         /** 
  214.          * 可借数 
  215.          */  
  216.         private String leandableNum;  
  217.         /** 
  218.          * 索引号 
  219.          */  
  220.         private String callNumber;  
  221.         /** 
  222.          * 作者 
  223.          */  
  224.         private String writer;  
  225.         /** 
  226.          * 出版社 
  227.          */  
  228.         private String publisher;  
  229.         /** 
  230.          * 还书时间 
  231.          */  
  232.         private String data2Return;  
  233.         /** 
  234.          * 借书时间 
  235.          */  
  236.         private String data2Borrowed;  
  237.         /** 
  238.          * 是否续满 
  239.          */  
  240.         private String isFullData;  
  241.   
  242.         public BookEntity() {  
  243.   
  244.         }  
  245.   
  246.         public String getName() {  
  247.             return name;  
  248.         }  
  249.   
  250.         public String getLeandableNum() {  
  251.             return leandableNum;  
  252.         }  
  253.   
  254.         public String getCallNumber() {  
  255.             return callNumber;  
  256.         }  
  257.   
  258.         public String getWriter() {  
  259.             return writer;  
  260.         }  
  261.   
  262.         public String getPublisher() {  
  263.             return publisher;  
  264.         }  
  265.   
  266.         public BookEntity setName(String name) {  
  267.             this.name = name;  
  268.             return this;  
  269.         }  
  270.   
  271.         public BookEntity setLeandableNum(String leandableNum) {  
  272.             this.leandableNum = leandableNum;  
  273.             return this;  
  274.         }  
  275.   
  276.         public BookEntity setCallNumber(String callNumber) {  
  277.             this.callNumber = callNumber;  
  278.             return this;  
  279.         }  
  280.   
  281.         public BookEntity setWriter(String writer) {  
  282.             this.writer = writer;  
  283.             return this;  
  284.         }  
  285.   
  286.         public BookEntity setPublisher(String publisher) {  
  287.             this.publisher = publisher;  
  288.             return this;  
  289.         }  
  290.   
  291.         public String getData2Return() {  
  292.             return data2Return;  
  293.         }  
  294.   
  295.         public String getData2Borrowed() {  
  296.             return data2Borrowed;  
  297.         }  
  298.   
  299.         public String getIsFullData() {  
  300.             return isFullData;  
  301.         }  
  302.   
  303.         public BookEntity setData2Return(String data2Return) {  
  304.             this.data2Return = data2Return;  
  305.             return this;  
  306.         }  
  307.   
  308.         public BookEntity setData2Borrowed(String data2Borrowed) {  
  309.             this.data2Borrowed = data2Borrowed;  
  310.             return this;  
  311.         }  
  312.   
  313.         public BookEntity setIsFullData(String isFullData) {  
  314.             this.isFullData = isFullData;  
  315.             return this;  
  316.         }  
  317.   
  318.     }  
  319.   
  320. }  

 

 

    关于 Jsoup 怎么使用这里就不详细说了,

    详细请查阅这个网站:http://www.open-open.com/jsoup/

 

今天关于java 版 chsi.com.cn 模拟登陆java模拟登录系统的分享就到这里,希望大家有所收获,若想了解更多关于Flask-testing(一)—— 模拟登陆、github 模拟登陆、htmlunit 模拟登陆 https、HttpClient + Jsoup 模拟登陆,解析 HTML, 信息筛选(广工图书馆)等相关知识,可以在本站进行查询。

本文标签: