Python自动登录校园网

Python自动登录校园网

前几天bilibili给我推送了一条消息,如何用python自动登录校园网,我一看,啪一下就点进去了,很快啊,两分钟就给他看完了,感觉蛮有意思的,我赶紧自己也写了一个针对我学校的登录网页的自动登录程序,点击运行,网页返回200,我笑一下,准备收工,点开浏览器试试网,好家伙,果然还是没网!
关于这个bilibili的Python程序,博主下次再为大家介绍,这次博主准备介绍自己写的代码,是通过selenium来实现的。
还不知道selenium的小伙伴们可要快点来学学这个有意思的东西了,selenium:自动化测试框架,顾名思义,就是通过代码自动测试,主要应用于浏览器中,就好像真的是人在电脑前操作一样。
好了,废话不多讲,接下来就和大家一起看看我的实现过程吧。

准备工作

我们这次用到的库是一个第三方库selenium,大家可以通过pip来安装,还有一个是Python自带的time库。
哦,对了,最最重要的我们这次需要用到浏览器驱动器,没有浏览器驱动器我们是没办法运行代码,实现自动化测试的。博主使用的是谷歌浏览器,镜像的下载链接也为大家准备好了。
大家一定要找到对应于自己浏览器版本的驱动,不然也时不行的,博主也是因为浏览器更新所以又下了一次驱动呢。
在浏览器的设置中就能找到浏览器版本,聪明的你们一定能看到。
下载好后记得将驱动器放在你安装Python的目录的Script目录下。
谷歌浏览器驱动下载

开始网页元素分析

准备工作做完以后我们就可以打开我们的校园网啦!
首先我们要找到我们需要输入的信息的对象

  1. 我们通过Fn+F12(不同电脑的方式可能不同)打开网页分析工具查看网页元素。
    在这里插入图片描述
    这三个框框就是我们要输入信息的地方啦。(校园网这样的网页元素一般都比较简单,我们拿来练练手不是正好,哈哈哈哈)
    可以看到有一个组合框,两个文本框。
  2. 我们通过网页元素检查器来找找这几个元素的位置。
    在这里插入图片描述
    很容易我们就找到了这三个元素的标签。
    组合框的name属性值是“ISP_select”
    账号的name属性值是“DDDDD”
    密码的name属性值是“upass”
  3. 打开我们的VScode,开工了!
    首先导入我们需要用到的库
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

浏览器驱动器给我动起来

driver = webdriver.Chrome()
   driver.get('这里放你的校园网网址,不许偷看我的哦~)

接下来就是很简单的对不同的框框输入信息,然后敲回车就好了。

input_tag1 = driver.find_element_by_name('ISP_select')
   input_tag1.send_keys('中国联通')
   input_tag = driver.find_element_by_xpath("//form[@name='f3']/input[@name = 'DDDDD']")
   input_tag.send_keys("19200107137")
   input_tag2 = driver.find_element_by_xpath("//form[@name='f3']/input[@name = 'upass']")
   input_tag2.send_keys("073934")
   input_tag2.send_keys(Keys.ENTER)
   time.sleep(20)

完整的代码及注释

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

def spider():
   driver = webdriver.Chrome()
   driver.get('http://www.********.com/redirect')   #这里输入你的校园网登录网址(我手动打码)
   time.sleep(5)
   input_tag1 = driver.find_element_by_name('ISP_select')  #找到组合框,这个可以通过name直接找
   input_tag1.send_keys('中国联通')    #这是组合框,要选择你的宽带的运营商
   input_tag = driver.find_element_by_xpath("//form[@name='f3']/input[@name = 'DDDDD']")   #通过xpath确定账号矿位置
   input_tag.send_keys("192*******")  #输入账号(没错,还是我手动打的码)
   input_tag2 = driver.find_element_by_xpath("//form[@name='f3']/input[@name = 'upass']")  #通过xpath确定密码框位置
   input_tag2.send_keys("073934")  #输入密码
   input_tag2.send_keys(Keys.ENTER)    #敲一下回车
   time.sleep(20)  #20秒后自动关闭浏览器
if __name__ == '__main__':  #运行上面封装的方法
   spider()

问题总结

接下来,我会为大家讲述我这次遇到的问题,程序报的错,如果你也遇到困难了,那就看看我这里有没有你要的解决方法吧。

问题1:驱动器与浏览器不匹配

在这里插入图片描述
解决方法:把原来的驱动器删了,下对应版本的驱动器下载下来放到对应文件夹就好了。

问题2:网页延时

有些网站可能会有js文件的异步载入。为确保不因为这个原因造成程序出错,我们通过time库添加延时,来确保网页元素已经全部加载完毕。
在这里插入图片描述

问题3:网页元素标签重复

怎么说呢,这个问题是在我编码过程中被忽略的,我惯性地以为网页中name标签值为“DDDDD”的元素只有一个,导致我报错报了很久。
报错有“设备没有发挥作用”(这个虽然也是一起报出来的错。但不清楚是不是因为这个原因),我上网发现很多人问这个问题,好像解决的方法也不同。
还有就是“element not interactable”
报错界面如下
在这里插入图片描述
解决方法:
回到我们的校园网网站中,Fn+F12打开网页开发工具后按ctrl+f查找“DDDDD”和“upass”。
在这里插入图片描述
好家伙,有三个!
那我们改变筛选条件,来减少符合条件的元素。改成input标签下name=“DDDDD”的元素。这里提醒一下,浏览器元素是适用xpath查找的。
在这里插入图片描述
这样还是有两个!
那我们再多加一点限制。直接包裹把input标签的form标签的名字也给限制住,看你还怎么跑!
在这里插入图片描述
这样就找到唯一的元素了,upass也用同样方法确定
在这里插入图片描述

思路总结

  1. 准备好要用的工具:selenium和time库,下载对应版本的浏览器驱动器并放入指定文件夹中。
  2. 打开网页,分析网页元素,通过条件限制确定python找到的是一个唯一元素。
  3. 对对应的元素做对应的输入,最后敲回车。
    温馨提示:博主发现直接双击py文件运行或将py文件拖到cmd中运行都无法实现,必须通过VScode来运行才能成功。

最后给大家看看我解决问题时看到的文章吧

  1. selenium模块键盘输入问题,因为之前因为元素没有唯一确定报错我以为是我输入有问题。
    selenium模块键盘输入
  2. 网页延时的问题我就是从下面这篇文章中得到的启发。
    selenium自动化常见问题
  3. “设备没有发挥作用”我也曾试过下面这种解决方法。
    services.msc如何打开
  4. 这是最启发我的,关于网页元素不可交互可能是因为网页元素重复!
    selenium元素定位报element not interactable的解决方法
    好了,这次的内容就到这里了,感兴趣的小伙伴们赶紧自己也试一试吧!

猜你喜欢

转载自blog.csdn.net/qq_45792455/article/details/111406732