利用python完成大学刷课(从0到完成的思路)

时间:2022-11-01 19:31:06

i春秋作家:tllm

原文来自:利用python完成大学刷课(从0到完成的思路)

最近刚刚开学,学校总是有很多让人无语的课要修,还不能不修。然后我想写一个自动修课的脚本。大佬们不要笑我 是边面向百度学selenium边写脚本的 然后踩了一些坑 记录一下

先放最终效果视频

PS:室友在打lol说看见中单 不是说我哈 哈哈哈哈 
http://ow2cltt3t.bkt.clouddn.com/15d3ed600eb39af4d80c4a49088b5c06.mp4

0x01:

首先分析一下它是怎么验证你看完这个课的。利用python完成大学刷课(从0到完成的思路)当学习完成时会发出这个请求利用python完成大学刷课(从0到完成的思路)然后看看这几个请求的数据都是在前端哪里生成的利用python完成大学刷课(从0到完成的思路)一番寻找就看到了是wx.js下的function finishWxCourse()  。控制台执行 finishWxCourse() 果然会发起完成修课的请求利用python完成大学刷课(从0到完成的思路)

0x02:

然后剩下就是脚本的思路 首先要获取课程的链接 然后打开以后执行js  finishWxCourse() 后来发现requests不是很好的能执行js 然后我就听从了几个师傅的意见用selenium...所以是边学边写的 遇到了几个小坑记一记

安装不表 网上很多教程 chromedriver装在环境变量里面就好了 比如python的环境变量 如果遇到问题可以留言评论

先说一下 代码最终的整体思路是 打开网站----设置cookie----然后通过点击打开所有的隐藏元素-----定位点击----后退---------------点击打开所有的隐藏元素-------定位点击----------后退..然后重复之前的步骤

这是简单的启动浏览器和发起请求

        driver = webdriver.Chrome("C:/Python27/chromedriver.exe")
        driver.get("http://wb.mycourse.cn/")

删除所有的cookie并设置cookie。我是手动登陆然后再添加    有一个要记住的就是先要请求一次网页 才能设置cookie 再请求网页

driver.add_cookie({'name':'JSESSIONID','value':'93BEC0FDEF428F98DA1F69A6B3C2BF88'})  #已经过期的了 师傅们
driver.add_cookie({'name':'acw_tc','value':'7b39758715392684428742395e7ed4b94ed4e9616cb11d4b9df9e244ec7573'})        
driver.add_cookie({'name':'SERVERID','value':'02cc313090e3650844ab417ac43bf774|1539357767|1539357719'})
driver.get("http://wb.mycourse.cn/svnweiban/student/study_studyAndTest.action")

接着就是定位元素了 首先要看到我们要点击的课程链接

利用python完成大学刷课(从0到完成的思路)

看到class属性 有一个坑就是这里多个class属性 不能直接多个class一起定位 不然会找到 如果全部一起定位要用css寻找并且用.来链接 然后我这里用的是 courseLink定位 这个名字也很明显是做什么的。然后我也发现是98个课程都能定位到  前面几个class能定位到1000多个

link2s = driver.find_elements_by_class_name("courseLink")

我原本就很开心的以为差不多做完了准备写出一个这样子的代码

        for i in range(99):
                link2s = driver.find_elements_by_class_name("courseText")
                link2s[i].click()
                driver.execute_script("finishWxCourse()")

但是结果发现无法获取到元素 什么鬼 然后一直报错···苦苦百度以后发现···原来是没有展开元素 是diplay:none。 隐藏了 然后我百度以后找到的方法一直是 通过执行js把none改为block结果发现不好定位啊

利用python完成大学刷课(从0到完成的思路)

<div class="widthPercent100 paddingL_30 border-box displayNone" style="transition: all 0.5s ease 0s; display: none;">

class属性都是不唯一的 然后很蛋疼 后来师傅推荐说通过xpath定位 可是好多个 不想嫌弃麻烦 洗了个澡回来以后发现可以通过定位元素 然后点击元素 来实现自动展开列表

通过 前面截图的cursorPointer 能够成功定位20多个地方出来 但是前面几个定位是什么首页 搜索 不是我们想要的 问题不大。我们删除这几个定位就好了

 blockclass = driver.find_elements_by_class_name("cursorPointer")
        del blockclass[0]
        del blockclass[0]
        del blockclass[0]
        for blockc in blockclass:
                blockc.click()

删除几个定位就好了 
然后现在调试以后 集合代码跑了一次发现了几个问题,第一个就是 当

driver.execute_script("finishWxCourse()")    #执行js代码

执行代码以后,会alert一个窗口出来说 完成了课程。然后就会导致selenium不能点后退 面向百度编程以后

  dig_alert = driver.switch_to.alert     #搜索弹窗
        dig_alert.accept()                     #点击确定

接着就是最后一个坑了driver.back()以后蛋疼了 back以后 之前定位的会失效···所以只能每回退一次重新定位  还有要注意的就是在一些关键地方之前要time sleep一秒 不然还没请求完成出来就执行下一步了 会导致报错 最后就大功告成了

下面贴完整代码

#coding=utf-8

from selenium import webdriver

import time

def login():

driver = webdriver.Chrome("C:/Python27/chromedriver.exe")

driver.get("http://wb.mycourse.cn/")

driver.delete_all_cookies()

driver.add_cookie({'name':'JSESSIONID','value':'93BEC0FDEF428F98DA1F69A6B3C2BF88'})     #cookie都过期了的 不用试

driver.add_cookie({'name':'acw_tc','value':'7b39758715392684428742395e7ed4b94ed4e9616cb11d4b9df9e244ec7573'})

driver.add_cookie({'name':'SERVERID','value':'02cc313090e3650844ab417ac43bf774|1539357767|1539357719'})

driver.get("http://wb.mycourse.cn/svnweiban/student/study_studyAndTest.action")

blockclass = driver.find_elements_by_class_name("cursorPointer")

del blockclass[0]

del blockclass[0]

del blockclass[0]

for blockc in blockclass:

blockc.click()

for i in range(99):

link2s = driver.find_elements_by_class_name("courseText")

link2s.click()
                driver.execute_script("finishWxCourse()")
                time.sleep(1)
                dig_alert = driver.switch_to.alert
                dig_alert.accept()
                driver.back()
                time.sleep(1)
                blockclass = driver.find_elements_by_class_name("cursorPointer")
                del blockclass[0]
                del blockclass[0]
                del blockclass[0]
                for blockc in blockclass:
                        blockc.click()
                time.sleep(0.5)
login()

 

大家有任何问题可以提问,更多文章可到i春秋论坛阅读哟~

利用python完成大学刷课(从0到完成的思路)的更多相关文章

  1. python网课自动刷课程序-------selenium&plus;chromedriver

    python的强大之处就在于有许多已经写好的功能库提供,这些库强大且易用,对于写一些有特定功能的小程序十分方便. 现在就用pyhton的selenium+谷歌游览器写一个可以自动刷课的程序,以智慧树上 ...

  2. 利用Python分析GP服务运行结果的输出路径 &amp&semi; 实现服务输出路径的本地化 分类: Python ArcGIS for desktop ArcGIS for server 2015-08-06 19&colon;49 3人阅读 评论&lpar;0&rpar; 收藏

    最近,一直纠结一个问题:做好的GP模型或者脚本在本地运行,一切正常:发布为GP服务以后时而可以运行成功,而更多的是运行失败,甚至不能知晓运行成功后的结果输出在哪里. 铺天盖地的文档告诉我,如下信息: ...

  3. 利用Python进行数据分析&lpar;12&rpar; pandas基础&colon; 数据合并

    pandas 提供了三种主要方法可以对数据进行合并: pandas.merge()方法:数据库风格的合并: pandas.concat()方法:轴向连接,即沿着一条轴将多个对象堆叠到一起: 实例方法c ...

  4. 利用Python进行数据分析&lpar;7&rpar; pandas基础&colon; Series和DataFrame的简单介绍

    一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...

  5. 利用Python进行数据分析&lpar;4&rpar; NumPy基础&colon; ndarray简单介绍

    一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...

  6. 【bb平台刷课记】wireshark结合实例学抓包

    [bb平台刷课记]wireshark结合实例学抓包 背景:本校形势与政策课程课需要在网上观看视频的方式来修得学分,视频网页自带"播放器不可快进+离开窗口自动暂停+看完一集解锁下一集(即不能同 ...

  7. 《利用python进行数据分析》读书笔记 --第一、二章 准备与例子

    http://www.cnblogs.com/batteryhp/p/4868348.html 第一章 准备工作 今天开始码这本书--<利用python进行数据分析>.R和python都得 ...

  8. python打怪之路【第三篇】:利用Python实现三级菜单

    程序: 利用Python实现三级菜单 要求: 打印省.市.县三级菜单 可返回上一级 可随时退出程序 coding: menu = { '北京':{ '朝阳':{ '国贸':{ 'CICC':{}, ' ...

  9. python通过代理刷网页点击量

    python通过代理刷网页点击量 更新异常处理情况 @time 2013-0803 更新循环里计数问题和随机等待时间问题 #!/usr/bin/python #-*- coding:utf-8 -*- ...

随机推荐

  1. storm入门(二):关于storm中某一段时间内topN的计算入门

    刚刚接触storm 对于滑动窗口的topN复杂模型有一些不理解,通过阅读其他的博客发现有两篇关于topN的非滑动窗口的介绍.然后转载过来. 下面是第一种: Storm的另一种常见模式是对流式数据进行所 ...

  2. 转:云计算的三种服务模式:IaaS,PaaS和SaaS

    转: http://www.cnblogs.com/beanmoon/archive/2012/12/10/2811547.html 云服务”现在已经快成了一个家喻户晓的词了.如果你不知道PaaS, ...

  3. 637&period; Average of Levels in Binary Tree

    Given a non-empty binary tree, return the average value of the nodes on each level in the form of an ...

  4. 使用float属性的一些小技巧

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPwAAACJCAIAAACHJsJCAAAKUUlEQVR4nO2dTY8cxRnHd73LLsusDd ...

  5. java线程池的实现机制

    原文链接:http://www.studyshare.cn/blog-front/blog/details/1133 一.java中提供的线程在开发中可能并不会直接使用,多线程编程场景使用java的线 ...

  6. SpringMVC的执行流程

    解析SpringMVC执行流程 SpringMVC的执行图大概如下所示 1.首先它是由客户端发起请求,到DispatcherServlet,被拦截后到HandlerMapping这里充当一个路由器,通 ...

  7. bootstrap-datepicker简单使用

    粗略整理,可能存在其他的方式请大家多多指教 选择年份 html <div class="dropdown"> <label class="search- ...

  8. C&num;简繁体转换

    /// <summary>/// 字符串简体转繁体/// </summary>/// <param name="strSimple"></ ...

  9. 使用DateTime的ParseExact方法实现特殊日期时间的方法详解(转)

    本篇文章是对使用DateTime的ParseExact方法实现特殊日期时间的方法进行了详细的分析介绍,需要的朋友参考下 今天遇到一个特别的需求,需要从下面的字符串中转换成一个DateTime对象: [ ...

  10. XML学习(一)

    实体引用 在 XML 中,一些字符拥有特殊的意义. 如果您把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始. 这样会产生 XML 错误: ...