哈嘍大家好,我是鵬哥。
今天要記錄的內容是 —— 破解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.2
from selenium import webdriver
from 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吧!