由于不能去实验室,却又需要控制实验室的一台电脑,而装了teamview,可是不知道为什么实验室的电脑总是断网,所以不得不每天麻烦小伙伴帮忙连下网络。
实在是受够了这神奇的网络,自己动手丰衣足食!于是我只能抄起年轻时用的webdriver和爬虫,写了个自动重连的脚本。原理很简单,控制浏览器模拟鼠标和键盘动作。
(PS: 在爬虫领域webdriver一般是在网站的反爬虫机制过于严格的情况下才动用的大杀器,由于完全模拟人操作浏览器的动作,所以在技术上不存在被检测判定为爬虫的可能。)
以下大概介绍原理:
一、判断是否断网
原本我是根据get百度网址,获取状态码,发现是200就认为是没断网。结果发现这样并不可行,因为如果认证超时了,也会返回认证登陆界面并且返回200,而此时应该是断网状态。于是我改成了这种判定方法——查找返回的界面是否有“百度一下”的按钮。
baidu_request = requests.get("http://www.baidu.com")
if (baidu_request.status_code == 200):
baidu_request.encoding = 'utf-8'
baidu_request_bsObj = BeautifulSoup(baidu_request.text, 'html.parser')
baidu_input = baidu_request_bsObj.find(value="百度一下")
if baidu_input == None:
return False
return True
二、断网重连
打开一个浏览器,输入网络连接的url后等待一会,应该会出现登陆界面;接下来,查找用户名和密码,输入、点击登录按钮。
非常简单。
driver = webdriver.Chrome()
try:
driver = webdriver.Chrome()
driver.get("https://w.seu.edu.cn/")
time.sleep(3)
username_input = driver.find_element_by_id("username")
password_input = driver.find_element_by_id("password")
login_button = driver.find_element_by_id("login")
username_input.send_keys(username_str)
password_input.send_keys(password_str)
login_button.click()
except:
print(self.getCurrentTime(), u"登陆函数异常")
finally:
driver.close()
其他:
一、为什么不用表单登陆而要动用大杀器webdriver?
我研究了下,登录方法确实是post表单登陆,但是试了很多次header设置都不对,嫌麻烦就放弃了。post表当登陆确实应该是鲁棒性更强的方式。
二、为什么东南大学的ZZ校园网夜里必然断网?
根据现在的经验,应该是会判定每一个登陆的设备的活跃时间,如果持续数小时不活跃就会被管理端强制断线。我原来在电脑上跑一个程序,会持续向外网发送数据,那次就好几天都没断网。