放假了,没人比我更无聊,在家制作了一个selenium+python的微博自动转赞评程序。
程序分为四部分,依次是:登录+点赞+评论+转发,当点赞达到用户上限时去评论,评论至上限时去转发,出现验证码则退出程序。演示视频如下:
微博自动转赞评至上限程序
一、登录
二、点赞
点赞程序的基本原理就是,先让滚动条定位至待点赞的那一条评论,然后寻找赞按钮进行点击,这个操作好理解而且没什么难度。难点在于,当用户点赞数达到上限时,程序运行过程中会一直点击同一条评论的赞。原因是点赞数达到上限后,就算点击了赞按钮,系统也会取消该赞,该赞的状态还是like而不是liked,而程序的运行步骤是寻找like属性的赞进行点击,所以就会卡在一条评论上循环点赞,而不是跳出循环去评论。
这个时候,我找到的解决方法是这样的,创建一个列表,将点赞的内容通过list.append(target.text)放入列表,比较list[x]和list[x-1]的值是否一致,如果一致,表示两次定位like的内容是同一条评论,那么执行跳出程序。这里要注意的是,比较的条件要从x>=1开始,否则会报错,因为列表的第一项就是x[0],不可能和x[-1]比较。
判断点赞是否达到上限
因为我并非从事程序开发行业,只是觉得应该重拾自己的开发技艺,所以开始学习新技术并打算将学习过程记录下来,在编写这个点赞程序的过程中,我有以下总结:
1、break只能跳出当前循环,如果存在多层循环,如何做到终止内部循环连带外部循环一起终止呢?
我们可以用变量exit_flag来控制循环。编写条件判断,当exit_flag==0时,运行外部循环,当exit_flag==1时,break掉外部循环。exit_flag的初始值为0,当内部循环终止时,只需要让变量exit_flag=1即可。
2、try-except的用法
这里我拿滚动条举例,我希望程序自动跳过已经被点赞的内容去寻找还未点赞的内容,但寻找内容的过程中,很大可能性要用到滚动条将评论内容往下翻才能找到,这时候,就可以用try-except。
try-except控制滚动条滚动
运行try寻找状态为like的赞的位置,但凡try里面有一行程序是无法运行的,就会跳转至except,去执行except里面的程序。这样,就刚好能实现当无法在当前页面找到待点的赞,则滚动页面的功能。
三、评论
评论和转发相对于点赞,则简单很多,只需要找到相应的按钮元素,进行点击和发送即可。
这里的重难点同样是当评论达到上限时,会跳出2秒钟的提示框“您的评论太多,休息一会吧”并消失,那我如何判断是否弹出此提示框呢?我发现,虽然是弹窗,但这个弹窗是属于网页的一部分的,所以其元素仍然可以在网页中找到,关键在于,弹窗只有两秒钟的出现时间,我如何在短短两秒钟之内捕捉弹窗?
于是我采用了冻结界面的方式:在F12的 consle里输入——
setTimeout(function(){debugger;},3000),代表3秒后页面就被冻结。
在这里我们要凭感觉做的事情就是,在consle中按下回车键,让提示框在第3秒页面被冻结的那一刻出现就行了。
由此,我成功地判断了提示框是否弹出,如果提示框出现,则运行转发程序。
四、转发
转发和评论的原理一模一样,只不过是判断验证码界面是否弹出,如果弹出,就退出浏览器,即:wd.close()。
五、小结
做这个转赞评程序让我学会了如何使用selenium和python实现网页端的自动化。selenium的核心其实就是能够准确选择元素,通过绝对路径选、相对路径选、通配符选、属性选、范围选、组选、父节点选、兄弟节点选,反正就是各种选。
虽然使用最基础的选择方式是足够完成项目的,但我还是尽量多地混搭着选择方式在使用。区别在于:就像人们能靠最基本的两条腿走天下,但同时人们还可以选择坐SUV、坐飞机、坐火箭走天下一样,基本方法可以完成任何项目,利用更多的交通工具或许更高效。
selenium就学到这里,有一点遗憾的就是在这个项目中没有使用到ActionChains 类模拟鼠标右键点击、双击、移动鼠标到某个元素、鼠标拖拽等动作;没有尝试让浏览器直接运行一段javascript代码,并且得到返回值。只得等以后遇到“有缘分”的项目再来尝试。
毕竟程序就是这样,学基本语法规则如同走马观花,是假学,只有用起来才知道哪些是木棍可丢弃,哪些是尖刀可杀敌。