Web|爬虫模拟登陆强智教务系统
爬虫模拟登陆强智教务系统
- 引言
- 思路分析
- 完整代码
- 总结分析
引言 面对疫情,我可以做什么呢?
文章图片
面对疫情,我可以每天睡到11点
面对疫情,我可以……
好像也没有别的事情可以干了
ε=(′ο`*)))唉,看来只能呆在家中当废物了。最近,在家闲的无聊,便打起了学校教务系统的主意,没错,就是那个抢课巨慢,平时还不怎么好用的强智教务系统。今天,我就尝试一下用Python写个爬虫来模拟登陆一下强智教务系统。
思路分析 我们在用浏览器进行登陆时,需要填写用户名、密码和验证码这三项内容,而我们用爬虫进行模拟登陆的关键就是找到请求的URL,然后写代码发送请求即可。
首先,进行抓包分析
文章图片
在请求的URL中,我们发现了其中一个URL以post的方式请求服务器,并且返回的状态码为302,页面被重定向了,而重定向的URL正好是登陆成功后的主页。
文章图片
从发送的数据中,我们发现最后一项就是验证码,而前两项并没有什么卵用,最关键的是第三项的数据,看起来毫无规律可循,盲猜是对用户名和密码进行了加密,应该是防止别人破解吧!
回到登陆页面,查看页面的源代码,竟然发现了它的加密方法。(写这个网站的程序员意识这么低吗?)
文章图片
有了加密方法,剩下的就好办了,用Python重写这个算法,生成加密字符串,再发送请求就行了。用户名和密码加密算法代码如下:
def get_code(username, password, session):
str_url = 'http://jwgl.sdust.edu.cn/Logon.do?method=logon&flag=sess'
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;
q=0.9,image/webp,image/apng,*/*;
q=0.8,application/signed-exchange;
v=b3;
q=0.9',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;
q=0.9',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Host': 'jwgl.sdust.edu.cn',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0;
Win64;
x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}
r = session.get(str_url, headers=headers)
dataStr = r.text
scode = dataStr.split("#")[0]
sxh = dataStr.split("#")[1]
code = username + "%%%" + password
encode = ""
# 加密算法核心代码
i = 0
while i < len(code):
if i < 20:
encode += code[i:i + 1] + scode[0:int(sxh[i:i + 1])]
scode = scode[int(sxh[i:i + 1]):len(scode)]
else:
encode += code[i:len(code)]
i = len(code)
i += 1
return encode
最后,就只剩下验证码没有解决了。在验证码这个地方,我被卡了好久,一开始,发送请求拿验证码图片时,忘了加cookie,虽然,拿到了验证码,但是验证码已经过期,导致好几次都因为验证码过期而无法登陆,我真是太难了。本想加上cookie就完成了,谁曾想刚从cookie的坑里出来,又掉进了验证码识别的坑里。对于验证码识别,我一开始用的是Tesseract-OCR,发现效果不好,正确率很低,接着我又用了百度AI的通用文字识别,结果效果仍然不理想,人工智能都不行了吗?最后,只能用笨办法,将验证码图片保存到本地,进行人工识别。
文章图片
完整代码
# !/usr/bin/env python
# —*— coding: utf-8 —*—
# @Time:2020/2/4 11:25
# @Author:Martin
# @File:强智教务系统模拟登陆.py
# @Software:PyCharm
import requests
import re
import os
from lxml import etree
from aip import AipOcr
# 参数配置
APP_ID = ''
API_KEY = ''
SECRET_KEY = ''
options = {
'detect_direction': 'true',
'language_type': 'CHN_ENG'
}
aipOcr = AipOcr(APP_ID, API_KEY, SECRET_KEY)def main():
# username = input("请输入用户名:")
# password = input("请输入密码:")
username = ''
password = ''
session = get_cookie()
verify_code = get_verify_code(session)
encoded = get_code(username, password, session)
login(encoded, verify_code, session)def get_cookie():
host = 'http://jwgl.sdust.edu.cn/'
session = requests.session()
session.get(host, headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0;
Win64;
x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
})
return sessiondef get_code(username, password, session):
str_url = 'http://jwgl.sdust.edu.cn/Logon.do?method=logon&flag=sess'
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;
q=0.9,image/webp,image/apng,*/*;
q=0.8,application/signed-exchange;
v=b3;
q=0.9',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;
q=0.9',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Host': 'jwgl.sdust.edu.cn',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0;
Win64;
x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}
r = session.get(str_url, headers=headers)
dataStr = r.text
scode = dataStr.split("#")[0]
sxh = dataStr.split("#")[1]
code = username + "%%%" + password
encode = ""
i = 0
while i < len(code):
if i < 20:
encode += code[i:i + 1] + scode[0:int(sxh[i:i + 1])]
scode = scode[int(sxh[i:i + 1]):len(scode)]
else:
encode += code[i:len(code)]
i = len(code)
i += 1
return encodedef get_verify_code(session):
img_url = 'http://jwgl.sdust.edu.cn/verifycode.servlet'
headers = {
'Accept': 'image/webp,image/apng,image/*,*/*;
q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;
q=0.9',
'Connection': 'keep-alive',
'Host': 'jwgl.sdust.edu.cn',
'Referer': 'http://jwgl.sdust.edu.cn/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0;
Win64;
x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
r = session.get(img_url, headers=headers)
# 利用百度AI识别验证码
# result = aipOcr.basicGeneral(r.content, options)
# try:
#text = result['words_result'][0]['words']
# except :
#text = ""
# 人工识别验证码
if not os.path.exists('./result/'):
os.makedirs('./result/')
with open('./result/verify_code.png', 'wb') as f:
f.write(r.content)
text = input("请打开本地图片,识别图中的验证码!")
return textdef login(encoded, verify_code, session):
login_url = 'http://jwgl.sdust.edu.cn/Logon.do?method=logon'
data = https://www.it610.com/article/{'view': 0,
'useDogCode': '',
'encoded': encoded,
'RANDOMCODE': verify_code
}
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;
q=0.9,image/webp,image/apng,*/*;
q=0.8,application/signed-exchange;
v=b3;
q=0.9',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;
q=0.9',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Content-Length': '101',
'Content-Type': 'application/x-www-form-urlencoded',
'Host': 'jwgl.sdust.edu.cn',
'Origin': 'http://jwgl.sdust.edu.cn',
'Referer': 'http://jwgl.sdust.edu.cn/',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0;
Win64;
x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}
r = session.post(login_url, headers=headers, data=https://www.it610.com/article/data)
try:
html = etree.HTML(r.text)
error = html.xpath('//font[@color="red"]/text()')[0]
print(error)
except :
print(r.text)if __name__ == '__main__':
main()
总结分析 首先,来说一下cookie的问题,在爬取需要登录的网站时,一定要加上cookie,不然无法爬取登录后的页面。
对于验证码图片的识别,我们可以先将图片保存到本地,再进行一些图像的基本处理,比如说,二值化、滤波等,这样把处理后的图片交由百度AI去识别,准确率就会提高。还有一个方法就是,针对特定网站的验证码进行模型训练,训练出能够识别出特定网站验证码的AI,不过这个方法较为复杂。
【Web|爬虫模拟登陆强智教务系统】虐猫人薛定谔i 2020年2月4日 写于家中
推荐阅读
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- 私有化轻量级持续集成部署方案--03-部署web服务(下)
- 爬虫数据处理HTML转义字符
- web网页模板|如此优秀的JS轮播图,写完老师都沉默了
- 2018-12-05爬虫
- spring|spring boot项目启动websocket
- OC:|OC: WKWebView详解
- WKWebview|WKWebview js 调用oc 和oc调用js
- 三门问题(蒙提霍尔悖论)分析与Golang模拟
- javaweb|基于Servlet+jsp+mysql开发javaWeb学生成绩管理系统