目录
- 一、完整代码
- 二、部分代码注释
一、完整代码
这里对于selenium库就不详细解释,包括chrome浏览器的配置等问题应该能百度到。这部分代码适合老师自己录制的视频以及音频播放,如果是课程自带的需要另一份代码。不多说直接上代码。
from selenium import webdriver
import time
from requests import *
class Xxt_Spider():
def __init__(self,course_title,small_title):
self.course_title=course_title
self.small_title=small_title
self.browser=webdriver.Chrome()
def get_dl(self):
self.browser.get("http://www.xuexi365.com/cxlogin?refer=http%3A%2F%2Fi.mooc.chaoxing.com")
self.browser.find_element_by_name("uname").send_keys("自己账号")
self.browser.find_element_by_name("password").send_keys("自己密码")
time.sleep(10)
self.browser.find_element_by_name("button").click()
self.browser.find_element_by_name("uname").send_keys("自己账号")
self.browser.find_element_by_name("password").send_keys("自己密码")
time.sleep(10)
b.find_element_by_class_name("zl_btn_right").click()
return self.browser
def get_course(self):
b=self.get_dl()
b.switch_to.frame("frame_content")
b.get(b.find_element_by_xpath('//*[@title="%s"]'%self.course_title).get_attribute("href"))
b.find_element_by_xpath("//*[@title='%s']"%self.small_title).click()
b.execute_script("window.scrollTo(0, document.body.scrollHeight)")
def start_study(self):
self.browser.switch_to.frame("iframe")
self.browser.find_elements_by_tag_name("iframe")
for i in range(len(self.browser.find_elements_by_tag_name("iframe"))):
self.browser.switch_to.frame(i)
time.sleep(3)
try:
self.browser.find_element_by_xpath("//*[@type='button']").click()
time.sleep(2)#等待节点加载出来,不然视频节点还没出来则会报错
while True:
try:
self.browser.find_element_by_xpath('//*[@id="audio"]/div[5]/div[1]/span[2]')
if self.browser.find_element_by_xpath('//*[@id="audio"]/div[5]/div[1]/span[2]').get_attribute("textContent")==self.browser.find_element_by_xpath('//*[@id="audio"]/div[5]/div[3]/span[2]').get_attribute("textContent"):
print("第%d个音视频频已完成"%(i+1))
break
except:
self.browser.find_element_by_xpath('//*[@id="video"]/div[5]/div[2]/span[2]')
if self.browser.find_element_by_xpath('//*[@id="video"]/div[5]/div[2]/span[2]').get_attribute("textContent")==self.browser.find_element_by_xpath('//*[@id="video"]/div[5]/div[4]/span[2]').get_attribute("textContent"):
print("第%d个视频已完成"%(i+1))
break
self.browser.switch_to.parent_frame()
except:
try:
while True:
if self.browser.find_element_by_xpath('//*[@id="navigation"]/span[1]').get_attribute("textContent")==self.browser.find_element_by_xpath('//*[@id="navigation"]/span[@class="all"]').get_attribute("textContent"):
print("该ppt已完成")
break
else:
time.sleep(1)
self.browser.find_element_by_xpath('//*[@id="ext-gen1042"]').click()
self.browser.switch_to.parent_frame()
except:
pass
self.browser.switch_to.parent_frame()
def next_page(self):
self.browser.switch_to.default_content()
self.browser.find_element_by_xpath('//*[@id="mainid"]/div[1]/div[2]').click()
def main(self):
self.get_course()
self.start_study()
self.next_page()
time.sleep(5)
if __name__=="__main__":
a=Xxt_Spider("","")
a.main()
for i in range(1):
a.start_study()
a.next_page()
二、部分代码注释
来第一部分
def __init__(self,course_title,small_title):
self.course_title=course_title
self.small_title=small_title
self.browser=webdriver.Chrome()
这一部分就是初始化属性,包括初始化浏览器,course_title是你要学习的课程名称,small_title是你要学习的章节,就是你要开始学的那一单元的名字。
接下来第二部分
def get_dl(self):
self.browser.get("http://www.xuexi365.com/cxlogin?refer=http%3A%2F%2Fi.mooc.chaoxing.com")
self.browser.find_element_by_name("uname").send_keys("自己账号")
self.browser.find_element_by_name("password").send_keys("自己密码")
time.sleep(10) #设置10s延时,自己识别验证码并输入
self.browser.find_element_by_name("button").click()
self.browser.find_element_by_name("uname").send_keys("自己账号")
self.browser.find_element_by_name("password").send_keys("自己密码")
time.sleep(10) #设置10s延时,自己识别验证码并输入
return self.browser
这里就是登陆环节,由于技术有限,不能实现自动登录,主要是验证码识别问题,使用tesserocr库的识别率太低了,而且对这个库也不是很熟,所以只能设置延时,自己输入验证码了。当然也可以借助打码平台。至于要输入账号密码,第一次是登陆学习通,第二次又要选学校所以需要两次登陆,你可以自己输网址试试是不是要两次。
第三部分
def get_course(self):
b=self.get_dl()
b.find_element_by_class_name("zl_btn_right").click()
b.switch_to.frame("frame_content")
b.get(b.find_element_by_xpath('//*[@title="%s"]'%self.course_title).get_attribute("href"))
b.find_element_by_xpath("//*[@title='%s']"%self.small_title).click()
b.execute_script("window.scrollTo(0, document.body.scrollHeight)")
这一部分就是点开你的课程,然后进入学习的页面,选取章节。这里如果要详细讲每一步的话,篇幅太长。就暂时先不详细讲了。这一部分倒没什么注意的。
第四部分
def start_study(self):
self.browser.switch_to.frame("iframe")
self.browser.find_elements_by_tag_name("iframe")
for i in range(len(self.browser.find_elements_by_tag_name("iframe"))):
self.browser.switch_to.frame(i)
time.sleep(3)
try:
self.browser.find_element_by_xpath("//*[@type='button']").click()
time.sleep(2)#等待节点加载出来,不然视频节点还没出来则会报错
while True:
try:
self.browser.find_element_by_xpath('//*[@id="audio"]/div[5]/div[1]/span[2]')
if self.browser.find_element_by_xpath('//*[@id="audio"]/div[5]/div[1]/span[2]').get_attribute("textContent")==self.browser.find_element_by_xpath('//*[@id="audio"]/div[5]/div[3]/span[2]').get_attribute("textContent"):
print("第%d个音视频频已完成"%(i+1))
break
except:
self.browser.find_element_by_xpath('//*[@id="video"]/div[5]/div[2]/span[2]')
if self.browser.find_element_by_xpath('//*[@id="video"]/div[5]/div[2]/span[2]').get_attribute("textContent")==self.browser.find_element_by_xpath('//*[@id="video"]/div[5]/div[4]/span[2]').get_attribute("textContent"):
print("第%d个视频已完成"%(i+1))
break
self.browser.switch_to.parent_frame()
except:
try:
while True:
if self.browser.find_element_by_xpath('//*[@id="navigation"]/span[1]').get_attribute("textContent")==self.browser.find_element_by_xpath('//*[@id="navigation"]/span[@class="all"]').get_attribute("textContent"):
print("该ppt已完成")
break
else:
time.sleep(1)
self.browser.find_element_by_xpath('//*[@id="ext-gen1042"]').click()
self.browser.switch_to.parent_frame()
except:
pass
self.browser.switch_to.parent_frame()
就是开始学习了,这里有几个延时设置很关键,很有必要,因为速度太快的话网页节点还没加载出来就会报错,所以延时不能省,但可以根据网速调整。当然也可以用selenium的显式等待,这里就直接用sleep代替了。然后因为偷懒了,没有定义变量,所以 几个if判断语句显得非常的长,可以改进一下。
if __name__=="__main__":
a=xxt_spider("","")
a.main()
for i in range(1):
a.start_study()
a.next_page()
最后一部分循环可以尽情的设置,可以设置成1000,想怎么来都行,只要能看完就行。对了,next_page方法可能在有的课程上会报错,因为设定的是点击下一页就跳到下一单元,有的课程设置了单元测验什么的,不过大部分应该都没问题。能看音频,视频,自动点击ppt。