本文这个自动打游戏的demo,只是单纯地练习一下selenium操作。顺便回忆一下90后的生活,相信有一部分90后小时候还是玩过这个游戏的。
其他的模块我这里就不放代码了,毕竟等级不一样,代码可能没有通用性。而且主要的方法就是定位元素,主要是设置等待时长和注意异常情况的判断处理就可以了。
上面代码中的第14行是设置等待。直白一点就是:如果WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常。
selenium 网页游戏
可能很多90后都玩过乐斗Ⅱ。但是很遗憾,今天的主角不是它,而是它的兄弟——“Q宠大乐斗”。本文分享如何让“Q宠大乐斗”自动运行,自动打游戏。
Python爬虫入门(四):实战90年代三国单机游戏下载,爬取4399小游戏首页
很显然,需要的时候用。当你不希望某些爬虫访问某些页面时,robots协议就会派上用场。比如说百度的robots协议里其实禁止了360的爬虫(我大胆推测,因为写了很多爬虫就是没有写360,而且百度的robots.txt好像一年前就是这样了,360倒是写的很大方)。如果你希望爬虫爬取你网站的所有内容,最好直接不使用robots协议。
可以看出,robots协议只是告知爬虫哪些网站不能爬取,并没有真正的起到阻止爬虫的作用。事实上也存在一些排除爬虫的方法,比如检查UA头、高频率访问跳出验证界面、验证码(非机器人验证,谷歌不是最喜欢这个)、使用Ajax等,但这些方法要么妨碍了允许爬取的爬虫,要么甚至妨碍到了真人用户。
会玩|使用 Python + Selenium制作Flash游戏辅助
因为设置显示器大小为1366x768,这个网站在游戏加载后会有一个向下滚动使得游戏窗口位于屏幕中间的操作,因为游戏窗口相对于浏览器窗口向上移动了,所以截图出来的位置就会包含游戏窗口的下半部分和一百多像素的无关区域, 174根据截图位置进行调整的数值。我没在更大的屏幕上测试,也许不具有通用性。
对于个别图片,对其进行文字识别后根据位置判断文字信息类型的准确度还有待提高,因为结果中,有极少数还存在描述表达不通顺的情况。
本项目是在下载图片完成后回调函数来实现文字识别,可以改用生产者消费者模式实现进一步的优化升级,生产者负责下载图片,消费者负责识别文字。
程序效率还有很大的提升空间,主要是由于百度免费位置信息版文字识别的QPS限制减少了先后层数,从而增加了运行时间、降低了性能,在工作中如有需要可以购买QPS从而提高效率。
主函数中先判断并创建相应的文件(夹),并创建线程数为2的线程池,并循环将任务加入线程池且增加回调函数。同时对程序执行计时。
print('******程序执行结束,共计用时%d分%d秒。******' % (time // 60, time % 60))
调用requests库获取图片内容并保存,再通过线程池的回调实现实现文字识别并保存到csv文件中。使用百度文字识别时,使用位置信息版从而可以根据位置判断不同的文字信息类型,经过排除和判断得到需要的3种类型的文字信息。并且使用异常处理机制,在识别时遇到异常时能够及时处理。
如果使用单一的线程效率肯定会很低,因此在实现的过程中使用了生成器,并且建立了线程池,但是这个项目需要注意的是线程数量不能随意指定,因为 通用文字识别(含位置信息版) 的请求有限制,如下:
显然,4张图片的文字就不太一样,有的没有描述,有的有描述,并且有的只有一行,有的有两行,有的有三行,并且有的左右下角有数字,有的没有。显然对于全部图片情况会更加复杂,需要对每类文字的位置区间进行准确判断,给出最合理的判断边界,因为一旦估计不合理,就可能存在对于这张图片合适的位置区间对于另一张图片就不再适合,因此可能导致将文字放错类别,而不能准确得出该图片的信息的后果。
在识别的结果中,所有的数据都是以像素为单位给出的,以图片左上角为(0,0),向右为宽,向下为高,在对图片中不同类别文字信息的位置进行估计时,需要考虑到各种不同的情况,因为每张图片的文字情况可能不太一样,如下图:
很显然,我们只能通过根据位置定位不同的文字来实现,因为识别出的文字并不是完全有序,且可能出现识别识别的文字,我们可以使用排除法来精确定位:
在利用百度文字识别模块进行文字识别的时候,因为不同位置的文字代表不同的信息,所以需要使用 通用文字识别(含位置信息版) 来得到不同位置文字的位置信息,用于判断文字信息所属的类型,每天可免费调用500次,对于本项目来说,也足够了。
这两种方式都是用循环实现的,需要有一个退出循环的条件,否则会成为死循环。在该案例中,如果未加载到底部时,会出现下滑展示更多的提示,如下:
(3)手动下滑自动加载更多这种方式不需要点击按钮,只需要一直向下滚动,到了页面底部会自动继续加载,一直循环,直到内容全部加载完毕,例如本项目的目标网站,动态加载如下:
(2)手动下滑并点击加载更多这种方式是手动向下滚动加载,加载了一i的那个数量后需要点击加载更多或者类似的按钮,点击之后在同一网页继续向下加载,到了一定数量需要再次点击以加载更多……,如简书就是这种浏览方式:
这类网页要实现获取到所有数据据,可以通过selenium模拟点击页码或者调整URL中与页数相关的参数实现。通过selenium模拟点击的示例代码如下:
该项目的重点和难点有3个,分别是滚动加载所有图片、调用百度文字识别SDK定位角色、描述和技能的位置和实现多线程三国吞食天地网页游戏,下面一一进行讲解:
Selenium专门提供了Select类处理下拉框。其实WebDriver中提供了一个叫Select的方法,可以帮助我们完成这些事情:
有些时候,我们需要在页面上模拟一些鼠标操作,比如双击、右击、拖拽甚至按住不同等,我们可以通过导入ActionChains类来做到。
Selenium库里有一个叫WebDriver的API。WebDriver 可以控制浏览器的操作,它可以想BeautifulSoup或者其他的Selector对象一样用来查找页面的元素,与页面上的元素进行交互(发送文本、点击等),以及执行其他动作来运行网络爬虫。
如果我们把Selenium和PhantomJS结合在一起,就可以运行一个非常强大的网络爬丑,这个爬虫可以处理JavaScript、Cookie、headers,以及任何我们真实用户需要做的事情。
PhantomJS 是一个基于Webkit的“无界面”(headless)L浏览器,他会把网站加载到内存并执行页面上的JavaScript,因为不会展示图形界面,所以运行起来比完整的浏览器更高效。
Selenium自己不带浏览器,不支持浏览器的功能。它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行,所以我们使用一个加PhantomJS的工具代替真实的浏览器。
Selenium 是一个Web的自动化测试工具,最初是为网站自动化测试而开发的。类型像我们玩游戏用的按键精灵,可以按指定的命令自动化操作,不同是Selenium可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。
专题: 三国单机游戏 单机小三国游戏 仙三国单机游戏上一篇akinator网页游戏
下一篇网页游戏gongjian