Python爬虫项目:模拟登录正方系统

项目背景

我们可以通过爬虫来模拟登录来查询自己的成绩,这其中最重要的就是登录这个关卡,只要通过了,就可以方便的查询自己的成绩了。但是我们还是要在 法律的允许条件下 爬取数据,下列的代码已进行隐私处理,并不针对任何组织。

爬虫分析

  • 通过抓包,发现登录需要提交 学号密码验证码VIEWSTATE

  • 通过分析发现 其中的VIEWSTATE参数就在网页中,所以我们可以通过正则表达式匹配出来

mark

爬虫项目结构

import re
import requests

class API(object):
    ...

class Tool(object):
    ...

API 类

· 通过抓包,知道了以下接口

class API(object):
    # 登录页
    GET_INDEX = "http://XXXXXXXX:XXXX/"

    # 获取验证码
    GET_YZM_URL = 'http://XXXXXXXX:XXXX/CheckCode.aspx'

    # 登录
    POST_LOGIN = 'http://XXXXXXXX:XXXX/default2.aspx'

Tool 类

class Tool(object):

    session = requests.session()
    VIEWSTATE = ""

    # 获取 VIEWSTATE 参数
    @classmethod
    def getHtml(cls):
        response = cls.session.get(API.GET_INDEX).text
        cls.VIEWSTATE = re.search(r'__VIEWSTATE" value="(.*?)" />', response).group(1)

    # 下载验证码在当前路径
    @classmethod
    def download_yzm(cls):
        yzm_image = cls.session.get(url=API.GET_YZM_URL)
        with open("yzm.jpg", 'wb') as file:
            file.write(yzm_image.content)

    # 登录方法
    @classmethod
    def login(cls, account, pwd, yzm):
        data = {
            "__VIEWSTATE": cls.VIEWSTATE,
            "TextBox1": account,
            "TextBox2": pwd,
            "TextBox3": yzm,
            "RadioButtonList1": "%D1%A7%C9%FA",
            "Button1": "",
        }
        response = cls.session.post(url=API.POST_LOGIN, data=data)
        response.encoding = response.apparent_encoding
        response = response.text
        try:
            message = re.search(r">alert\('(.*?)'\);</script>", response).group(1)
        except:
            # 登录成功 跳转到详情页
            xm = re.search(r'<span id="xhxm">(.*?)同学</span>', response).group(1)
            print("欢迎" + xm + "登录成功")
        else:
            # 打印出登录失败信息
            print(message)

主函数

def main():
    t = Tool() # 实例化类
    t.getHtml() # 获取 VIEWSTATE
    t.download_yzm() # 下载验证码
    account = input("请输入你的学号:")
    pwd = input("请输入你的密码:")
    yzm = input("请输入验证码:")
    t.login(account,pwd,yzm) # 运行登录方法

mark

发表评论 / Comment

用心评论~