【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吧!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章