1. 程式人生 > 程式設計 >selenium 反爬蟲之跳過淘寶滑塊驗證功能的實現程式碼

selenium 反爬蟲之跳過淘寶滑塊驗證功能的實現程式碼

在處理問題的之前,給大家個第一個錦囊!

你需要將chorme更新到最新版版本84,下載對應的chorme驅動 連結:http://chromedriver.storage.googleapis.com/index.html
注意 劃重點!!一定要做這一步,因為我用的83的chorme他是不行滴,~~~~~~~

問題

1.一週前我的滑塊驗證程式碼還是可以OK的,完全沒問題!附程式碼 low一眼

url = "https://login.taobao.com/member/login.jhtml"
browser.get(url)
browser.maximize_window() # 最大化

# 填寫使用者名稱密碼
user = '*****'
password = '*******'
time.sleep(8)

iframe = browser.find_element_by_xpath('//div[@class="bokmXvaDlH"]//iframe')
print(iframe)
browser.switch_to.frame(iframe)
browser.find_element_by_xpath('//*[@id="fm-login-id"]').send_keys(id)
browser.find_element_by_xpath('//*[@id="fm-login-password"]').send_keys(password)
time.sleep(2)
# 獲取滑塊的大小
span_background = browser.find_element_by_xpath('//*[@id="nc_1__scale_text"]/span')
span_background_size = span_background.size
print(span_background_size)

# 獲取滑塊的位置
button = browser.find_element_by_xpath('//*[@id="nc_1_n1z"]')
button_location = button.location
print(button_location)

# 拖動操作:drag_and_drop_by_offset
# 將滑塊的位置由初始位置,右移一個滑動條長度(即為x座標在滑塊位置基礎上,加上滑動條的長度,y座標保持滑塊的座標位置)
x_location = span_background_size["width"]
y_location = button_location["y"]
print(x_location,y_location)
action = ActionChains(browser)
source = browser.find_element_by_xpath('//*[@id="nc_1_n1z"]')
action.click_and_hold(source).perform()
action.move_by_offset(300,0)
action.release().perform()
time.sleep(1)

# 登入
browser.find_element_by_xpath('//*[@id="login-form"]/div[4]/button').click()
print('登入成功\n')

完全可以會很好的進入淘寶,遊刃有餘
2.淘寶爸爸一週後就給我潑涼水,增加了自己的反爬蟲機制,出現如下錯誤。

在這裡插入圖片描述

剛開始我以為是我頻繁登入,導致淘寶的機器人識別我為程式碼進入。一般之前都是會在30分鐘內解封。結果一天之後還是存在這個問題。查閱資料,翻了我的葵花寶典還是沒有解決辦法。後來看到一個文章,可能是淘寶再次更新了自己對selenium的驗證,導致我不在成為漏網之魚。唉唉唉,導致我3天沒有解決。現在我把自己的坑和解決辦法給大家分享一哈。成功的再次成為漏網之魚,哈哈哈!

步驟

1.首先很多熟悉JS的人都知道淘寶會檢測window.navigator.webdriver(js檢測特徵之一),但是即使設定了"undefined"還是敗下來,看看

在這裡插入圖片描述

2.這時候細心的就需要觀察一下他的全域性JS,(這個是我參考別人的思路)你會發現淘寶爸爸在你瀏覽器內建的JS中有這麼一段恐怖的程式碼

在這裡插入圖片描述

就是這個標黃色的東西,不會容易被發現的東西被檢測到你是selenium進入,是不是特別坑!那我們接下來就需要幹掉他。
3.這個時候仔細想一下,我們是通過什麼開啟瀏覽器呢?是的,知道的都會說webdriver.exe這個驅動。那我們就從他開始下手,當你開啟webdriver.exe它後你會發現其中的問題!
注意:劃重點!!!怎麼開啟和修改webdriver.exe。很多人都是亂碼,之前我看到Windows系統採用nodepad++去開啟就可以了,注意我的不行!你們可以試一下。(有的人是可以的,但是我的老師電腦不可以),然後我就找了一個辦法,需要大家會一點vim操作,很簡單的!準確的說就是Linux去解決,因為他不存在編碼問題,不會像傻Windows,特別蠢!!開發人員最好還是用Linux系統吧!

經過我認真不負努力的搜尋,誒找到一個靠譜的文章,哈哈!外國的‘知乎'
文章連結:https://stackoverflow.com/questions/33225947/can-a-website-detect-when-you-are-using-selenium-with-chromedriver
就是他!

在這裡插入圖片描述

就是這段翻譯後的操作。
注意 劃重點 !!採用Linux系統的vim進去後你看到的也是亂碼!!哈哈,but和Windows的亂碼是不一樣的,他會讓你找到“$cdc_asdjflasutopfhvcZLmcfl_”這個字串的,神奇吧。這就是Linux的強大!!
不會Linux命令的童鞋可以自己搜尋一下,很簡單的。修改後記得要儲存哦!

4.可能大家覺得到這裡就可以了,NO NO NO 這樣子你還是登入不掉的。需要最後一個錦囊妙計!!
具體就是 你需要關閉chorme開發者模式,關閉自動測試狀態,還需要將大家都熟知的把window.navigator.webdriver設為"undefined"。可能說的不太明白,圖片幫你理解

在這裡插入圖片描述

# chrome_options 初始化選項
  chrome_options = webdriver.ChromeOptions()

  # 設定瀏覽器初始 位置x,y & 寬高x,y
  chrome_options.add_argument(f'--window-position={217},{172}')
  chrome_options.add_argument(f'--window-size={1200},{1000}')

  # 關閉自動測試狀態顯示 // 會導致瀏覽器報:請停用開發者模式
  # window.navigator.webdriver還是返回True,當返回undefined時應該才可行。
  chrome_options.add_experimental_option("excludeSwitches",['enable-automation'])

加上這個程式碼會關閉“正受到自動測試軟體的控制“的顯示

在這裡插入圖片描述

# 通過瀏覽器的dev_tool在get頁面錢將.webdriver屬性改為"undefined"
  driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{
    "source": """Object.defineProperty(navigator,'webdriver',{get: () => undefined})""",})

加上這個程式碼可以關閉開發者模式

在這裡插入圖片描述

# 通過瀏覽器的dev_tool在get頁面錢將.webdriver屬性改為"undefined"
  driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",})

最後我們通過提前執行js的方法,把window.navigator.webdriver設為"undefined"!
OK !!大功告成!!通過這麼一步步下來,你會發現 我的天居然沒有滑塊!開森!!

總結

到此這篇關於selenium 反爬蟲之跳過淘寶滑塊驗證(2020/8)的文章就介紹到這了,更多相關selenium 跳過淘寶滑塊驗證內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!