美文网首页python爬虫系列
用python爬取正方系统获取课表

用python爬取正方系统获取课表

作者: 小新你蜡笔呢 | 来源:发表于2018-05-29 22:38 被阅读0次

由于近期在学习python,看到别人写过这个,自己也练习一下,

所以就拿正方教务系统联系爬取课表。

写的不咋的,但是效果达到就好。

首先分析页面

分析页面推荐chrome,进入页面点击F12打开开发者工具,切换到Network

随便输入下账号密码,我们可以看到Headers和提交的表单信息

登录表单

post表单

不同的学校可能提交的不一样,但也大同小异。我们可以看到提交的有:

__VIEWSTATE,__EVENTVALIDATION,TextBox1,TextBox2,TextBox3,RadioButtonList1,Button1,

通过分析我们知道TextBox1表示账号,TextBox2是密码,TextBox3是验证码,RadioButtonList1是身份

其他的我们可以直接复制(包括表头信息),我们填写的也就这几个。验证码由于还没有深入研究,还是采用下载到本地,手动输入的方式吧。

获取验证码

获取验证码

值得注意的是登陆时身份要转换一下:在表单中点击view decoded就可以看到身份变成了:%D1%A7%C9%FA

解决了验证码后登陆就没什么大问题了。

分析课程表页面

和登陆时一样,我们找到课程表的页面看一下请求

课程表页面

接下来就是找到课程表table,并获取,如下:

找到table的id

找到id,这样就可以开心的去敲代码了。

import os

import requests

from bs4 import BeautifulSoup

from PIL import Image

header = {

    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",

    "Accept-Encoding": "gzip, deflate, sdch",

    "Accept-Language": "zh-CN,zh;q=0.8",

    "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; \

        .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)",

    "Referer": "你的地址",

    "Host": "你的地址", "Upgrade-Insecure-Requests": "1",

    "Cache-Control": "max-age=0"

}

header_code = {

    "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; \

        .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)",

    "Referer": "你的地址",

    "Host": "你的地址",

    "Cache-Control": "max-age=0"

}

URL = "你的地址"

#验证码地址

URL_CODE = "你的地址/CheckCode.aspx"

S = requests.session()

def get_post_data(url):

    re = S.get(url).text

    soup = BeautifulSoup(re, 'lxml')

    viewState = soup.find('input', attrs={'name': '__VIEWSTATE'})['value']

    cookies = requests.utils.dict_from_cookiejar(S.cookies)

    header.update(cookies)

    header_code.update(cookies)

    code = S.get(URL_CODE, headers=header_code)

    with open("code.gif", "wb") as f:

        f.write(code.content)

    image = Image.open('{}/code.gif'.format(os.getcwd()))

    image.show()

    user = input("学号:")

    pwd = input("密码:")

    checkCode = input("验证码:")

    login_info = {

        "__VIEWSTATE": viewState,

        "__EVENTVALIDATION":'/wEWCwL+3vflAwLs0bLrBgLs0fbZDALs0Yq1BQK/wuqQDgKAqenNDQLN7c0VAuaMg+INAveMotMNAoznisYGArursYYI6rWkBO0iCt49zW+5k0o6O9ssuys=',

        "TextBox1": user,

        "TextBox2": pwd,

        "TextBox3": checkCode,

        "RadioButtonList1": "%D1%A7%C9%FA",

        "Button1": "",

        "lbLanguage": ""

    }

    return login_info

def login(url, data):

    req = S.post(url=url, data=data, headers=header) 

    if judge(req.text) == 1:

        content_req = S.get("你的地址/xskbcx.aspx?xh=学号&xm=%CD%F5%C3%A7&gnmkdm=N121603",headers=header_code)

        soup2 = BeautifulSoup(content_req.text, 'lxml')

        score = soup2.find('table', attrs={'id': 'Table1'})       

        print(score.text)

    else:

        print(judge(req.text))

        print("重新登录")

        main()

def judge(html):

    soup_judge = BeautifulSoup(html, 'html.parser')

    script = soup_judge.find_all('script')[0].text

    if "验证码不正确" in script:

        return "验证码错误"

    elif "用户名不存在" in script:

        return "用户名不存在"

    elif "密码错误" in script:

        return "密码错误"

    else:

        return 1

def main():

    data = get_post_data(URL)

    login(URL, data)

if __name__ == '__main__':

    main()

参考别人的还是很多的,这些东西大家还是要多动手练习练习。

相关文章

网友评论

    本文标题:用python爬取正方系统获取课表

    本文链接:https://www.haomeiwen.com/subject/vufzjftx.html