正常情况下进入学者网作业界面的步骤:
1浏览器
2点击学者网(已收藏)
3输入账号
4输入密码
5点击登录
6点击学习课程
7找到课程点击课程名
8跳转页面至课程封面,点击进入课程
9点击课程作业
10查看作业,交作业
这么繁琐的流程,几乎超过了7±2的法则了,即使可以用登录管家把账号密码保存下来,也只是省略了输入密码账号的过程(其实一般登录管家不只是记录一个网站的登录,所以也要考虑点击登录管家和找到学者网的步骤)。最近学习的selenium可以很方便的解决这个问题。
大家可以去网上搜索selenium webdriver (python)第三版来学习,至于安装selenium的过程我也是折腾了很久的,不过几乎所有的问题都是可以解决的,我遇到很多奇葩的问题。比如
图片一
我发现了用find_element_by_class_name().click()的时候就出现一些问题让我很头疼。一开始我没留意到自己是这么写的find_elements_by_class_name().click(),非常低级的错误,有大神指点一下为什么吗?
driver.find_elements_by_id("").click()
AttributeError: 'list' object has no attribute 'click'
然后我继续调试,发现对于上图这部分内的任何一个元素click还是不起作用的,具体原因我也没搞懂,网上说是所有的element都已click,但是就会报错错误
Traceback (most recent call last):
File "C:\Users\Administrator\PycharmProjects\untitled3\loginscholar.py", line 29, in <module>
driver.find_element_by_class_name("head-toolbar-item-detail w1").click()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 415, in find_element_by_class_name
return self.find_element(by=By.CLASS_NAME, value=name)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 756, in find_element
'value': value})['value']
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 238, in execute
self.error_handler.check_response(response)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 193, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: Compound class names not permitted
(Session info: chrome=57.0.2987.110)
(Driver info: chromedriver=2.28.455520 (cc17746adff54984afff480136733114c6b3704b),platform=Windows NT 6.1.7601 SP1 x86_64)
于是我决定独辟蹊径,我发现了课程作业的网址是这样的:
http://www.scholat.com/course/S_homeworkList.html?courseId=219
很容易猜想出只要获得id就应该可以进入该课程的作业界面了吧,前提是我已经登录这个学者网
然后我就到前面一个页面去寻找,在进入课程的html中
<a id="loginHref1" onclick="checkLogin(219)">进入课程/Enter </a>
有一个checkLogin(219)和 网址上的219是相同的,所以我用以下代码简单获取了课程的id
courseid=driver.find_element_by_id("loginHref1").get_attribute("onclick")
start=courseid.find('(')
end=courseid.find(')')
courseid=courseid[start+1:end]
url2 = "http://www.scholat.com/course/S_homeworkList.html?courseId="+courseid然后上面这一行就是将课程id和作业界面的网址前缀联系起来。
具体的实现代码如下
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
courses = ['操作系统', '网页设计与制作', '数据库原理与实践', '计算机网络', '软件需求']
print("请输入数字代表课程:1.操作系统2.网页设计与制作3.数据库原理与实践4.计算机网络5.软件需求")
coursenumber = int(input())-1
print("你将进入"+courses[coursenumber])
driver = webdriver.Chrome()
driver.get("http://www.scholat.com/login.jsp")
print("请输入你学者网的账号")
user=input()
print("请输入你的密码")
passWord=input()
email=driver.find_element_by_id("j_username")
email.clear()
email.send_keys(user)
password=driver.find_element_by_id("j_password_ext")
password.clear()
password.send_keys(passWord)
password.send_keys(Keys.ENTER)
driver.find_element_by_id("t6").click()
driver.find_element_by_id("ui-id-4").click()
url1 = driver.find_element_by_link_text(courses[coursenumber]).get_attribute("href")
driver.get(url1)
courseid=driver.find_element_by_id("loginHref1").get_attribute("onclick")
start=courseid.find('(')
end=courseid.find(')')
courseid=courseid[start+1:end]
print("该课程课程号为"+courseid)
driver.find_element_by_id("loginHref1").click()
url2 = "http://www.scholat.com/course/S_homeworkList.html?courseId="+courseid
driver.get(url2)
time.sleep(100)
driver.quit()
其实算了一下整个过程包括所有页面跳转只是花了大约七秒钟。
图片二
图片三
好吧,这个仅仅是开始。
什么,我的计算机网络作业还没提交,唉,又要去补作业了。