Python 云端学习

96
somenzz Excellent
1.0 2018.12.23 21:26 字数 2207

由于关注我个人公众号的朋友大部分都是身边的同事,今天特分享一个福利作为感谢,可以自动帮你完成一些网站上的重复点击操作,比如,我用它在一天之内就学完了云端学习16个学分的学习任务,可以说是节省时间的利器了。当然了,其他读者朋友如有需求,可以按照下文的方法修改代码来满足自己的需求。

有不少单位每个季度都要求有学习任务,就是指定一个课程网站,自己登陆进去观看相应的视频课程,不能快进,学完后再做课程评估,有的还要求做题目(单选、多选、判断),每学完一节课程会获得相应的学分,学分达到一定的分数才可以结业。有没有感觉像上大学的感觉。

但是问题来了,要求在业余时间学习,不能占用上班时间,其实这还能接受。不能接受的是这其些课程对个人的工作或者发展完全没有用处,或者说就是浪费时间,有过这种体验的朋友肯定知道个中滋味。

不想浪费时间,但又不得不学,怎么办?

  • 方法一:老老实实的,按步就班地学习完。可以说,使用这些方法的人在学校那肯定是学霸级别的,执行力度特别到位,只要是学习就不算浪费时间。

  • 方法二:点开视频,然后干其他事情,等视频结束,网上找点答案一做完事,大部分人在学校学习时也是这种状态,这种方法也就浪费点时间,其他没什么,也许有些时间就应该浪费。

  • 方法三:自己不想做的事情,就花钱让别人做,省时省力。现在淘宝网还真有这样的服务,也是抓住需求赚了一把。这种做事风格在校可能是学渣级的,但这种思维我是很欣赏的,花钱能解决的问题,都不是问题。不过看价格(一个学分2元),我相信他们也是使用爬虫来做的,人力成本不会这么便宜。

  • 方法四:做为一个技术宅和 Python 爱好者,怎么能自己动手做一些重复的事情呢,写个 Python 程序来释放你疲劳的右手

方法四就是今天我要分享给你的内容,感兴趣的不妨撸起袖子试一试,不感兴趣的,我可以帮你搞定,赏一杯咖啡钱就行,_

本方法所需要的软件包和源码全部打包已放在百度网盘内,公众号后台回复【云端学习】获取下载链接,不需要再额外下载其他软件。

需要具备的知识:

  • 会使用 windows 电脑
  • 如果要修改源码,请简单学习下 Python 基础和 selenium 库的用法即可,很简单,有问题可以联系我。

原理

你可以理解为它是一个灵活的按键精灵。就是使用 Python 模拟人来点击浏览器中的网页,自动登陆,点击,观看完视频后自动完成课程评估,自动播放下一节视频。当然,有些测试题目的还是需要自己做的,还没那么智能,不过都非常简单,很快就能做完。

对 url 的操作,如发送请求,点击链接,获取数据等等,这就是爬虫技术。爬虫没有那么高深的知识,只要懂 http,https 协议,再会使用一些工具就够了。每个语言其实都有自己的爬虫框架,要了解这些框架的适用场景,找一两个容易上手的就可以了。

本程序主要使用 Python 的浏览器自动化与仿真工具 - selenium,它可以自动化真正的浏览器(Chrome浏览器,火狐浏览器,Opera浏览器,IE浏览器),运行时,你可以看到浏览器的页面上的点击动作,就像有人在点击一样。

这里以 chrome 浏览器为例,因为它可以非常方便的提取页面元素的 xpath。也非常方便调试。

操作步骤

一步一步来,很简单的。

第一步:安装 Python 及 chrome 浏览器

如果电脑上已安装 Python3 和 chrome 浏览器可以跳过本步骤。没有安装的可以通过官网链接 https://www.python.org/ftp/python/3.7.1/python-3.7.1-amd64.exe 下载安装 Python3,这里是 64 位,如果你的电脑系统是 32 位请安装 https://www.python.org/ftp/python/3.7.1/python-3.7.1.exe。安装时注意勾选把 Python 添加到 PATH 环境变量中。其他全部默认即可。

chrome 浏览器的安装包在网络上也很容易找到,怕你找不到好资源或者下载速度太慢,这些安装包我都放在百度网盘里了,省事的可以下载如下图这两个文件安装即可。

Python和Chrome浏览器的安装

ChromeInstaller_71.0.3578.98.rar 解压后运行 install.exe 即可安装。

第二步:安装 selenium 及 chromedriver

1、安装 selenium
同时按键盘上的 windows 键和 R 键,输入 cmd 并回车,如下图所示:


image.png

回车后你会看到一个命令窗口,键入 python 并回车,如果有以下图中的显示说明 Python 安装成功,再 >>> 后键入 quit() 退出 Python 解释器环境,然后输入 pip install selenium 即可完成安装,下图的提示表明我已经安装了,不需要再次安装了。


安装selenium

2、保存网盘中的 chromedirvier.exe 到一个位置即可

这是软件已经在网盘里了,是可执行文件,直接使用即可,无需安装,找一个位置放下,可以简单地和源码 e-learning.py 放在一个目录下,源码 e-learning.py 会调用 chromedirvier.exe 来控制 Chrome 浏览器,网盘里的 chromedirver 和网盘里的 chrome 浏览器版本是对应的,如果后面因为版本不一致出现兼容问题,可以去这里下载对应版本的 chromedirver。

http://npm.taobao.org/mirrors/chromedriver/

一些老版本对应如下表所示:

chromedriver版本 支持的Chrome版本
v2.33 v60-62
v2.32 v59-61
v2.31 v58-60
v2.30 v58-60
v2.29 v56-58
v2.28 v55-57
v2.27 v54-56
v2.26 v53-55
v2.25 v53-55
v2.24 v52-54
v2.23 v51-53
v2.22 v49-52
v2.21 v46-50
v2.20 v43-48
v2.19 v43-47
v2.18 v43-46
v2.17 v42-43
v2.13 v42-45
v2.15 v40-43
v2.14 v39-42
v2.13 v38-41
v2.12 v36-40
v2.11 v36-40
v2.10 v33-36
v2.9 v31-34
v2.8 v30-33
v2.7 v30-33
v2.6 v29-32
v2.5 v29-32
v2.4 v29-32

第三步:运行 e-learning.py

运行之前注意先修改 chromedirver.exe 的路径和自己的用户名和密码,如下所示:

# -*- coding: utf-8 -*-
import time
import re
from selenium import webdriver

#设置chromedriver的存放位置
driver = webdriver.Chrome(executable_path=r'E:\GitHub\python\pachong\tools\chromedriver.exe')
driver.get("http://e-learning.jsnx.net")

#防止有人的网络特别慢,每步的间隔均设置 5 秒,以便稳定,如果某步报错了可适当增加延时
time.sleep(5)
##这里改成你的用户名,一般为身份证号 
driver.find_element_by_xpath('//*[@id="loginName"]').send_keys('#你的用户名#')
##这里改成你的密码,一般为身份证号 
driver.find_element_by_xpath('//*[@id="password"]').send_keys('#你的密码#')
driver.find_element_by_xpath('//*[@id="form-login"]/div/div[3]/input').click()
time.sleep(5)

如何获取xpath

说下这里如何使用 chrome 浏览器来获取 xpath,以网址 http://e-learning.jsnx.net 为例,在 chrome 浏览器中打开后按F12,打开开发人员工具窗口,如下图所示:

xpath获取方法

如上图所示,先点击鼠标箭头样式的图标,再点击要查看xpath的元素,视角会自动切换到如下图所示的元素代码上

xpath获取方法

在html代码上右键单击,会出现 copy 菜单,在 copy 菜单的弹出项中选择 copy xpath 即可。

运行方式: 进入 e-learning.py 所在的目录,SHIFT + 鼠标右键选择 【在此处打开Powershell窗口】 或 【在此处打开命令窗口】,在命令窗口中
输入

python e-learning.py

即可执行本程序来为你自动学习了,在播放的过程中,第一次播放需要启用 chrome 浏览器的 flash player 功能,如下图所示,只需要点击一次就可以了,后面的播放过程中无需人工干预,当然了,题目还是需要自己做一下的,课程评估不需要。

启用flash

运行过程中命令窗口的打印截图如下所示:

信息输出

为防止有人的网络特别慢,每步的间隔最小设置 5 秒,以便稳定,如果你的网络快,可设置 2 秒,但是几乎不影响看视频的效率。循环观看视频的代码如下所示:

while True:
    print("#直接进入学习地图")
    driver.get('http://e-learning.jsnx.net/els/html/index.parser.do?id=0007')
    time.sleep(5)
    print("#进入课程列表")
    driver.find_element_by_xpath('//*[@id="trackList"]/ul/li[1]/div[2]/div[3]/a').click()
    time.sleep(5)

    ##查找未学的课程的 id 保存至变量 corses 列表中
    regex = re.compile('<a href="#" id="(.*)" title=.*class="innercan goCourseByStudy"') 
    corses = re.findall(regex,driver.page_source)
    if corses == []:  break ##说明没有待学的课程,已全部学完,直接退出循环

    print("#将学习的课程ID为",corses[0])
    xpath = f'//*[@id="{corses[0]}"]' 

    ##循环点击待学习的课程
    ##注意第一次播放时需要启用一下 Flash player,根据浏览器提示右键点击一下即可启用,只需要处理一次即可。
    driver.find_element_by_xpath(xpath).click()
    print("开始播放")

    handles = driver.window_handles
    
    time.sleep(1)
    ##切换浏览器标签页
    for handle in handles:
        if driver.current_window_handle != handle:
            driver.switch_to.window(handle)
            break

    ##最低观看60s 后检查是否可以进行课程评估
    time.sleep(60)

    while True:
        #循环判断是否出现[进入下一步】按钮,如有说明视频已经看完,可以进行课程评估
        try:
            driver.find_element_by_xpath('//*[@id="goNextStep"]/a').click()
            time.sleep(5)
            break
        except:
            pass
        time.sleep(30)
        
    try:
        ##开始进行课程评估
        time.sleep(2)
        driver.find_element_by_xpath(u"(.//*[normalize-space(text()) and normalize-space(.)='★'])[3]/following::input[1]").click()
        time.sleep(2)
        driver.find_element_by_xpath("(.//*[normalize-space(text()) and normalize-space(.)='B'])[1]/following::span[1]").click()
        time.sleep(2)
        driver.find_element_by_xpath("(.//*[normalize-space(text()) and normalize-space(.)='B'])[2]/following::span[1]").click()
        time.sleep(2)
        driver.find_element_by_xpath("(.//*[normalize-space(text()) and normalize-space(.)='B'])[3]/following::span[1]").click()
        time.sleep(2)
        driver.find_element_by_xpath("(.//*[normalize-space(text()) and normalize-space(.)='B'])[4]/following::span[1]").click()
        time.sleep(2)
        driver.find_element_by_id("courseEvaluateSubmit").click()
        time.sleep(2)
        driver.find_element_by_link_text(u"确定").click()
        time.sleep(2)
        driver.find_element_by_link_text(u"查看结果").click()
        time.sleep(2)
        print("已提交课程评估")
    except:
        pass
    
    ##切换浏览器标签页
    for handle in handles:
        if driver.current_window_handle != handle:
            driver.switch_to.window(handle)
            break
##退出浏览器
driver.quit()

注释已经非常详细了,欢迎网盘下载 e-learning.py 试用。
(完)

关注公众号 somenzz 获取源码。

个人微信公众号
日记本
Gupao