知乎更新了接口,现在不能够直接输入用户名、密码然后点击登录按钮弹出验证码了,具体的我看了下慕课其他同学的问题和老师的回答,参考使用selenium接管Chrome浏览器,百度了以下,找到两种方法,一种是使用代理,也就是mitmproxy,安装这个第三方库,然后设置本机代理ip地址,开启8001端口,让流量都走这个端口,然后进入mitmproxy状态编写干扰脚本,重新用命令行启动mitmproxy干扰脚本 监听8001端口的请求与响应,启动webdriver 顺利获得cookies。(参考来源:selenium爬虫被检测到 该如何破?)第二种是通过Google Chrome的Console中输入window.navigator.webdriver就可以查看非selenium环境下其值为undefined,而在selenium环境下,其值为true,如下所示:
反正还有一些JS预定义的变量可以检测出来是不是在用selenium,可以被检测出来,知道其原理后就可以通过mitmproxy类型代理工具,修改js文件,替换文件内所有变量关键词,或者将其不可执行,从而避免被识别。
和上面相同,还有一种就是配置Google Chrome可执行程序到系统环境变量,然后添加启动参数,使其在运行时不被检测出是webdriver。
我无意中摸索出来一个可以模拟出点击登录,虽然不能成功,但是可以弹出验证码的方法,也就是在密码输入框后添加一个KEY.ENTER,模拟按键回车键,然后再模拟点击登录按钮,就行了。然后进入Console可以看到被拒绝的信息:
{ "error": { "code": 10001, "message": "10001:\u8bf7\u6c42\u53c2\u6570\u5f02\u5e38\uff0c\u8bf7\u5347\u7ea7\u5ba2\u6237\u7aef\u540e\u91cd\u8bd5" } }
通过Google Chrome的Console输入:
alert("\u8bf7\u6c42\u53c2\u6570\u5f02\u5e38\uff0c\u8bf7\u5347\u7ea7\u5ba2\u6237\u7aef\u540e\u91cd\u8bd5")
即可解析出来消息的内容:
原因你懂的,被检测出来是selenium环境,具体怎么解决还不知道,希望老师指点一下。
带你彻底掌握Scrapy,用Django+Elasticsearch搭建搜索引擎
了解课程