文章目录
| 专栏 |
|---|
| Python零基础入门篇💥 |
| Python网络蜘蛛💥 |
| Python数据分析 |
| Django基础入门宝典💥 |
| 小玩意儿💥 |
| Web前端学习 |
| tkinter学习笔记 |
| Excel自动化处理 |
写这篇文章只是想证明一下:本博主还在呼吸😇
📢许久未更,甚是想更呐~
这段时间生活中充斥着各种事情,感觉每天都在忙忙碌碌,偶而停下疲惫的身躯,突然抬头,却不知自己身处何方,忙了这么久,到底在忙些什么呢?找不着方向,于是开始惶恐,便又不知方向的胡乱奔走……,好吧好吧,总结两个字:迷茫,再加两个字:瞎忙……

其实这几天一直想写博客的,想写有趣又轻松的一篇文章,但又不到写哪些内容比较好,又因还要解决各种事情,于是就搁到了现在……

💥直到某天,为了完成MOOC(MOOC不会没人不知道吧👀)上的回复讨论任务,我不已为然的点开了MOOC……突然 ⁉️我看到了一个进度条,那个进度条仿佛就像是深渊,脑海中突然闪出一句话,我%@#!,咳咳咳,不是不是,是一句名言:当你凝望深渊,深渊也在凝望着你……😭
(进度条是已经用代……不是,是已经用我辛勤的劳动把它拉起来的)


不知到有没有小伙伴经历过要回复几十条讨论的经历,当场看见那进度条我就……,就偷偷写脚本了😁
这个脚本花了我比较长的时间才完成的,因为调试的过程有些许麻烦……,不过最终还是解决了,想看效果如何,请往下看👇
又双叒叕是Get_cookie.py了兄弟,看过我《小玩意儿》专栏文章的都能看烂了,但别说,还真好用,登录一次,一劳永逸,就靠它了~,话不多说,直接❗️ ❗️ ❗️ 上号💬

上码❗️ ❗️ ❗️
(记得在三十秒内登录哦~)
from selenium import webdriver
import time
import json
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.icourse163.org/')
time.sleep(30)
dictCookies = driver.get_cookies()
jsonCookies = json.dumps(dictCookies) # 转换成字符串保存
with open('moocCookie.txt', 'w') as f:
f.write(jsonCookies)
print("cookies保存成功")
以前回复讨论咱们讲究的是什么⁉️讲究的是灵活运用Ctrl C和Ctrl V,讲究的是快准狠💪
现在回复讨论咱们讲究的是什么⁉️讲究的是能不用手就不用手,讲究的是一个 automation,科技是第一生产力呀兄弟们 🤘
什么?相应模块怎么下载?pip install 模块名 就完事了兄弟~
什么?chromedriver怎么配置?看这篇文章就完事兄弟~
【Python网络蜘蛛 · 9】:selenium模块【安装和配置环境变量教程、提取数据操作、无头模式】(附操作源码)
什么?不会搞?看下图干就完事了兄弟

话不多说❗️ ❗️ ❗️码来❗️ ❗️ ❗️
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import json
import time
class MOOC(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('https://www.icourse163.org/')
def login(self):
#获取保存下的cookie值
with open('moocCookie.txt', 'r', encoding='utf-8') as f:
listCookies = json.loads(f.read())
# 往driver里添加cookie
for cookie in listCookies:
cookie_dict = {
'domain': '.icourse163.org',
'name': cookie.get('name'),
'value': cookie.get('value'),
'expires': '',
'path': '/',
'httpOnly': False,
'HostOnly': False,
'Secure': False
}
self.driver.add_cookie(cookie_dict)
self.driver.refresh() # 刷新页面
# 进入课程
def entering_the_course(self):
#等待“个人中心”元素出现
WebDriverWait(self.driver, 1000).until(
EC.presence_of_element_located((By.XPATH, '//*[@id="j-indexNav-bar"]/div/div/div/div/div[7]/div[3]/div/div/a/span'))
)
self.driver.find_element(By.XPATH, '//*[@id="j-indexNav-bar"]/div/div/div/div/div[7]/div[3]/div/div/a/span').click()
# 等待“SPOC课程12”元素出现并点击
time.sleep(1)
WebDriverWait(self.driver, 1000).until(
EC.presence_of_element_located((By.XPATH, '//div[@class="u-selectTab-container"]/div[2]/a'))
)
self.driver.find_element(By.XPATH, '//div[@class="u-selectTab-container"]/div[2]/a').click()
#等待课程元素出现,并获取元素,用户选择课程
WebDriverWait(self.driver, 1000).until(
EC.presence_of_element_located((By.XPATH, '//div[@class="course-card-wrapper"]/div/a/div/img'))
)
course_ele = self.driver.find_elements(By.XPATH, '//div[@class="course-card-wrapper"]/div/a/div/img')
course_name = [ele.get_attribute('alt') for ele in course_ele]
for index, i in enumerate(course_name):
print(index, i)
user = int(input('请输入课程序号:'))
course_ele[user].click()
time.sleep(2)
self.driver.switch_to.window(self.driver.window_handles[-1]) # 切换窗口
time.sleep(2)
#等待课件出现并点击
WebDriverWait(self.driver, 1000).until(
EC.presence_of_element_located((By.XPATH, '//li[@data-name="课件"]'))
)
self.driver.find_element(By.XPATH, '//li[@data-name="课件"]').click()
# 等待章节元素出现并点击
WebDriverWait(self.driver, 1000).until(
EC.presence_of_element_located((By.XPATH, '//div[@class="m-learnChapterList f-pr"]/div[@class="m-learnChapterNormal f-pr"][1]'))
)
# 点击章节
self.driver.find_element(By.XPATH, '//div[@class="m-learnChapterList f-pr"]/div[@class="m-learnChapterNormal f-pr"][1]').click()
time.sleep(0.3)
# 点击进入视频
self.driver.find_elements(By.XPATH, '//div[@class="sourceList"]/div[1]')[0].click()
# 获取章节中”选择课程“的元素并点击
WebDriverWait(self.driver, 1000).until(
EC.presence_of_element_located(
(By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div'))
)
# 获取所有章节
temp_chapters = self.driver.find_elements(By.XPATH, '//div[@class="f-fl j-chapter"]//div[@class="down f-bg j-list"]/div')
# 通过循环获取到的章节元素和课程元素,进行讨论
for chapter_index in range(len(temp_chapters)): # 循环章节
# 获取章节中”选择课程“的元素并点击
WebDriverWait(self.driver, 1000).until(
EC.presence_of_element_located(
(By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div'))
)
# 获取章节选项框并点击
self.driver.find_element(By.XPATH, '//div[@class="f-fl j-chapter"]/div[@class="u-select"]/div[1]').click()
self.driver.find_elements(By.XPATH, '//div[@class="f-fl j-chapter"]//div[@class="down f-bg j-list"]/div')[chapter_index].click()
# 等待课程元素出现
WebDriverWait(self.driver, 1000).until(
EC.presence_of_element_located(
(By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div'))
)
# 获取章节中所有课程
course = self.driver.find_elements(By.XPATH,'//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div/div[2]/div')
course_names = [i.get_attribute('title') for i in course]
for c_index in range(len(course)): # 循环课程
WebDriverWait(self.driver, 1000).until(
EC.presence_of_element_located(
(By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div'))
)
self.driver.find_element(By.XPATH,'//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div').click()
WebDriverWait(self.driver, 1000).until(
EC.presence_of_element_located(
(By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div/div[2]/div'))
)
# 重新获取课程元素并点击
course1 = self.driver.find_elements(By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div/div[2]/div')
course1[c_index].click()
time.sleep(2)
try:
try:
# 获取讨论元素
disc = self.driver.find_element(By.XPATH, '//li[@title="讨论:讨论话题"]/span[2]')
if disc.is_enabled(): # 如果讨论元素存在且可以点击
disc.click()
self.discuss() # 调用讨论函数
except:
time.sleep(0.5)
if course_names[c_index] == '讨论区':
self.discuss()
except:
pass
# 讨论
def discuss(self):
# 等待“回复”元素出现
WebDriverWait(self.driver, 100).until(
EC.presence_of_element_located((By.XPATH, '//div[@class="optbar f-cb"]/a[1]/span'))
)
time.sleep(0.5)
self.driver.execute_script("var q=document.documentElement.scrollTop=10000")
time.sleep(0.5)
try:
content = self.driver.find_element(By.XPATH, '//div[@class="j-list"]/div/div[3]/div/div[2]/p').text
except:
content = self.driver.find_element(By.XPATH, '//div[@class="j-list"]/div/div[1]/div/div[2]').text
self.driver.switch_to.frame(0)
time.sleep(0.5)
# 定位输入框并输入信息
self.driver.find_element(By.XPATH, '//body[@contenteditable="true"]').send_keys(content)
self.driver.switch_to.window(self.driver.window_handles[-1]) # 进行窗口切换
time.sleep(1)
# 点击发送回复
self.driver.find_element(By.XPATH,'/html/body/div[5]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[3]/div[2]/div[2]/div/div/div[5]/div/div[1]/div[2]/a[1]').click()
def run(self):
self.login()
self.entering_the_course()
mooc = MOOC()
mooc.run()

好了,以上就是今天哔哩吧啦咕噜哇啦叽里呱啦哗哗啦啦写的一篇水……呃不,勉强还看得过去的文章😛,如果喜欢,可以 点赞👍 收藏🌈 关注💖 感谢您的支持🌹
🚈下次再见💨
哦对了💡为啥每次刷网课时最小化网页后,看完一个视频它就自动暂停了❓是不是可以写一个自动刷视频的❓不管了,下次再说吧💨
peace~
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?