对于爬虫来说,需要爬取的信息如果需要登录才可以得到的话,那么我们就需要模拟登录。比如,登录教务系统才可以获取成绩。
目前国内高校除了使用自己开发的教务系统,部分高校还统一采用了正方教务管理系统、URP综合教务系统、青果教务系统等。
由于网上介绍正方教务系统模拟登录的文章很多、使用青果教务系统的高校比较少,所以今天介绍一下模拟登录URP综合教务系统。
下面是某校使用了十几年的URP综合教务系统登录页面。
打开浏览器的开发者工具,可以看到如下图所示的信息,比如请求地址、请求方法、请求状态、表单数据等。
得到这些信息,我们就可以模拟浏览器,使用请求地址、请求方法、表单数据进行模拟登录啦!
直接上代码吧,注释很详细。首先引用了requests库,这是比较流行的第三方请求库,既然是第三方,就需要手动安装,安装命令百度一下。然后使用了类,尽可能让代码装得优雅(虽然就这么几行)~
# 导入requests库 import requests # 登录类 class Login(object): # init 函数 def __init__(self): # 请求头 self.headers = { 'Referer': 'http://xxx.xxx.edu.cn/login.jsp', 'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Mobile Safari/537.36', 'Host': 'xxx.xxx.edu.cn' } # 登录请求地址 self.post_url = 'http://xxx.xxx.edu.cn/loginAction.do' # 验证码请求地址 self.yzm_url = 'http://xxx.xxx.edu.cn/validateCodeAction.do' # 维持一个session self.session = requests.Session() # login函数 def login(self, account, password): # 请求验证码并保存 with open("yzm.jpg", "wb") as f: f.write(self.session.get(self.yzm_url, headers=self.headers).content) # 暂时手动输入验证码 yzm = input("请查看当前目录下的验证码图片,输入验证码\n") # 登录请求数据 post_data = { 'zjh': account, 'mm': password, 'v_yzm': yzm, } # 请求登录 loginResponse = self.session.post(self.post_url, data=post_data, headers=self.headers) # 打印结果 print("状态码:" + str(loginResponse.status_code)) print(loginResponse.text) # 测试 if __name__ == "__main__": myLogin = Login() myLogin.login(account='xxxx', password='xxxx')
运行程序,需要手动输入代码同级目录下储存的验证码,然后程序会输出本次请求的状态码和response内容。
这种网站模拟登录还是比较简单的。当然,如果有兴趣,可以继续拓展,引入第三方图片验证码服务或者自己研究图像识别处理验证码。