selenium 登陆 blackboard系统 订阅作业更新
2017/5/26大约 2 分钟约 614 字
前言
前段时间看师兄在分享会上写了用selenium搞作业订阅的程序。 当时庆幸我院的老师都用静态网页发作业,看看Last-Modified 属性即可监测作业更新。然而好景不长,我院的服务器被黑了(黑人脸),好久没修,老师只好使用blackboard系统更新作业。于是只能参照师兄写一个。其实动手做之后发现并不是很难。只是编程技术一般,写的并不是简洁。
selenium 使用
比较简单,需要webdriver 网上有资料。webdriver 用 Chrome 或 PhantomJS 都可以。 我是调试时用Chrome ,部署时用 PhantomJS。因为PhantomJS是没有图形界面的,比较方便。
Google 的例子
import time
from selenium import webdriver
import selenium.webdriver.chrome.service as service
service = service.Service('C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')
service.start()
capabilities = {'chrome.binary':'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'}
browser = webdriver.Remote(self.service.service_url, self.capabilities)
browser.get("www.baidu.com")
time.sleep(2)
browser.quit()代码
from selenium import webdriver
import selenium.webdriver.chrome.service as service
import time
import re
class HomeworkCheck:
def __init__(self, classes, keyword):
self.service = service.Service('C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')
self.service.start()
self.capabilities = {'chrome.binary': 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'}
self.browser = webdriver.Remote(self.service.service_url, self.capabilities)
self.selected_classes = classes
self.key_words = keyword
def login(self):
self.browser.get("http://study.jnu.edu.cn")
# 为了安全,请使用环境变量。"os.environ.get()"
self.browser.find_element_by_name('user_id').send_keys('账号')
self.browser.find_element_by_name('password').send_keys('密码')
self.browser.find_element_by_xpath("//*[@id=\"login\"]/table/tbody/tr[3]/td[2]/input").click()
# 根据课名和keyword来搜索页面,返回对应的url。理论上修改keyword可以搜索其他页面。
def find_homework_pages(self):
self.login()
self.browser.get("http://study.jnu.edu.cn/webapps/portal/execute/tabs/tabAction?tab_tab_group_id=_1_1")
time.sleep(1)
course_page = self.browser.page_source
courses = re.findall("%3DCourse%26id%3D(.*?)%26url%3D.+?target=\"_top\">(.*?)</a>", course_page)
homework_urls = []
for i in courses:
for j in self.selected_classes:
if j.encode('utf-8') == i[1].encode('utf-8'):
print(i)
course_id = i[0]
course_url = "http://study.jnu.edu.cn/webapps/blackboard/execute/launcher?type=Course&id=%s&url=" % course_id
self.browser.get(course_url)
homework_page = self.browser.page_source
for key in self.key_words:
homework_id = re.findall("content_id=(.*?)&.*?%s" % key, homework_page)
if homework_id:
print(homework_id)
homework_urls.append(
"http://study.jnu.edu.cn/webapps/blackboard/content/listContent.jsp?course_id=%s&content_id=%s&mode=reset" % (
course_id, homework_id[0]))
time.sleep(2)
print(homework_urls)
return homework_urls
def get_homework(self):
homework_urls = self.find_homework_pages()
for url in homework_urls:
self.browser.get(url)
time.sleep(2)
content = self.browser.find_element_by_id("content_listContainer").get_attribute('innerHTML')
print(len(content)) # 作业的页面是一个表格,我粗暴地把表格长度记下来,下一次更新时长度肯定会变的。
# key words 用来搜索作业或实验的发布页面。 class name 就不必多说了
if __name__ == '__main__':
class_names = ['离散数学Ⅰ(全英)', '问题求解与程序设计实验(全英)']
key_words = ['Assignments', 'Labs']
action = HomeworkCheck(class_names, key_words)
action.get_homework()