您的位置:首页 > 编程语言 > Python开发

python3模拟登录我们学校的官网爬去本学期的成绩

2017-08-26 10:39 134 查看
前言:窥探教务网已久,终于让我爬出成绩了,自从暑假开始,我就开始研究,找了许多的博客,发现网上基本的代码都是python2写的,而且还看不太懂,刚开始的时候我一直访问校外查询的网站(http://www.jwc.ldu.edu.cn/cj/)一直进不去,后来开始访问学校的教务信息网,进行爬数据,发现比校外多了验证码,很无语啊!

言归正传,开始讲解。

写爬虫之前,都需要踩点

首先打开这个页面(http://202.194.48.15/loginAction.do需要我们学校的塞尔网才能访问



即这个页面,先右键审查元素,找到network这个选项
找到Request Method:是post的name











就是这个,访问的url为:http://202.194.48.15/loginAction.do
,访问方式是post,他的访问参数有zjh,mm,v_yzm(姓名,密码 ,验证码),那验证码该如何获得啊?验证码是一张图片,首先我们需要找到验证码的所在地,首先找网页的源代码,显而易见,验证码的连接并不在源代码中,那么就需抓包了,看服务器


到底动态访问了那些网页。






验证码是图片,而服务器返回的怎么多,经过多次查找发现

Request URL:
http://202.194.48.15/validateCodeAction.do?random=0.6720077762740253是需要请求的url




接下来就是要保存照片和识别验证码,识别验证码需要导入pytesser这个模块(点击打开链接),patesser识别可能需要许多次才能成功,因此需要循环来控制

模拟登录需要借助cookies,来登录(也可以借助from selenium import webdriver这个模块)

cj = http.cookiejar.CookieJar()
opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
urllib.request.install_opener(opener)

代码如下:
#author:chen
#py3
#time:2017/8/8
import os
import urllib.request
import urllib.parse
import http.cookiejar
import re
from PIL import Image,ImageEnhance
import pytesseract
import time

Img_URL = 'http://202.194.48.15/validateCodeAction.do?random=0.4750630510118721'
Login_URL = 'http://202.194.48.15/loginAction.do'
Class_URL = 'http://202.194.48.15/gradeLnAllAction.do?type=ln&oper=qbinfo&lnxndm=2016-2017%D1%A7%C4%EA%B4%BA(%C1%BD%D1%A7%C6%DA)'
username = 'username'
password = 'password'

def login():
global flag
cj = http.cookiejar.CookieJar()
opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
urllib.request.install_opener(opener)
# get img
img_req = urllib.request.Request(Img_URL)
img_response = opener.open(img_req)
try:
out = open('code.jpg', 'wb')
# print img_response.read()
out.write(img_response.read())
out.flush()
out.close()
print('get code success')
except IOError:
print('file wrong')
# input code
print('A verification code is being recognized')
#自动识别
im = Image.open("code.jpg")
imgry = im.convert('L') # 图像加强,二值化
sharpness = ImageEnhance.Contrast(imgry) # 对比度增强
sharp_img = sharpness.enhance(2.0)
sharp_img.save("code.jpg")
image = Image.open('code.jpg')
img_code = pytesseract.image_to_string(image)
print(img_code)
#手动收入验证码
# im=Image.open('code.jpg')
# im.show()
# img_code = input("please input code: ")
# print('your code is %s' % img_code)
# login
LoginData = {
'zjh': username,
'mm': password,
'v_yzm': img_code,
}
time.sleep(3)#延时3秒
if len(img_code)!=4:
print('image_code error')
else:
try:
login_req = urllib.request.Request(Login_URL, urllib.parse.urlencode(LoginData).encode('gbk'))
login_req.add_header('User-Agent',"Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36");
login_response = opener.open(login_req)
imformation=login_response.read().decode('gbk')
#print(imformation)
time.sleep(2)#延时2秒
class_res=opener.open(Class_URL).read()
print('login success')
#print(class_res)
except:
print("Identify errors")
else:
with open('all_score.html','wb') as f:
f.write(class_res)
flag=False
flag=True
if __name__ == '__main__':
while flag:
login()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: