吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4835|回复: 32
收起左侧

[Python 转载] 超星学习通作业批量下载

 关闭 [复制链接]
nianboy 发表于 2022-7-14 16:25
接上一个帖子,有部分类型作业无法下载的情况,现在可以实现批量下载,改了一点代码。代码写的不太好,各位大佬多多指教,免费的评分和威望给一给.手动狗头滑稽
[Python] 纯文本查看 复制代码
# -*- coding: utf8 -*-
#coder:nianboy
#time:2022-7-14

import os
import re
import requests

import pandas as pd


class ChaoXingWork:
    def __init__(self, user, password):
        self.password = password
        self.user = user
        self.work_data_list = []
        self.class_lists = []
        self.headers = {
            "User-agent": "Mozilla/4.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
        }
        self.session = requests.session()

    def session_token(self):
        login_api = "https://passport2.chaoxing.com/api/login"
        params = {
            "name": self.user,  # 学习通账号
            "pwd": self.password,  # 学习通密码
            "verify": "0",
            "schoolid": "",
        }
        self.session.get(login_api, params=params, headers=self.headers)

    def class_list(self):
        class_url = "http://mooc2-ans.chaoxing.com/visit/courses/list?v=1652629452722&rss=1&start=0&size=500&catalogId=0&searchname="
        class_data = self.session.get(url=class_url, headers=self.headers).text.replace(' ', "")
        obj = re.compile(
            r'"color1" href="(?P<src>.*?)".*?break-all;" title="(?P<name>.*?)">.*?<i class="icon-news"></i>', re.S)
        result = obj.finditer(class_data)
        for cx in result:
            dict = {}
            dict['src'] = cx.group("src")
            dict['name'] = cx.group("name")
            self.class_lists.append(dict)

    def class_data(self):
        pf = pd.DataFrame(self.class_lists)
        pf.index = pf.index + 1
        del pf['src']
        data_dicts = {
            "name": "课程名称",
        }
        pf.rename(columns=data_dicts, inplace=True)
        print(pf)
        type = int(input("请输入课程序号:"))
        if type == 0:
            for j in self.class_lists:
                src = j['src']
                self.name = j['name']
                self.work_datas(src)

        else:
            src = (self.class_lists[int(type) - 1]["src"])
            self.name = (self.class_lists[int(type) - 1]["name"])
            self.work_datas(src)
        try:
            pf = pd.DataFrame(self.work_data_list)
            pf.index = pf.index + 1
            data_dicts = {
                "type" : "文件类型",
                "file_name": "文件名称",
            }
            pf.rename(columns=data_dicts, inplace=True)
            del pf['enc']
            print(pf)
        except:
            print(self.name+":该课程暂无作业可以下载!")




    def work_datas(self, src):
        if not os.path.exists(self.name):
            os.mkdir(self.name)
        class_res = self.session.get(url=src, headers=self.headers).text
        workurl = re.findall(r'title="作业" data-url="(.*?)">', class_res, re.S)[0]
        courseid = re.findall(r'name="courseid" value="(.*?)"/>', class_res, re.S)[0]
        classid = re.findall(r'name="clazzid" value="(.*?)"/>', class_res, re.S)[0]
        workenc = re.findall(r'name="workEnc" value="(.*?)">', class_res, re.S)[0]
        self.work_class_url = workurl + "?courseId=" + courseid + "&classId=" + classid + "&enc=" + workenc
        work_class_url_res = self.session.get(url=self.work_class_url, headers=self.headers).text
        if 'pageNum :' in work_class_url_res:
            pagenum = re.findall(r'pageNum : (.*?),',  work_class_url_res, re.S)[0]
            for i in range(1,int(pagenum)+1):
                self.work_class_urls = workurl + "?courseId=" + courseid + "&classId=" + classid + "&enc=" + workenc + "&pageNum=" + str(i)
                self.class_work_find()
        else:
            self.work_class_urls = workurl + "?courseId=" + courseid + "&classId=" + classid + "&enc=" + workenc + "&pageNum=1"
            self.class_work_find()

    def class_work_find(self):
        work_class_url_response = self.session.get(url=self.work_class_urls, headers=self.headers).text
        works_url = re.findall(r'<li(.*?)">', work_class_url_response, re.S)
        for j in works_url:
            page_text = self.session.get(url=j, headers=self.headers).text
            if "span data="" in page_text:
                obj = re.compile(
                    r'<h2 class="mark_title">(?P<name>.*?)</h2>.*?data="(?P<enc>.*?)" type="(?P<type>.*?)"',
                    re.S)
            else:
                obj = re.compile(
                    r'<h2 class="mark_title">(?P<name>.*?)</h2>.*?<p class="attachNew"><em style="font-style:normal; display:block;min-height:2px;"></em><span data="(?P<enc>.*?)" type="(?P<type>.*?)" name=".*?"',
                    re.S)
            class_result = obj.finditer(page_text)

            for j in class_result:
                if j.group("enc") == None:
                    print("该课程没有作业")
                else:
                    dict = {}
                    dict['enc'] = j.group("enc")
                    dict['type'] = j.group("type")
                    dict['file_name'] = (j.group("name") + "." + j.group("type")).replace(r"、", ".")
                    self.work_data_list.append(dict)

    def download_data(self):
        i = 0
        while i == 0:
            work_nums = int(input("输入0退出程序\n"
                                  "请输入你想下载文件的序号:"))
            if work_nums < 1:
                break
            else:
                work_enc = self.work_data_list[work_nums - 1]['enc']
                work_type = self.work_data_list[work_nums - 1]['type']
                work_name = self.work_data_list[work_nums - 1]['file_name']
                work_url = "https://mooc1.chaoxing.com/ueditorupload/read?objectId=" + work_enc
                headers = {
                    'Referer': self.work_class_url,
                    "User-agent": "Mozilla/4.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
                }
                if work_type == 'zip' or work_type == 'rar':
                    work_content = self.session.get(url=work_url, headers=headers, stream=True)
                else:
                    work_res = self.session.get(url=work_url, headers=self.headers).text
                    files_url = re.findall(r'<a class="btnDown" href="(.*?)"><span>', work_res)[0]
                    work_content = self.session.get(url=files_url, headers=headers, stream=True)
                work_path = "./" + self.name + "/" + work_name
                with open(work_path, 'wb') as f:
                    for chunk in work_content.iter_content(1024 * 1024 * 2):
                        f.write(chunk)
                print(work_name+"下载成功!")


if __name__ == "__main__":
    chaoxing = ChaoXingWork(user="学习通账号", password="学习通密码")

    chaoxing.session_token()
    chaoxing.class_list()
    chaoxing.class_data()
    chaoxing.download_data()

免费评分

参与人数 4吾爱币 +4 热心值 +4 收起 理由
lzl999 + 1 + 1 谢谢@Thanks!
lfm333 + 1 + 1 谢谢@Thanks!
haiyangnanzi + 1 + 1 谢谢@Thanks!
WDM799 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| nianboy 发表于 2022-9-23 01:12
HorseToo 发表于 2022-9-22 19:54
我测试了一下下载作业,没有作业的科目会提示没作业,但是有作业的科目为什么会闪退呢

啊哈,你有截图吗
zxsbk 发表于 2022-7-14 16:34
 楼主| nianboy 发表于 2022-9-19 18:39
HorseToo 发表于 2022-9-19 16:52
需要呀,我尝试自己装环境去运行,但是一直报错

「xxt」https://www.aliyundrive.com/s/R9WWRLb2og2 提取码: tg62
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。改了点小bug
 楼主| nianboy 发表于 2022-9-16 15:35
HorseToo 发表于 2022-9-15 23:35
兄弟,还能再分享一下嘛

啊哈,你还需要吗
zxsbk 发表于 2022-7-14 16:42
nianboy 发表于 2022-7-14 16:37
视频吗?没有试过耶,主要是二进制数据应该可以把,你看看你交的作业有没有视频格式的.

哦,我是说视频教程,超星有很多教程挺优秀的。
 楼主| nianboy 发表于 2022-7-14 23:08
ytlk0535 发表于 2022-7-14 21:18
这些代码复制到哪个软件里?不太懂这个

打包exe到阿里云盘了
「学习通作业下载」等文件 https://www.aliyundrive.com/s/PwGaXbJ3KjW
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
xfmiao 发表于 2022-7-14 16:36
感谢分享
 楼主| nianboy 发表于 2022-7-14 16:37
zxsbk 发表于 2022-7-14 16:34
超星视频能下载吗

视频吗?没有试过耶,主要是二进制数据应该可以把,你看看你交的作业有没有视频格式的.
iawyxkdn8 发表于 2022-7-14 16:52
作业我都不会,要这堆代码没用呀!
DeathLYH 发表于 2022-7-14 17:04
很有用,学习一个
深海老鱼 发表于 2022-7-14 17:30
谢谢楼主
csdyl0817 发表于 2022-7-14 18:15

感谢分享
loi1030 发表于 2022-7-14 18:21
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 23:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表