滑塊驗證之反反爬
阿新 • • 發佈:2021-08-03
問題
在正常登入時,我們手動劃過滑塊是可以的,但採用selenium時遇到滑塊怎麼辦呢?
方案
常規的解決方案2種:
1. 下載該圖片,採用機器學習識別出缺省的圖片特徵,記錄預設位置的座標。再通過selenium的滑動方法滑到指定座標。
2. 通過手動划過去,遇到滑塊時我們在腳本里不管它,直接走划過去之後的流程。
鑑於時間與學習成本,通常我們採用的是第二種方式,即人工划過去。
問題升級
然而理想是好的,如果網站對selenium做了反爬處理,那麼手動也劃不過去。
也就是說,我們正常登入網站沒問題,但是用selenium登入就過不去啦。
該怎麼辦呢?
方案升級
1. 通過中間人代理-mitmproxy,可惜該方法也是有一定機率通不過的。
from mitmproxy import ctx def response(flow): """修改應答資料 """ if '/libs/greenseer.' in flow.request.url: # 遮蔽selenium檢測 for webdriver_key in [ 'webdriver', '__driver_evaluate', '__webdriver_evaluate', '__selenium_evaluate', '__fxdriver_evaluate', '__driver_unwrapped', '__webdriver_unwrapped', '__selenium_unwrapped', '__fxdriver_unwrapped', '_Selenium_IDE_Recorder', '_selenium', 'calledSelenium', '_WEBDRIVER_ELEM_CACHE', 'ChromeDriverw', 'driver-evaluate', 'webdriver-evaluate', 'selenium-evaluate', 'webdriverCommand', 'webdriver-evaluate-response', '__webdriverFunc', '__webdriver_script_fn', '__$webdriverAsyncExecutor', '__lastWatirAlert', '__lastWatirConfirm', '__lastWatirPrompt', '$chrome_asyncScriptInfo', '$cdc_asdjflasutopfhvcZLmcfl_' ]: ctx.log.info('Remove "{}" from {}.'.format(webdriver_key, flow.request.url)) flow.response.text = flow.response.text.replace('"{}"'.format(webdriver_key), '"NO-SUCH-ATTR"') flow.response.text = flow.response.text.replace('t.webdriver', 'false') flow.response.text = flow.response.text.replace('ChromeDriver', '')
2. 構造cookie
假如你之前沒有過cookie登入該網站的先例,那麼下面的忽略。如果有,可以繼續往下看。
眾所周知,selenium支援新增cookie的方法,我們需要構造出cookie檔案。
如果之前用cookie登入過而且cookie沒過期,那麼可以直接用。如果cookie過期了,觀察之前的cookie檔案特徵,需要修改過期的關鍵字expiry對應的值,以及與session對應的關鍵字的值,具體還需要哪些值得根據cookie檔案的特徵來,這就需要我們敏銳的判斷力了。
總之,每一次對抗升級,爬蟲工程師免不了死大量腦細胞。
自律剋制熵增,自由源於內心!