紫玉说课没选上,我就想写个脚本挂着看有没有退呗~
初探 经过同学的推荐使用了selenium。做自动化测试很好啊,解决chekbox分分钟。开始啦~
上来就遇到问题了。要把geckodriver
这个东西放到环境变量里。 最后选择手动配置路径:dr = webdriver.Firefox(executable_path = '/Users/lixs/anaconda3/geckodriver')
虽然麻烦点,但是着急往下写。我们继续~
先试试用Cookie登录
1 2 3 4 5 6 driver.get('http://jwxk.ucas.ac.cn/courseManage/selectCourse?s=473bcdb8-8d5d-40af-9087-5071b63ff7a8' ) driver.add_cookie({'name' :'username' ,'value' :'chinalixs@qq.com' }) driver.add_cookie({'name' :'pwd' ,'value' :'Jwsyb9503' }) driver.get('http://jwxk.ucas.ac.cn/courseManage/' )
不行,提示会话过期。先不用Cookie了以后再回来研究自动填表吧
1 2 3 4 5 6 7 input = driver.find_element_by_name('userName' )input .send_keys('NAME' )input = driver.find_element_by_name('pwd' )input .send_keys('123456' )sb = driver.find_element_by_name('sb' ).click()
然后选课找课都是一个模子的。只能说这个selenium很给力~
知识点
1 2 3 al = driver.switch_to_alert() time.sleep(1 ) al.accept()
判断是否选上了driver.find_element_by_xpath('//input[@value="65A7F68B98BB6FB9"]').is_selected()
实战本地跑 截止到目前还是没选上的,因为没人退课啊。不过学到了selenium这个包。
具体思路就是监测那门课的 chekbox 前面的 √ 是否打上了,打不上就刷新,因为有了课余量那个 √ 是可以打上的,然后就一直刷新。 之前也是程序跑个20次左右就会报错,可能是请求太多了。然后刚好上次学到了 try/except ,哎呦不错哦。
代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 from selenium import webdriverimport timedriver = webdriver.Firefox(executable_path = '/Users/lixs/anaconda3/geckodriver' ) driver.get('http://sep.ucas.ac.cn' ) input = driver.find_element_by_name('userName' )input .send_keys('chinalixs@qq.com' )input = driver.find_element_by_name('pwd' )input .send_keys('Jwsyb9503' )sb = driver.find_element_by_name('sb' ).click() from selenium import webdriverimport timedriver = webdriver.Firefox(executable_path = '/Users/lixs/anaconda3/geckodriver' ) driver.get('http://sep.ucas.ac.cn' ) input = driver.find_element_by_name('userName' )input .send_keys('chinalixs@qq.com' )input = driver.find_element_by_name('pwd' )input .send_keys('Jwsyb9503' )sb = driver.find_element_by_name('sb' ).click() driver.find_element_by_xpath('//a[@href="/portal/site/226/821"]' ).click() driver.get('http://jwxk.ucas.ac.cn/courseManage/main' ) driver.find_element_by_id('id_913' ).click() driver.find_element_by_xpath('//form[@id="regfrm2"]//button[@name="sb"]' ).click() i = 1 def xuanke (i ): if i%100 ==0 : return try : driver.find_element_by_xpath('//input[@value="65A7F68B98BB6FB9"]' ).click() if driver.find_element_by_xpath('//input[@value="65A7F68B98BB6FB9"]' ).is_selected(): print ('选上啦!!!' ) return else : print (i,'次没选上继续' ) i += 1 driver.refresh() al = driver.switch_to_alert() al.accept() xuanke(i) except : print ('---------------ERROR---------------------' ) xuanke(i) for a in range (10000 ): xuanke(i) sb = driver.find_element_by_xpath('//button[@type="submit"]' ).click() sb = driver.find_element_by_xpath('//button[@value="ok"]' ).click() print ('OVER' )driver.close()
代码历史:
1.0版本 开始选课函数是 xuanke() 后来我想引入一个统计变量看跑了多少次。就在函数外设了个变量。结果很低级的错误就出现了,函数定义怎么能改全局变量i呢。真的天真
2.0版本 xuanke(i) 传入i。 统计可以了,新问题也就出现了。老版的 xuanke(i) 里每跑2k次左右,就会内存爆炸,于是
3.0版本 每i==100就return一次。
服务器跑 频繁地去刷新网页,跑了一会儿课没选上,我16g的mac内存占用100%,开始发热了。于是服务器跑的思想直接就冒了出来~
刚好看到这篇文章:《liunx centos7无GUI服务器跑Selenium部署说明》
安装chrome
添加chrome的repo源
1 2 vi /etc/yum.repos.d/google.repo [google]name=Google-x86_64baseurl=http://dl.google.com/linux/rpm/stable/x86_64enabled=1gpgcheck=0gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
安装yum update
, 然后yum install google-chrome-stable
注意 :google-chrome一定一定不要用root用户去运行
安装chromedrive 从https://sites.google.com/a/chromium.org/chromedriver/home 下载 chromedriver
配置在PATH路径或者在脚本中指定路径
1 2 3 4 5 6 7 8 9 wget -N http://chromedriver.storage.googleapis.com/2.29/chromedriver_linux64.zip unzip chromedriver_linux64.zip chmod +x chromedriver sudo mv -f chromedriver /usr/local/share/chromedriver sudo ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver sudo ln -s /usr/local/share/chromedriver /usr/bin/chromedriver
安装Xvfb 无GUI时,Xvfb为虚拟GUI
1 2 3 4 5 6 7 yum update yum install Xvfb yum -install libXfont yum install xorg-x11-fonts*
安装selenium、pyvirtualdisplay pip install selenium
pip install pyvirtualdisplay
5.写个小demo测试下效果
vim test.py
1 2 3 4 5 6 7 8 9 10 11 12 from selenium import webdriverfrom pyvirtualdisplay import Display display = Display(visible=0 , size=(800 ,600 )) display.start() driver = webdriver.Chrome("./chromedriver" ) driver.get("http://www.baidu.com" ) print driver.page_sourcedriver.quit() display.stop()
python test.py