几天前, 我母上大人在我们家群里发了一条消息
![c5dee1c81244625d016fd4a82653ff3d.png](https://i-blog.csdnimg.cn/blog_migrate/9e55ef356cd9227eb84f5a60cd2cd299.jpeg)
![98621e50ed20fa0ff9e3b1b4b17db128.png](https://i-blog.csdnimg.cn/blog_migrate/26c80a01278dcc929e2ca92d9c7137e4.jpeg)
一看这文案, 就知道又是一个骗流量的小游戏, 一看就让人没什么兴趣... 但是出于对我母上大人的尊(hào)重(qí)我还是点进来看了一下
游戏链接:
http://wap.jue-huo.com/app/html/game/1to50/1to50.html
![b5d9911343ed238d85d857722359219d.gif](https://i-blog.csdnimg.cn/blog_migrate/6903164af9786f59f93b5f0980d5ce2a.gif)
游戏规则十分简单, 按顺序从1点到50
在25或者之前, 点完的数字方块会变成一个25之后的, 比如1点完可能变成37, 然后2变成41这样子
... 然后Sushi就开始了疯狂刷分
![e6e182342616055a350d4c3d0361f9f9.png](https://i-blog.csdnimg.cn/blog_migrate/f5c65b6e887af6e12e1a5cd975d57d1b.jpeg)
![cab450c1990928243f235e2cc4d89eb4.png](https://i-blog.csdnimg.cn/blog_migrate/4c72b8e46a8adb4e31e89f9107b63241.jpeg)
![2e5450a877ee8d63822396b6409f00ab.png](https://i-blog.csdnimg.cn/blog_migrate/ba68ff817df663deafa89cc2d3e914b1.jpeg)
难啊!
然而我怎么能被这种小游戏难倒, 怎么都得进30秒吧
一定是我不适应手机, 用电脑试试!
![1ff7173de7149cb3b448bcb353bed6bc.png](https://i-blog.csdnimg.cn/blog_migrate/c170c0388b6d5845687b6212264c7f3b.jpeg)
"正常人, 做正常事"... 我的智商仿佛受到了歧视! 不可以!
多次尝试之后我发现这个游戏在你点错的时候没有任何惩罚, 继续点下去就好了, 于是乎我就开始扇我手机耳光
![e8cf7d9ba7966ec6e5ced7ac2ffe761c.png](https://i-blog.csdnimg.cn/blog_migrate/a97658ac48b4ec3d994271e8cc85e1b9.jpeg)
结果是啥都按不到, 玩了10多秒还没按到3...
很快我就开始寻找能全面按到屏幕的物品, 一无所获
就在这时, 我灵光一闪
![b210c17d3bc6357d74ad4a7ec625ec32.png](https://i-blog.csdnimg.cn/blog_migrate/231c8afcb174c88870f4d3c1039d28fa.jpeg)
我可以用selenium整个屏幕点过去!
SELENIUM
selenium 是一个浏览器自动化(Web Browser Automation)的程式. 可以通过代码来对一个网页进行一些操作, 例如点击, 滑动等等
官网: https://www.seleniumhq.org/
很快就发现这个想法非常可行, 但是很智障, 我既然都自动化了, 直接搜索特定的方块点击不也可以么? 开肝!
我其实花了好久好久才真的开始, 因为我手欠的把macOS更新到了Catalina, 然后anaconda和之前安装的库啥的都没了, 其中也包括了selenium, 我一直尝试修复, 最后还是没有逃过重装conda的命运
珍惜生命, 请勿升级
正文
要使用的工具有:
- Python 3.x (我使用的是anaconda 3.7)
- Selenium
- 编辑器: Atom
00
最开始肯定是先导入库
没有安装selenium的请 pip install selenium
from selenium import webdriver
01
新建一个driver, 我选择Chrome, 如果提示driver版本不兼容的话, 就需要重新下载Chrome Driver, 链接: https://chromedriver.storage.googleapis.com/index.html
from selenium import webdriver
driver = webdriver.Chrome()
02
打开网站...
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://wap.jue-huo.com/app/html/game/1to50/1to50.html")
03
循环, 从1到50, 这样之后我们就可以通过循环变量 i 来搜寻需要被点击的方块了
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://wap.jue-huo.com/app/html/game/1to50/1to50.html")
for i in range(1, 51):
pass
04
这时候我们需要寻找对应的数字方块并且点击
打开网页, 我们能看到每个颜色方块的样子是
![b8cfaeaea6937c72437651d25c90f0e3.png](https://i-blog.csdnimg.cn/blog_migrate/246410cb20397a0419cd4da49240782f.jpeg)
我其实对html不怎么了解, 但是大概能看出
- 数字在div里面
- div里面除了数字还有一个span
- div有一个style, 值为"opacity: 1;"
span可以不用理会, 我们需要点击的内容可以用两个条件筛选出来, 分别是
- style是 "opacity: 1"
- 内容为 数字
这时候就会用到一个很高大上的东西叫做xpath
xpath cheat sheet: https://devhints.io/xpath
在xpath里面, 通过这两个条件筛选的语句是:
//*[@style="opacity: 1;" and text() = '{}'] # {}里面是当前数字
这时候可以把xpath另存为一个字符串变量, 但是我懒, 直接搜索了:
for i in range(1, 51):
driver.find_element_by_xpath("//*[@style="opacity: 1;" and text() = '{}']".format(i))
上面这个语句返回的是一个web element
而我们要做的事情就是点他
和xpath一样, 可以重新把element赋值给一个变量, 但是我省一下行数, 直接在最后加上.click()好了
for i in range(1, 51):
driver.find_element_by_xpath("//*[@style="opacity: 1;" and text() = '{}']".format(i)).click()
05
最后一步, 你们可能发现每次点完他有一个动画需要加载, 新的方块才会出来, 运气不好的话你点完25的时候26还没出现, 所以需要等待
可以判断等i到了25之后等待, 不过我就直接没点一次都等待了, 这里用的是python的time.sleep, 不过好像大佬们都建议用driver的implicit wait
完整代码:
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get("http://wap.jue-huo.com/app/html/game/1to50/1to50.html")
for i in range(1, 51):
driver.find_element_by_xpath("//*[@style="opacity: 1;" and text() = '{}']".format(i)).click()
sleep(0.05) # removing this may make the program run faster, but the 26th div might not be loaded yet, which will make my code crash
结尾
代码特别简单, 到这里就结束了, 一个特别简单的脚本
同时也希望这个教程能帮助你们对selenium有一个简单的了解
好了我知道实际上代码不止5行, 但是import啥的不能算的嘛