1. 程式人生 > 其它 >滑塊驗證之反反爬

滑塊驗證之反反爬

問題

在正常登入時,我們手動劃過滑塊是可以的,但採用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檔案的特徵來,這就需要我們敏銳的判斷力了。

總之,每一次對抗升級,爬蟲工程師免不了死大量腦細胞。

自律剋制熵增,自由源於內心!