被反爬虫搞到心态崩溃
话说学编程这几年,遇到的问题也不少,唉声叹气的倒不是很多,这不,今天就遇到一件,撞到反爬虫界的流氓,学生党兼个职也不容易啊,深夜发文恳求懂的高手赐教破解之法。
故事的起因是这样的:
客户要求我调联通的接口,查询用户套餐相关的信息。就这么简单一件事。这个系统就是以前大家不用支付宝,不用微信去店里充话费的那个系统。标准的老系统,渲染引擎为IE7,这么大个公司还用这么老的系统?。
下图呢就是客户给的,一句话的需求+这张图。看到的时候我不屑一顾,就这?就这?
既然我们要调这个里面的接口,肯定需要先登录,我们来看看登录页面。这个系统只能通过IE访问,并且要安装额外的应用程序,授信证书。
https://cbss.10010.com/essframe
分析下这个登录,行家一看就知道最难的还是验证码。我也是这么想的!但是验证码这个东西能挡得住我吗?因为考虑到这个安装了额外的程序,而且debug模式一开这页面就暂停,选择元素都不行,看DOM麻烦许多,一点登录,用户和密码就变了,疑似Base64编码。有可能这个东西吧,有鬼!所以我决定,用最爽的方法,Selenium!管你加密得再好,在我Selenium面前,还不是乖乖的把数据端上来。况且我也急着交差啊,没那么心情分析JS过程。
于是我就先处理验证码,我先把验证码调色,处理,把横线处理掉,然后用tesseract进行识别。效果还凑合。所以这一步也没啥好谈的,直接把甲方给的账号密码、识别的验证码弄上去。记得在这里我获取登录按钮的时候,出了点问题,具体我有些忘了,最后是通过查看源码直接用Selenium执行JS方法提交的。因为这个页面不是很好看源码,我用Fildder抓下来看的。这是登录进去的样子。
嘿,我都用代码登录进去了,后面的还不是我想这么搞就怎么搞?结果,问题来了。这个页面是由很多的frame组织的,debug也被限制,很难看。要依次点过去找来找去还是比较麻烦,而且这些按钮看起来像是编号的,花一些功夫总算知道路径了,一调用点击吧不是没反应,就是显示了其它内容去了···········澄清一下,我确认了frame。但是我手动点就没事。后来我一生气,也不想依次点过去了。就直接找到它操作。
但是问题不断,这一点直接把这个目录树的frame变成查询的页面了,而且这个frame的宽度太窄了。没办法,本来想着很简单的事情。结果一顿操作猛如虎,一看结果丑到哭。于是只好分析JS和DOM。憋了下面两行代码。
js = "document.getElementById('fset').cols='1000,88,500,2'"
dr.execute_script(js)
js = "openmenu('/ambillquerypls?service=page/acct.billquery.realtimemonthlybill·········省略');"
dr.execute_script(js)
终于,让我顺利的进入了查询界面,而且还是单独的,觉得这事总算要到头了,没想到,哎
在这个地方看似容易,实际上大大的不容易。看起来很简单,实际上:
1、查询按钮获取后点击没用,JS点、Selenium的click。最先我想可能是用什么元素盖住了查询按钮,点击的时候实际上是点击的这个透明的元素,只是因为DOM不是很好看所以我没找到。
2、如果使用js的方法设置业务号码的值、或者用Selenium的send_keys,绝对不行,设置值可以,没问题,但是只要点击查询,铁定查不不出来。我想可能是输入框绑定了事件,这样的话输入的时候有额外处理,不能直接填值。但是我发现我手动粘贴号码是可以正常使用的,于是,我就用代码对Windows粘贴板操作,这里又有一个问题,只要使用js,input.focus()去让input获得焦点,必然会导致最终查询获取不到结果,我也没想出来,这到底是为什么!
粘贴板本身是可以用的,我测试过纯粘贴,其它什么都不做,手动点击查询是可以的,证明粘贴是可以的。
······································
好吧好吧,这些困难我就不提了。你以为你牛是吧,我还有绝招,这你总拿我没办法吧,看看我写的什么:
with open("telephone.txt") as f:
telephone = f.readline()
x = dr.find_element_by_tag_name("input").location['x'] + 20
y = dr.find_element_by_tag_name("input").location['y'] + 75
pyautogui.moveTo(x, y,duration=0.1)
pyautogui.click()
time.sleep(1)
set_text(telephone) # 设置号码到粘贴板
# Ctrl+v 粘贴操作
win32api.keybd_event(17,win32api.MapVirtualKey(17,0),0,0)
key_press('v')
win32api.keybd_event(17, win32api.MapVirtualKey(17, 0), win32con.KEYEVENTF_KEYUP, 0)
time.sleep(3)
x = dr.find_element_by_id('query_btn').location['x'] + 10
y = dr.find_element_by_id('query_btn').location['y'] + 70
pyautogui.moveTo(x, y,duration=0.1)
pyautogui.click()
没有错,直接控制鼠标,移动到输入框,粘贴号码-》然后点击查询按钮。这没什么问题吧,我就不相信你个网页还知道鼠标不是人操作的!
结果打脸了,彻底让我不知所措。鼠标不是人操作的也能检测出来吗?
这个网页只要是正常操作,就是人去输入,点击,就一点问题没有,只要是机器操作的,一定查询不出来。只要机器操作了,错误后就一直错误,必须重新登录进入这个页面。一般还要清理缓存。
到底是不是这个网站要求安装的程序和IE有什么关联,检测出来的,涉及到知识盲区了。
本文地址:https://blog.csdn.net/qq_32793045/article/details/107479366
上一篇: 安卓时间戳转成时间存在误差
下一篇: 40 个 CSS 布局技巧
推荐阅读