记录0基础学习并运用selenium过程中所遇到的问题及解决方法

前几天的小猿口算PK被大学生带的很火,于是整理了现有方案,第一个方案大方向是抓包,第二个就是ocr图像识别。在选择第一个方案的过程中,出现了种种问题,也误打误撞了解了python中的selenium库,觉得很有意思,就着手开始学习。

在进行抓包方案的过程中,用到了request库,request库可以直接获取一个网页的静态内容,但也仅限于静态内容(个人理解,碍于本人片面学习理解可能有错),像一些实时更新的内容(或者与个人账户有关的内容)无法获取,本想着用request方法去爬取mooc中作业截止时间及具体作业内容,再交给ai去处理作业(纯属想拿新学的东西练练手,实际上有现成可行的方法),但是碍于request的缺点,根本获取不了目标元素,因为目标元素是因人而异,只有加入课堂的账号才会显示出,这就是动态生成元素,于是果断放弃这种方法,在询问chatgpt后,得知有一种能够获取动态元素的方法——selenium库。

主包是个大二学生,目前只对java掌握深一些,从未学过python,再经历了几天的学习过程(基础语法也仅仅只是在学习request与selenium的过程中顺带了解的),发现,python的语法太简易了,在某些方面的简便程度是我所了解的语言中未曾达到的。

selenium能够模拟操作,是实实在在的运行了浏览器,因此它能够获取动态元素(目标元素的网页都生成了,那目标元素肯定就能获取了)。想要用selenium,肯定第一步就是安装selenium库,但是我按b站的视频一步一步操作后,发现不能运行对应的浏览器(我用的edge),这个时候我开始一步一步排除原因,首位那肯定考虑浏览器驱动的位置是否正确,确认没问题后,怀疑是环境变量的问题,检查设置以后发现并没有问题,那问题到底出在哪呢?后面根据它的报错代码,了解到可能原因:selenium与urllib3版本冲突。解决方法,就是在解释器中手动把版本更改到对应版本,这个就不细说了,只说大致解决思路。更改以后,就可以正常控制启动浏览器窗口了。

接着就是自动化登录了,让代码将账号密码输入,并点击登录,但就是在这个过程中又出现了问题,报错“no such element”,找不到输入框元素。前面我用的都是class或者id属性等基础查找元素,一直报错后开始怀疑基础查找方法存在局限(就算我非常确定class或id名称没有错依旧是报错),于是开始找其他的元素查找方法,最后准备用Xpath方法,我也比较推荐这个,因为能解决百分之八十的元素查找问题,但我这个问题依旧解决不了,因为它根本就不是元素定位不到的问题,而是元素根本在获取的页面中根本不存在。我也是在查了许多资料和视频后才知道原因:frame与iframe对获取页面元素的影响(例如某一页面呼出登录页面,但仅仅是一个窗口,并没有覆盖或跳转到新页面),尽管我学过一部分前端内容,具体有关它的内容我也不是非常了解,用我自己的理解就是,有frame与ifame标签的界面,需要先定位到此界面,再进行元素定位。结果确实是因为这个原因,登录界面被包含在了iframe标签中,因此在最开始的元素查找中是根本定位不到的。后面通过xpath方法定位到iframe标签界面后再进行定位输入框元素就可以正常运行了,不过我依然是报错,no such element,后面又花时间去找问题所在,发现,xpath路径其实就是给你把目标元素的位置写清楚,实质上还是通过class,id等属性标签定位到,而现在一般的网站都有反爬机制,网页的一些元素,他们的id甚至class等都是随机生成的,每次都不一样,而我在进行定位密码输入框的时候,用的xpath方法实质就是通过id查找,不过在新页面时,id早就刷新了,所以就定位不到。前面所说的xpath方法能够解决80%的前提就是正确使用xpath,那如何正确使用xpath呢?这个可以自行查找,我的问题也是其中一个比较常见的问题,就是xpath路径中存在变量,说一下思路,只需要把每一次它生成不变的部分给截下来就行了。这样以后,整个自动化登录就实现了,同理,后面的获取mooc具体作业截止时间或者具体作业内容就很简单了,基本都是确定的类名,不会有很大变化。

当然,肯定有更加简便的方法进行登录,例如token,session等,但密码输入登录是暴力的,几乎适用于所有简单登录(不需要验证码的)。后面我也将其用到了校园网自动登录中,每当电脑开机时,会自动登录校园网,解放双手。

毕竟是第一次接触这个东西,可能对于专门学习python的同学来说小菜一碟,甚至为了这些东西而发帖子有些招摇过市了,但毕竟是用几天中空闲时间实现出来的,而且确实遇到了太多的问题,不仅仅是我所列出来的这么多,还有很多很多细小的微妙的困难,不过后面也都通过许多途径找到问题解决了,在结尾我想分享下心得,在学习一个新内容的时候,往往实践是最重要的,也是最令人感兴趣的,中间遇到的困难就是塑造自己成长的阶梯,当你解决一个又一个问题后来自内心的开心,喜悦,自豪,成就感,你会发现你早已陷入其中,这可能就是工科的魅力,如果你遇到了一些困难,而又无从下手时,你可以放一下它,可能在某个吃饭的瞬间,睡前思路发散瞬间,亦或是某个视频,帖子,给予你灵感,茅塞顿开。山重水复疑无路,柳暗花明又一村。