【Python成长之路】破解Boss直聘网站滑块验证 - Go语言中文社区

【Python成长之路】破解Boss直聘网站滑块验证


 

哈喽大家好,我是鹏哥。

 

今天要记录的内容是 —— 破解Boss直聘网站的滑块验证。

 

 

…… 上 课 铃……

TuesdayBurak Yeter;Danelle Sandoval - Tuesday

1

写在前面

最近领导安排我投入公司招聘工作,然后自然就需要不停地在boss直聘网上进行人才搜索。搞了几天我就觉得无趣又繁琐,那就干脆爬虫下吧。由于boss直聘网站的网页设计代码写的比较好,获取元素也很方便,因此不到十分钟就写完了界面登录的selenium代码。原以为很简单的滑块验证,却让我烦恼了好久!

下面让我一步步来讲下我遇到的坑以及相应的解决方法

2

跳坑过程

# coding=utf-8# @公众号 : "鹏哥贼优秀"# @Date : 2020/3/20# @Software : PyCharm # @Python version: Python 3.7.2from selenium import webdriverfrom slide_solution import *import time
def visit_website(url):    driver = webdriver.Chrome('F:\Python成长之路\chromedriver.exe')    driver.maximize_window()    driver.get(url)    time.sleep(1)    # 输入帐户密码    driver.find_element_by_name('account').send_keys('手机号')    driver.find_element_by_name('password').send_keys('password')    slide_btn = driver.find_element_by_css_selector('span[class="nc_iconfont btn_slide"]')    # 滑块解决方法1    slide_solution1(slide_btn,driver)
    time.sleep(1)    driver.find_element_by_class_name('btn').click()    time.sleep(5)    driver.quit()
if __name__ == "__main__":    url = 'https://login.zhipin.com/?ka=header-login'    visit_website(url)

    这是登录boss的主要代码,其中滑块验证的代码我是这么写的:​​​​​​

def slide_solution1(slide_btn,driver):    action = ActionChains(driver)    action.click_and_hold(slide_btn).perform()    for i in range(200):        try:            action.move_by_offset(i*2,0).perform()        except:            break        action.reset_actions()        time.sleep(0.1)

        我按每0.1移动2个像素的速度,将滑块从最左边移到右边,从现象来看效果也是可以的,滑块的确移过去了。(其实也可以不用慢慢移动,可以直接action.move_by_offset(276,0).perform()来直接实现,276是滑块验证的像素长度)。

但是坑来了!

代码移动滑块后,界面报错如下:

尝试解决方法1:

一开始针对这种问题,网上资料是比较多的,我很快就知道了,是因为网页的window.navigator.webdrive字段设置为true。从大神们的博客中了解到,相当于网站通过这个字段可以知道chrome是人为打开,还是代码启动的。因此,相应的解决方法很快出来了。​​​​​​​

# 配置window.navigator.webdrive    option = webdriver.ChromeOptions()    option.add_experimental_option('excludeSwitches', ['enable-automation'])    driver = webdriver.Chrome('F:\Python成长之路\滑块问题\chromedriver.exe',options=option)

在启动chrome时,添加option,即停用开发者模式,这样就可以解决window.navigator.webdrive问题了,如下图所示。

尝试解决2:

很快我再次重试滑块时,发现仍然报一样的错误。这时候,网上的资料基本就不多了,对我的帮助也比较少。我猜测,可能是 ActionChains库的问题,有可能被网站检测到了。因此我想到了sikuli jar包。这个方法几乎可以实现任何的界面自动化,想了解的同学可以参考:

【Python成长之路】基于sikuli jar包,实现淘宝自动抢单功能(1)

这里相应的滑块移动代码如下:​​​​​​​

def slide_solution2():    jvmPath = jpype.get_default_jvm_path()    # Djava.class.path是本地的sikuliapi.jar包路径,需要提前下载好    jpype.startJVM(jvmPath, '-ea', '-Djava.class.path=F:\sikuli\1\sikulixapi.jar')    Screen = JClass('org.sikuli.script.Screen')    myscreen = Screen()    myscreen.drag('start.PNG','end.PNG')    time.sleep(0.5)

    对应的图片如下:

end.png

       start.png

因为从我的理解来看,用sikuli库相当于就是人为操作鼠标进行移动。结果很不幸,还是一样的报错!我去!这也不行?

然后我在打开的chrome界面,手动滑动滑块,发现也是报错。这时候,我觉得可能是chrome启动时就以为被判定为非人为操作,因此无论后面仍然的操作,都会失败!

3

滑块验证最终解决方法

看到一篇大神的文章《python selenium滑动验证防检测》(http://www.py3study.com/Article/details/id/19698.html),作者将chromedriver.exe文件进行了反编译并修改。竟然还有这种操作!

(1)下载wxMEdit工具,并打开chromedriver.exe;

(2)将key值 中$cdc改名,如下,改成$abc

(3)保存新的chromedriver.exe文件

(4)将代码中的chromedriver.exe替换成修改后的exe

成功了!

4

滑块验证的另一种解决方法

在查找资料时,发现有大神说,如果用firefox浏览器代替chrome,相同的代码可以直接成功!这个方法我就没去尝试了,需要下载特定的旧版本firefox,以及下载对应的驱动文件。不过网上关于firefox安装selenium插件的资料还是挺多的。

5

总结

在查找滑块解决方法时,很多同学都遇到了相同的问题,为了后续方便其他人跳坑 ,因此想到写些博客,方便后来的同学吧!

如果有同学需要,可以访问以下网站获取代码及修改后的chromedriver.exe:https://github.com/yuzipeng05/slide_solution.git

 

…… 下 课 铃……

 

【往期热门文章】:

【Python成长之路】10行代码教你免费观看无广告版的《庆余年》腾讯视频

【Python成长之路】如何用python开发自己的iphone应用程序,并添加至siri指令

【Python成长之路】从 零做网站开发 -- 基于Flask和JQuery,实现表格管理平台

点击下方诗句,可以留言互动喔  

你对的人,正在马不停蹄,披星戴月,风雨兼程,你在等等。

 

【关注“鹏哥贼优秀”公众号,回复“python学习材料”,将会有python基础学习、机器学习、数据挖掘、高级编程教程等100G视频资料,及100+份python相关电子书免费赠送!】

 

扫描二维码

    与鹏哥一起

学python吧!

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/yuzipeng/article/details/105177186
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-04-18 20:32:41
  • 阅读 ( 928 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢