概述
爬虫实战项目。
爬虫利器:selenium的使用。
任务介绍
最近刚刚注册了某个网站:HDHome,该站有新手考核任务,其中有一项是需要达到魔力值5000。在魔力值获取方式中,我们看到这一项:“说谢谢 = 0.5个魔力值”,而网站存活种子数量达到16000+,也就意味着对每个种子说一下谢谢,轻松达到8000+的魔力值,于是,这个项目应运而生。
实现思路:
获取种子的页面,在每个页面中找到说谢谢的按钮,并点击后,关闭。依次进行下去即可。
相似任务:
实现对某论坛的自动回复,实现自动获取所有帖子的信息等等相关操作,无论是否需要模拟登录、模拟鼠标操作还是直接解析网站元素。
selenium 牛刀小试
首先导入相关的库:
这是整个程序里面用到的所有内容。
其中,webdriver是主浏览器,selenium都是基于整个浏览器的对象;WebDriverWait、EC、By是等待网页元素加载相关的操作;Keys是键值,如Keys.CONTROL,Keys.ENTER等等,ActionChains是用鼠标进行一系列的操作。
webdriver可用的浏览器有:
一开始我选择的是Chrome浏览器,后来改为了Firefox火狐。Chrome浏览器在执行单个元素(如验证码)截图时有坑(下文有详细说),所以后来才用的Firefox。此外,PhantomJS是匿名浏览器,没有显式的窗口。
那么,开始写程序吧。
首先,实体化浏览器driver,执行driver = webdriver.Firefox()这句的时候,就会有firefox浏览器弹出来了。当执行到driver.get(login_url)时,浏览器转到相应的网址,后面的while语句是用来等待我们手动登录的,当我们手动登录成功后,会进入到"http://hdhome.org/index.php",与login_url及login_failed_url都不同。接着便可以做自己想做的事情了。
我们发现单个种子的网址是类似这样的:
i可以从1到30000多。于是,我们可以这样写程序,依次对每个种子执行“说谢谢”操作:
其中,我们使用try、except、finally语句来尝试定位到’saythanks’说谢谢的按钮元素。由于有时候加载较慢就会找不到,或者是这个种子已经被删除了,所以也导致找不到该元素。
其中定位网页元素的方法有一下几种:
从上面可以看出,我们也可以用find_element_by_id("saythanks")同样可以找到说谢谢的按钮。
附上到目前为止的所有程序:
GitHub地址1
完整程序中加上了logging模块,将输出日志也导入到了文件,方面以后查阅。
改进一:使用多线程多标签
在上述模块中,可以看到,我们按照种子的顺序依次进行相应的操作。在种子数量很多的时候,会显得很慢,于是,有了这个改进:使用多线程。
我们使用multiprocessing库。
先来看一个使用该多线程库的示例程序:
于是,模仿上述程序,我们也使用多线程来执行说谢谢。说谢谢的过程其实有两步:一是打开网页,二是对每个网页定位到每个元素并点击。
如果对一、二两个步骤都执行多线程会出错,可能是由于多窗口的原因。因此我目前只对打开网页的步骤执行了多线程的操作。
上述也提到了,要同时打开多个窗口,则需要使用浏览器的多标签功能。打开一个新的标签的程序需要执行js脚本,如下:
于是多线程部分的改进如下:
为了不让浏览器检测到,我只是用了三个线程,可以适当的增加。saythanks()下面的部分程序是为了增加更多的延迟并且显示相应的信息。其中if t % 5 == 0:中,我们移动到主页上,进行刷新操作,然后定位到用户信息那一栏:
这个部分使用了re正则项来找出当前的魔力值以及用户名,并显示出来。
其中,说谢谢的程序也需要对多标签进行相应的改进,程序如下:
通过在不同窗口的句柄之间移动,来依次进行说谢谢的步骤。
在每个网页加载的时候,我们执行了等待的操作:
一直等到最外层的元素出现。我选择的”outer”这个元素,是在无论这个种子是否存在的时候都会出现的。
将窗口转移到最后打开的那个窗口。
关闭当前的个窗口,并转到当前的最后一个窗口。需要注意的是:窗口虽然关闭了,但是,driver依旧会停在那个已经失效的窗口,并不会自动的转到新的窗口(虽然在浏览器中看上去到了新的窗口),所以,需要我们自己手动的移动窗口的句柄。
这边还存在一个问题,就是多标签的时候,自动切换标签的时候,浏览器会自动弹出来。这样子便有点烦人,毕竟我们只是想让他在后台自己跑, 所以,我加上了一个虚拟窗口,使用的是pyvirtualdisplay库。
以下是pyvirtualdisplay库在ubuntu中的安装步骤:
下面是pyvirtualdisplay具体的使用方式:
把虚拟窗口放在一开始处的位置即可。
也可以将visible改为0,浏览器就完全不可见了。
最后附上这个阶段的完整程序:
github地址2
改进二:验证码保存+面向对象编程
验证码保存:
其中,验证码保存步骤使用了selenium自带的元素截图功能,而不是全屏截图。这边正是我从chrome浏览器改为firefox浏览器的真实原因。chrome浏览器中的元素截图不可用!会报错!故此选用firefox浏览器。
面向对象编程就是对函数使用了类,把多个函数合并到了同一个类中去。
完整程序在最后给出。
改进三:使用pyqt获得验证码图片
思路是:从网页中解析到验证码的图片,然后下载到本地;接着使用pyqt弹出一个窗口,窗口中显示获取到的验证码,手动输入验证码后点击关闭。
简化了每次登录的流程,账号、密码记录在程序中自动输入,只需要手动输入验证码。
其中,基于pyqt5图形界面的窗口部分的程序如下:
之前学过qt的同学看起来应该不困难,没有学过qt
的同学想要入门的话建议查看官方文档或者小甲鱼论坛的pyqt连接。
最后附上完整的程序:
github地址3
最后
以上就是狂野短靴为你收集整理的python爬虫模拟点击和输入,python爬虫实战--selenium模拟登录并自动点击的全部内容,希望文章能够帮你解决python爬虫模拟点击和输入,python爬虫实战--selenium模拟登录并自动点击所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复