阅读本文需要 5.8 分钟。文章同步发于微信公众号 somenzz,欢迎订阅,使用Python打造效率工具。

时间是公平的,因为每个人的一分钟都是 60 秒;时间又是最不公平的,有人一年的收获顶得上别人十年,这取决于如何利用时间。

成年人的世界,一个字忙,忙得没有时间学习,没有时间健身,没有时间陪家人。其实解决忙这个问题很简单,那就是做减法,减去不必要的应酬、会议,减去不重要的事项,只保留那些重要的,有意义的,所谓永远只做那些重要不紧急的事情。另外节省时间的方法就是借助工具,提高效率。

这些年流行网络课程学习,在职人士尤其如此,有些课程,需要你花钱去用心学;有些课程,别人花了钱你也得学,什么学习积分,学习报表,积累学时等等,还与绩效、职称挂勾。后者大概率不许快进,这样就要花费时间点击播放,再点击再播放,直到看完完成任务。

如果你知道 Python,其实应对一些不得不看的在线课程,非常简单,可以写代码让它全部自动播放,最近就有个朋友让我帮助开发一个可以自动播放网课的工具,来缓解大量线上学习的压力,感觉这一过程应该有不少人需要,特些记录下来,可以帮助有同样需求的朋友。

如果对技术无感,想直接使用现成的工具,请稳步:https://t.zsxq.com/7yzF23R 如果手撸代码,请继续。

网站风格如下:

第一步:登陆。

登陆前,先打开开发者工具(Chrome浏览器的快捷键是F12),然后登陆,查看接口返回数据:

点击这个login的接口,查看详细信息如下:

这点重点记录四个信息:

1、请求的接口地址,即图中的 Request URL 及请求的方法。 2、Cookie 中的信息,这里是 JSESSIONID。 3、传递的参数和返回的接口数据。

根据这些信息,使用 requests 库自带的 session 功能很容易写出登陆的代码,并且可以获取此处的 JSESSIONID,可以大致推测出后续的请求也是使用该 JSESSIONID。

import requests

session = requests.Session()

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '

'(KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36',

'X-Requested-With': 'XMLHttpRequest',

}

def login():

params = {

'account': your_username,

'password': your_password,

}

r = session.post("http://jxjy.jxt.zj.gov.cn/iext/zg/webfront/user/loginByAccount.do", params=params,headers = headers)

jsessionid = session.cookies.get('JSESSIONID')

return jsessionid

第二步:获取信息。

登陆后, 获取到了 JSESSIONID。接下来,我们看到登陆后,还有一个接口,返回的是视频课程的列表,此接口使用的 JSESSIONID 和登陆是一致的,可以推断出 JSESSIONID 是后续接口请求的凭证,不过这个凭证是记录在 cookie 中的,requests 的 session 功能可以自带 cookie 请求,因此不需要单独处理。这里就是着重要分析的地方:

我们可以从这里获取课程的名称,持续时间,学习进度,编号等信息,有了这些信息,就可以为后续接口的请求提供参数了。方法有很多,正则表达式,BeautifulSoup,Selenium 喜欢哪个就用哪个吧,我这里使用 BeautifulSoup。参考代码如下:

def get_play_list_info():

video_list = []

for i in range(4):

params = {

'pageNum': i + 1,

'url': '/zgProject/front/learncenter/list'

}

r = session.get("http://jxjy.jxt.zj.gov.cn/iext/zg/webfront/DatumFrontController/infolist.do", params, headers )

soup = BeautifulSoup(r, "html.parser")

for el in soup.findAll("div", {'onclick': re.compile("skip(.*)")}):

video_name = el.find("div", {'class': 'clearfix'}).get('title')

function_name = el.get('onclick')

video_id = function_name.split(",")[0].split('(')[1].strip()

progress = el.find("span", {'class': 'baif'}).get_text()

durationTime = el.find("span", {'class': 'durationTime'}).get_text()

if progress != '已完成':

video_list.append({'video_name': video_name, 'video_id': video_id, 'progress': progress,

'durationTime': int(durationTime)})

logger.info(f"共 {len(video_list)} 个待播放的课程,将依次播放:")

for video in video_list:

logger.info(f"{video['video_name']},总时长:{video['durationTime']}秒")

return video_list

第三步:分析视频播放进度保存逻辑。

以上步骤,可以获取所有未完成的课程列表,包括名称、ID,持续时长,当前进度等信息。接下来,我们点击一个视频播放,然后看看接口处有什么信息:

这里我们发现请求的参数中有两个,一个是 time,值是 110,一个是 zgcid,可以猜测,time 是秒数,zgcid 是对应的是视频课程的编号。过一会时间,发现又发送了请求:

此时 time 为 226,发现间隔了约 120 秒钟,继续观察:

接口名称叫 saveplayrecord,很容易猜测到,每隔 120 秒发送向服务器一次这样的请求,就代表向服务汇报,我当前已经观看到了这个位置,当 time 为视频的总持续时长时,视频播放的状态会显示为已完成。

def play_video(video):

logger.info(f"{video['video_name']} 开始播放..." )

params = {

'url': '/zgProject/front/learncenter/videocast2',

'zgcid': video['video_id']

}

session.get("http://jxjy.jxt.zj.gov.cn/iext/zg/webfront/DatumFrontController/detail.do", params, headers)

percent = float(video['progress'].replace("已观看","").replace("%","").strip())

cnt = int(video['durationTime']*percent/100)

logger.info(f"当前进度:{percent:0.2f}%")

while cnt < video['durationTime']:

time.sleep(120)

cnt += 120

if cnt > video['durationTime']:

cnt = video['durationTime']

params = {'time':cnt, 'zgcid':video['video_id'] }

r = session.post("http://jxjy.jxt.zj.gov.cn/iext/zg/webfront/DatumFrontController/saveplayrecord.do", params,headers)

if r.json()['success'] == 1:

logger.info(f"播放进度为: {cnt*100/video['durationTime']:0.2f}%")

logger.info(f"{video['video_name']} 播放完成。" )

到这里,我们发现播放视频的过程中,每隔两分钟,网站会向服务器发送一次请求,保存当前视频的播放进度。此时已经豁然开朗。接下来就是组装代码的事情了。

用代码小结

login()

videos = get_play_list_info()

for video in videos:

play_video(video)

print("视频播放完毕")

爬虫的本质在于获取信息,获取信息的前提是知道信息发送和接收的方式,因此如果本文看不太懂的朋友,建义先花费 1 - 2 个小时看下 HTTP 协议,再学习下非常适合人类使用的 Python 第三方库 requests,之后再看此文,就十分简单。

(完)

python网站开发实例视频_Python实战-让在职教育类网站的视频全自动播放相关推荐

  1. Python实战-让在职教育类网站的视频全自动播放

    时间是公平的,因为每个人的一分钟都是 60 秒:时间又是最不公平的,有人一年的收获顶得上别人十年,这取决于如何利用时间. 成年人的世界,一个字忙,忙得没有时间学习,没有时间健身,没有时间陪家人.其实解 ...

  2. python项目开发实例书-Python项目开发实战

    本书案例具有实用性,如校园网搜索引擎.小小翻译器.抓取百度图片这些爬虫案例略加修改可以应用实际项目中:还有通过微信通信协议开发微信机器人,机器学习的文本分类.基于卷积神经网络的手写体识别等案例,另外是 ...

  3. Python爬虫开发从入门到实战

    Python爬虫开发从入门到实战(微课版) 第1章 绪论 爬虫的主要目的是获取网页内容并解析.只要能达到这个目的,用什么方法都没有问题. 关于获取网页,本书主要介绍了Python的两个第三方模块,一个 ...

  4. 01 如何学习Python Web开发从入门到实战

    Python Web开发从入门到实战 前言: Python Web是学校所学的课程,我希望在学习的同时通过写笔记的形式来记录我学习以及由学校学习转而自身对此方向感兴趣的一个过程,更多还是让自己在课程结 ...

  5. php实训ppt,PHP动态网站开发实例教程教学全套课件(刘万辉)配套资料 任务3:运用目录与文件实现投票统计.ppt...

    PHP动态网站开发实例教程教学全套课件(刘万辉)配套资料 任务3:运用目录与文件实现投票统计.ppt (18页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! ...

  6. php动态网站开发论文,浅谈《基于PHP的动态网站开发》课程的项目案例设计

    电子论文 浅谈<基于PHP的动态网站开发>课程的项目案例设计 时间:2020年05月25日 所属分类:电子论文 点击次数: [摘要]在教学资源建设中,案例设计建设是非常重要的资源之一.运用 ...

  7. 关于教育类网站的安全防护方案

    在教育类网站中,攻击者可利用恶意篡改.代码植入.DDoS大流量攻击.爬虫等方式,对高考查分网站.志愿填报网站.大学官网.在线教育网站进行攻击,导致教育类网站面临严峻安全挑战.小编将针对教育网站常见问题 ...

  8. 【高权重政府外链】利用高权重政府教育类网站发布外链提高网站收录权重

    今天分享一个提高网站收录权重的小方法,众所周知政府外链一般都有很高的权重,那么下面介绍下如何利用高权重政府教育类网站发布外链提高网站收录权重吧! 第1步:首先把要优化的词做成锚文本,这样可以方便第二步 ...

  9. python项目开发实例-《Python项目案例开发从入门到实战》PDF版百度网盘

    「教程分享:Python项目开发从入门到实列」 本书例子具有实用性,20个不同类型的完整列子,600分钟高品质配套教学视频,完整的源码和教学课件,让你对枯燥的Python语言学习充满乐趣. 编辑推荐 ...

最新文章

  1. 总结|机器视觉中三大坐标系及其相互关系
  2. 尾田荣一郎参与制作!两部《海贼王》VR游戏正在开发中
  3. char str[]与char *str的区别
  4. IOS 移除storyboard
  5. 理性教育~值得借鉴~
  6. c语言大数相乘的算法_MIT 算法导论(三)
  7. C++ pair类模板
  8. SpringCloud Hystrix微服务架构的高并发问题与解决策略
  9. centos8搭建glusterfs服务
  10. PHP项目异常类该如何设计,浅谈 PHP 中异常类的使用
  11. Tyche 2147 旅行
  12. 即时通讯IM的安全性比较
  13. c语言 电阻器的分类,电阻器的分类
  14. phpmyadmin 安装下载使用教程
  15. android实现微信付款功能,Android实现微信支付功能详解
  16. 法语学习笔记——语音
  17. Node.js详细下载与安装
  18. 2977 二叉堆练习1
  19. java打印代码执行耗时
  20. 三五好友,共同富有(生财日历2022)

热门文章

  1. 服务器控件的异步请求——UpdatePanel和ScriptManager
  2. 解决虚机中的Centos7连不上网
  3. 《研磨设计模式》chap11 代理proxy模式
  4. C++ Primer 5th笔记(chap 14 重载运算和类型转换)递增和递减运算符
  5. Kubernetes安全之认证
  6. python_面向对象进阶之slots
  7. System Control Processor Firmware简介
  8. 汽车开放系统架构(AUTOSAR)简介
  9. 查看mysql 内核_如何查看和更新数据库内核小版本
  10. MoeCTF 2021Re部分------PE