爬取学习通2024.3.29

本文讲述了如何通过Python代码解决学习通网站的反爬机制,利用BeautifulSoup和正则表达式抓取课程名和图片链接,以及通过模拟登录获取受限资源的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进入自己的学习通网站主页检查网络

53b499ac1a094397b5d337faff839ea1.png

可以发现只有courselistdata响应信息由我们想要的东西

2fe3aa690ed048d199914c6d0b65023a.png

该请求url我用模拟登录+cookie试了下,应该是有反爬机制,响应是403 9772fa7b8e8c4efc8466f5a3f405fe40.png

所以我把courselistdata的响应信息全部手动复制并保存为本地txt文件和html文件

可以发现课程名的样式是span标签加上class='course-name overHidden2',所以只要抓取指定样式的内容就行了

 16b8a47ac23b4ef1b5a68b808b07db90.png

98ea4381b87a4e4483ca86ec8a8e9e1b.png

开始写代码

from bs4 import BeautifulSoup

# 读取 HTML 文件
with open('result.html', 'r', encoding='utf-8') as file:
    html_content = file.read()

# 使用 BeautifulSoup 解析页面内容
soup = BeautifulSoup(html_content, 'html.parser')

# 查找所有指定样式的内容
course_names = soup.find_all('span', class_='course-name overHidden2')

# 保存内容到TXT文档
with open('course_names.txt', 'w', encoding='utf-8') as file:
    for course_name in course_names:
        file.write(course_name.text + '\n')

print('内容已成功保存到 course_names.txt 文件中')

代码最终是保存在一个txt文档里的,下面是结果

294c12bb69ac46aba80b14b1f582c923.png

 同理,可以发现课程图片的链接都是以src开头+http://.....的形式的,所以使用正则表达式获取所有的图片链接并保存在img文件夹内

# import re
# import requests
#
# # 读取文本文件内容
# with open("result.txt", mode="r", encoding="UTF-8") as f:
#     text = f.read()
#
# # 使用正则表达式查找所有图片链接
# result = re.findall(r'<img.*?src="(http.*?)".*?>', text)
# print(result)
# # 创建一个 Session 对象
# session = requests.Session()
# # 添加请求头信息
# session.headers = {
#     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0",
#     "Cookie": 'fid=18743; lv=1;_uid=236979880; UID=236979880;vc=137C52E726857E8F909BE63816932583;xxtenc=ddbc37dc960f59c4e4d80e7d212577c5; uf=b2d2c93beefa90dc62d0140d27586032be363a80c34379c8d55b182f4be7c0cdea1bb3571a26a1eb6edce3182980a667273683571faa0dcd88b83130e7eb4704a07401fce4235b32ce915f659a7402a8eea6be31981211d2c73072b75b8ec48b996adb45563782ea; _d=1711287844321; vc2=64BBB1352F74F266EA1110742827E42B; vc3=DiLAK%2FjtrTE2cmk6mArbULln8pJr%2BfA3UDzlOrNN%2Fc2cZAub5Cto8BI4SdxzMHme99F6R6DDq6cVxLPZnVXv6MDqnS25i82UVemY6g0PgxxV9Vn7197SiPLmlOAp5Nb0yPy9oPWrRoPHa95pUy91RReKj8RMqqF%2FVc5CKByXQ%2Bw%3Df84771ac7a8f04a131bbb08a9a5693f5; cx_p_token=2e9d9f80ee244828a78c88adb75b8286; p_auth_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiIyMzY5Nzk4ODAiLCJsb2dpblRpbWUiOjE3MTEyODc4NDQzMjMsImV4cCI6MTcxMTg5MjY0NH0.zbdW33Q-ypoJUryCOWOOy-aA1LrQC0ApZXT8gsCjJUY; DSSTASH_LOG=C_38-UN_755-US_236979880-T_1711287844323; tl=1; orgfid=31057; registerCode=00010013000100010034; createSiteSource=num9; source=num9; wfwEnc=7BE3D5CDD9642876BB1DCA0A31350E89; spaceFid=18743; spaceRoleId=''; k8s=1711633502.83.442.232697; route=2fe558bdb0a1aea656e6ca70ad0cad20; _industry=5; jrose=4FC9840C52C3D251E1C3A988291A2346.mooc2-387400510-8w2l6'# 这里省略了 Cookie 的部分内容
# }
#
#
# # 下载所有图片
# for idx, img_url in enumerate(result):
#     filename = f"image_{idx}.jpg"
#     response = requests.get(img_url)
#     if response.status_code == 200:
#         with open(filename, 'wb') as img_file:
#             img_file.write(response.content)
#         print(f"图片 {idx} 下载成功")
#     else:
#         print(f"图片 {idx} 下载失败,状态码:{response.status_code}")

上面的代码是有问题的,请求下载图片会被拒绝,因为图片的网址是在学习通账号内部的

所以需要增加模拟登录来骗过浏览器(登录信息结合自己的帐号来)

import re
import requests
import base64
import os
# 读取文本文件内容
with open("result.txt", mode="r", encoding="UTF-8") as f:
    text = f.read()
# 使用正则表达式查找所有图片链接
result = re.findall(r'<img.*?src="(http.*?)".*?>', text)
print(result)
# 创建一个 Session 对象
session = requests.Session()
# 设置登录信息
username = "手机号"
password = "密码"
login_info = f"{username}:{password}"
base64_login_info = base64.b64encode(login_info.encode()).decode()
session.headers["Authorization"] = f"Basic {base64_login_info}"
# 添加请求头信息
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0",
    "Cookie": 'fid=18743; lv=1;_uid=236979880; UID=236979880;vc=137C52E726857E8F909BE63816932583;xxtenc=ddbc37dc960f59c4e4d80e7d212577c5; uf=b2d2c93beefa90dc62d0140d27586032be363a80c34379c8d55b182f4be7c0cdea1bb3571a26a1eb6edce3182980a667273683571faa0dcd88b83130e7eb4704a07401fce4235b32ce915f659a7402a8eea6be31981211d2c73072b75b8ec48b996adb45563782ea; _d=1711287844321; vc2=64BBB1352F74F266EA1110742827E42B; vc3=DiLAK%2FjtrTE2cmk6mArbULln8pJr%2BfA3UDzlOrNN%2Fc2cZAub5Cto8BI4SdxzMHme99F6R6DDq6cVxLPZnVXv6MDqnS25i82UVemY6g0PgxxV9Vn7197SiPLmlOAp5Nb0yPy9oPWrRoPHa95pUy91RReKj8RMqqF%2FVc5CKByXQ%2Bw%3Df84771ac7a8f04a131bbb08a9a5693f5; cx_p_token=2e9d9f80ee244828a78c88adb75b8286; p_auth_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiIyMzY5Nzk4ODAiLCJsb2dpblRpbWUiOjE3MTEyODc4NDQzMjMsImV4cCI6MTcxMTg5MjY0NH0.zbdW33Q-ypoJUryCOWOOy-aA1LrQC0ApZXT8gsCjJUY; DSSTASH_LOG=C_38-UN_755-US_236979880-T_1711287844323; tl=1; orgfid=31057; registerCode=00010013000100010034; createSiteSource=num9; source=num9; wfwEnc=7BE3D5CDD9642876BB1DCA0A31350E89; spaceFid=18743; spaceRoleId=''; k8s=1711633502.83.442.232697; route=2fe558bdb0a1aea656e6ca70ad0cad20; _industry=5; jrose=4FC9840C52C3D251E1C3A988291A2346.mooc2-387400510-8w2l6'# 这里省略了 Cookie 的部分内容
})
# 创建 img 文件夹
if not os.path.exists("img"):
    os.makedirs("img")
# 下载所有图片
for idx, img_url in enumerate(result):
    filename = f"img/image_{idx}.jpg"  # 保存在 img 文件夹下
    response = session.get(img_url)
    if response.status_code == 200:
        with open(filename, 'wb') as img_file:
            img_file.write(response.content)
        print(f"图片 {idx} 下载成功")
    else:
        print(f"图片 {idx} 下载失败,状态码:{response.status_code}")

最终可以爬到56们课程图片,结果如下 

 a473e0f17de64a12822139e2bac4fda4.png

结束! 

 

 

 

 

<think>好的,我现在需要帮用户了解如何编写学习通刷课脚本。首先,用户可能对编程有一定的基础,但可能不太清楚具体的实现步骤。我需要分步骤解释,确保他们能理解每个环节。 首先,得明确学习通是什么平台,它的刷课脚本主要用来自动观看课程视频、完成测验等。接下来,用户可能需要知道实现的基本原理,比如自动化操作。常见的工具可能是Python,因为有很多库支持,比如Selenium。不过,用户可能也会关心其他方法,比如浏览器插件或者模拟请求。 然后,我需要考虑用户的需求。刷课脚本的主要功能可能包括自动登录、跳转到课程页面、播放视频、处理测验题目、模拟观看时间等。每个功能都需要详细说明,但也要注意避免鼓励不正当使用,所以得在回答中提到法律和道德问题,提醒用户遵守平台规则。 接下来,技术实现部分。用Python的话,Selenium可以模拟浏览器操作,比如打开网页、输入账号密码、点击按钮等。可能需要解释一下如何安装Selenium和对应的WebDriver。例如,安装命令是pip install selenium,然后下载对应浏览器的驱动,比如ChromeDriver。 然后,分步骤讲解脚本的大致结构。首先自动登录,找到用户名和密码的输入框,填充信息并提交。然后跳转到课程页面,可能需要解析页面结构,找到课程链接。接着处理视频播放,找到视频元素,触发播放,并模拟等待时间,防止被检测到。如果是测验,可能需要自动选择答案,这里可能涉及到解析题目和答案,但这一步比较复杂,可能简单带过。 另外,需要考虑反反爬虫机制。学习通可能有检测自动化脚本的措施,比如检测鼠标移动、请求频率等。可能需要加入随机等待时间,或者使用headless模式,但headless也可能被识别。这部分可能需要更高级的技巧,比如修改浏览器指纹,但难度较大,用户可能只需要基础方法。 然后,用户可能需要代码示例。给出一个简单的示例,展示如何使用Selenium登录和播放视频。但要注意代码只是示例,不鼓励实际使用。同时提醒用户,学习通可能会更新页面结构,导致脚本失效,需要维护。 还要提到其他方法,比如使用浏览器插件如Tampermonkey编写用户脚本,或者直接发送HTTP请求模拟操作。后者更高效,但需要分析网络请求,找到API接口,处理认证参数等,对新手来说可能较难。 最后,强调法律和道德问题,刷课违反平台规定,可能被封号,甚至影响学业。建议用户正当使用,按时完成课程。 总结整个思考过程,需要结构清晰,分步骤讲解实现方法,提供示例但附加警告,确保用户明白风险。同时,语言要简洁,避免技术术语过多,让不同基础的用户都能理解。</think>编写学习通刷课脚本涉及技术实现与伦理问题,以下从技术角度进行客观分析,同时强调遵守平台规则的重要性。 --- ### 一、基本原理 脚本通过模拟用户操作实现自动化任务,例如: - **登录验证**:自动填充账号密码 - **课程跳转**:解析网页结构定位课程链接 - **视频播放**:触发播放并模拟观看时间 - **测验处理**:自动选择答案(需解析题目) --- ### 二、技术实现步骤(Python示例) #### 1. 环境准备 ```python pip install selenium webdriver-manager ``` #### 2. 基础脚本框架 ```python from selenium import webdriver from selenium.webdriver.common.by import By import time # 初始化浏览器 driver = webdriver.Chrome() driver.get("https://passport.chaoxing.com/") # 自动登录 driver.find_element(By.ID, "username").send_keys("你的账号") driver.find_element(By.ID, "password").send_keys("你的密码") driver.find_element(By.CLASS_NAME, "loginBtn").click() time.sleep(3) # 跳转到课程页面 driver.get("https://mooc1.chaoxing.com/visit/courses") time.sleep(5) ``` --- ### 三、关键技术点 1. **元素定位** 使用XPath/CSS选择器定位播放按钮: ```python video_element = driver.find_element(By.XPATH, &#39;//div[@class="video-icon"]&#39;) video_element.click() ``` 2. **时间模拟** 添加随机等待避免检测: ```python import random time.sleep(random.randint(5, 15)) ``` 3. **反爬应对** - 使用`headless`无头模式 - 修改`User-Agent`请求头 - 限制操作频率 --- ### 四、其他实现方式 1. **浏览器插件方案** 使用Tampermonkey编写用户脚本,通过DOM操作控制页面元素。 2. **协议级模拟** 直接调用学习通API接口(需逆向分析网络请求),例如: ```python import requests requests.post("https://api.chaoxing.com/video/heartbeat", data={ "courseId": "123", "videoDuration": "600", "currentTime": "600" }) ``` --- ### 五、风险与注意事项 1. **技术风险** - 页面结构频繁变动导致脚本失效 - IP被封禁或账号异常检测 2. **合规性问题** - 违反《学习通用户协议》第4.3条 - 可能触发学业诚信问题 3. **替代建议** - 使用平台提供的「倍速播放」合法功能 - 制定学习计划合理分配时间 --- 请严格遵守学校与平台规定,技术探索应限于合法合规场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AAA阿魏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值