中南财大的校园一卡通头像爬虫

想到马上就要毕业了,以后就再也登录不了校园网了,干脆就把之前爬虫的校园网登录方法写下来,不过学校的登录验证方法会修改,记得16年爬的时候还需要填写验证码的,17年干脆就取消了验证码,不过在爬取其他内容的时候需要修改cookie的内容。
希望有缘看到这篇文章的校友,如果在学习爬虫之初想爬取校园网,提供帮助

步骤

  • 首先当然是打开登录页面


    登录界面.png
  • 用chrome检查登录时的内容,登录是post的方法,登录的表单内容也很简单,id是账号,pwd是密码,第一个state隐藏在源代码中,很容易就能提取


    登录表单.png
#coding=utf-8
import requests
import re
import json
import os

r=requests.Session()
url=r'http://ecard.zuel.edu.cn/Login.aspx'
headers = { 
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36",
    "Referer":"http://ecard.zuel.edu.cn/Login.aspx",
    "Origin":"http://ecard.zuel.edu.cn",
    "Host":"ecard.zuel.edu.cn",
            }
def zhengze(patt,htm):
        hh=re.compile(patt)
        ll=re.findall(hh,htm)
        return ll

html=r.get(url,headers=headers)
first_con=html.content.decode('utf-8')
pattern=r'id="__VIEWSTATE" value="(.+?)"'
#获取了__VIEWSTATE的值
code=zhengze(pattern,first_con)[0]

data={
    '__VIEWSTATE':code,
    'loginType':'sno',
    'loginId':'**',
    'loginPwd':'**'
    }

sec_con=r.post(url,headers=headers,data=data)
  • 登录之后就显示如下界面了,但头像并不是直接藏在源代码里,通过解析就可以获取的,还需要进一步分析。


    登录成功.jpg
  • 通过浏览chrome可以看到通过get请求得到的,其中no并不是直接可以得到的,也需要分析之前的请求。


    图片链接.png
  • no的获取链接


    no的链接.png

    json内容.png
  • 获取方式已经比较清晰了,获取no后使用get即可获得头像
#获取名字及no
new_url=r'http://ecard.zuel.edu.cn/Account/Operator.ashx?cmd=getuserbysno'
thr_con=r.post(new_url,headers=headers).content.decode('utf-8')
print(thr_con)
row_name=json.loads(thr_con)
name=row_name[0]['NAME']
no=row_name[0]['NO']

pic_url=r'http://ecard.zuel.edu.cn/Account/Img.aspx?cmd=img&no='+no+'&sno='+sno
pic_con=r.get(ex_url,headers=headers).content
open(name+'.jpg', 'wb').write(pic_con)

展望

照片的玩法有很多,我暂时只想到一个
如果有的同学比如班干部之类的,有很多同学的学号及身份证号,就可以稍加修改下,下载大量同学的黑照片,然后提交到百度AI的人像识别接口,让系统识别给人像打分。

from aip import AipFace
import os
""" 你的 APPID AK SK """
APP_ID = '*****'
API_KEY = 'AvvLEkGC8tsZne6k4SbkP9Em'
SECRET_KEY = '3Yi07s4ttZjWgQnx1UlHeAl9LrAmggvP'
client = AipFace(APP_ID, API_KEY, SECRET_KEY)

def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()
def get_rate(pic_path):
    options = {}
    options["max_face_num"] = 1
    options["face_fields"] = "beauty"
    image = get_file_content(pic_path)
    result=client.detect(image,options)
    result=result['result'][0]['beauty']
    return result
file_path='*****'
result=get_rate(file_path)
print (result)

百度给我打的分是62.161457061768。哈哈,勉强及格

你可能感兴趣的:(中南财大的校园一卡通头像爬虫)