Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[Python] 超星学习通作业批量下载

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

作者头像
纯情
发布于 2023-04-27 01:55:08
发布于 2023-04-27 01:55:08
36704
代码可运行
举报
文章被收录于专栏:纯情博客纯情博客
运行总次数:4
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- 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()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python爬虫实例
参考: https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#find-all
cuijianzhe
2022/06/14
5880
python爬虫实例
教大家爬取喜马拉雅全站音频数据,探秘喜马拉雅的天籁之音
喜马拉雅FM是一个知名的音频分享平台,在移动音频行业的市场占有率已达73%,用户规模突破4.8亿,今天我们就带大家突破层层障碍,探秘喜马拉雅的天籁之音,实现实时抓捕并保存到本地。
润森
2022/08/18
5.6K0
教大家爬取喜马拉雅全站音频数据,探秘喜马拉雅的天籁之音
老司机教你用Python下载热门小说
说起来Python,你能想到的是什么呢?大数据?Django?小程序?人工智能?爬虫?等等等等 Python作为一门入门简单适合于大众的编程语言,小至小学生,大至大学生,都在学习Python的编程知识,今天博主就给大家带来一篇关于Python的好玩例子---使用Python爬虫下载小说 需求分析 所谓爬虫,就是取模拟Http请求,然后将返回回来的页面数据进行处理分析,拿到我们想要的内容;今天带大家爬的是一家比较良心的小说网站--- https://www.dingdiann.com/,这个网站通过博主实测,
tyrantlucifer
2022/03/23
5610
老司机教你用Python下载热门小说
从无到有的“糗事百科”分析
从简单的爬取数据到可视化分析,不仅实践中掌握发现学习Python的乐趣与价值,也在过程中掌握 数据获取,数据清新,数据可视化的整个流程。可谓是“麻雀虽小,五脏俱全“ 。
herain
2022/04/27
3710
从无到有的“糗事百科”分析
【爬虫】糗事百科信息爬取
import requests import re headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36' } info_lists = [] def judgment_sex(class_name): if class_name == 'womenIcon':
天道Vax的时间宝藏
2021/08/11
3430
爬虫之旅1-入门及案例
HTTP + SSL;其中SSL指的是安全套接字层,传输数据之前先进行加密,之后解密再获取内容 效率低,但是安全
皮大大
2021/03/02
4880
这次给大家带来复杂点的ajax请求该如何破?
公众号由于私人原因差不多一个月没有更新了,首先还是得感谢没有你们,没有取关我,很开心。其次我会在以下的两个月时间为大家输出高质量的文章,让你们能学到东西的同时,也可以让我自己得到提升。好了,闲话不多说,开始正文!
sergiojune
2018/07/25
9380
这次给大家带来复杂点的ajax请求该如何破?
关于python正则表达式场景收集(三)
本期收录正则表达式场景包括HTML解析和CSV解析,主要是匹配()中的内容,当然例子比较简单,复杂的类似css、class等解析建议还是通过专业的html解析包来解决。
python与大数据分析
2022/03/11
2160
Python爬虫之模拟登录拉勾网
模拟登录想必大家已经熟悉了,之前也分享过关于模拟登录wechat和京东的实战,链接如下:
Python数据科学
2018/08/06
1.1K0
Python爬虫之模拟登录拉勾网
我又开发了个批量下载工具
单篇文章神雕侠侣,绝迹江湖!金庸经典武侠《神雕侠侣》大结局 的视频可以用idm下载。
苏生不惑
2022/04/11
9480
我又开发了个批量下载工具
一不小心,我爬取了100万条微博评论
↑ 关注 + 星标 ~ 有趣的不像个技术号 每晚九点,我们准时相约 郑重声明:本项目及所有相关文章,仅用于经验技术交流,禁止将相关技术应用到不正当途径,因为滥用技术产生的风险与本人无关 大家好
朱小五
2020/03/10
1.4K0
一不小心,我爬取了100万条微博评论
Python爬虫,批量下载小说网站上的小说
Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及相关电子版书籍,欢迎前来领取!
python学习教程
2019/07/23
3.3K0
爬虫案例
一、壁纸网站 # coding=utf-8 """ 作者:gaojs 功能: 新增功能: 日期:2022/3/25 19:35 """ import os.path import requests import parsel def get_address(): """ 获取url地址 :return: """ dirname = 'photo/' if not os.path.exists(dirname):
懿曲折扇情
2022/08/24
1.1K0
19.SimLogin_case03
# 模拟登录GitHub import requests from lxml import etree class Login(): def __init__(self): self.headers = { 'Referer': 'https://github.com/', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, li
hankleo
2020/09/17
2570
Python网络——Urllib&Requests
Urllib 库,它是 Python 内置的 HTTP 请求库.不需要额外安装即可使用,在 Python中,有 Urllib 和 Urlib2 两个库可以用来实现Request的发送。而在 Python3 中,已经 没有Urllib2 ,统一为 Urllib
羊羽shine
2019/05/28
4410
Python第四个项目:爬取简书任意一篇文章里所有图片(通用)
代码如下: # _*_coding:utf-8_*_ from urllib.parse import urljoin import requests import re import os class GetImage(object): def __init__(self, url): self.url = url self.headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Wi
王小婷
2019/08/14
5510
蓝墨云班课资源下载不了_蓝墨云班课老师怎么用
看见有人详细讲解了下载文件的原理,在这里我就不赘述了,直接上写好的代码。可能乱了点。 有一点要提前说一下,做这个的时候,我想着只下载没有获得经验的文件。已经获得过经验的文件因为我用不到,所以就不用下,当然,改一下代码的话获得过经验的也能下。相关的代码在download_sours函数里面,jy表示的是经验,jy=N代表没获得经验的文件,改一下就行,去掉这个判断条件就能下载已经获得经验的资源了。
全栈程序员站长
2022/11/15
1.5K0
python批量化提交100+shell
前段时间,在写批量化挖掘的脚本,现在已经收工了,大概也就100+shell左右,用来练手的其余sql注入,未授权都交给公益src了。
红队蓝军
2024/08/20
1920
python批量化提交100+shell
苹果表主题图片爬取!
一个设计佬要的,外网苹果表主题图片,说是要参(抄)考(袭)用,搜集作为灵感图库而使用的素材,如果一张张点保存得什么时候,直接Python大法好,Python苹果表主题图片爬取过程。
二爷
2022/04/27
2510
苹果表主题图片爬取!
Python第二个项目:爬取一个网站的所有图片
前面搭建爬虫环境完成第一个实例爬取信息,今天继续,Python第二个项目:爬取一个网站的所有图片,看到一个网站的图片,想要弄到本地,一张张保存太过于麻烦,于是,往下看:
王小婷
2019/08/09
1.9K0
Python第二个项目:爬取一个网站的所有图片
相关推荐
python爬虫实例
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验