關於selenium被檢測問題


大多數網站通過檢測瀏覽器參數來進行判斷是不是selenium啟動的瀏覽器,我們在利用selenium執行某些方法的同時,可能會造成某些參數出現(navigator.webdriver、無頭里UA出現webdriver),所以寫下這篇隨筆,來盡可能地不被網站檢測到。
 
法一:
網站會檢測某個特殊參數$cdc_asdjflasutopfhvcZLmcfl,當然不止這一個,還有許多其余參數
網上有許多人是通過mitmproxy來攔截請求進行修改參數的
import re
from mitmproxy import ctx

def response(flow): 
    if '/js/yoda.' in flow.request.url:
        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', '')

這個方法說得其實也不錯,有一部分是是通過低版本進行反編譯后的chromedriver,就如Stackflow的答主一樣,進行反編譯低版本的chromdriver,然后配套對應版本的chrome。這兩個版本都各有其中的特點,但是都沒辦法做到繞過所有的檢測。即便開源的selenium,我們也沒有足夠精力去研究其打開頁面進行操作后修改了哪些參數。

這里提供一下進行反編譯后的chromedriver   version: 版本 76.0.3809.100(正式版本) (64 位)

鏈接:https://pan.baidu.com/s/1a_rn6mdI4v_ndOwnVRxMHA
提取碼:jkhy


法二,這個可能會繞過更大多數檢測
這個方法原理是利用chrome的debug模式,這個繼承與chrome的配置文件,也就是正常的瀏覽器配置。
首先關閉所有的chrome瀏覽器(重要,看完下面的再關),再cmd到chrome.exe的目錄下(windows一般為C:\Program Files (x86)\Google\Chrome\Application)執行
chrome.exe --remote-debugging-port=9222
這一條命令是打開一個chrome的debug模式,端口號是9222
然后在我們調用webdriver時傳入debuggerAddress
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(executable_path='D://chromedriver.exe', options=options)
driver.get('https://login.taobao.com')

 

 法三

運行cdp命令,使用 Google 的Chrome Devtools-Protocol(cdp)能夠避免被識別檢測

Page.addScriptToEvaluateOnNewDocument “在每個Frame 剛剛打開,還沒有運行 Frame 的腳本前,運行給定的腳本。”

cdp協議的好處是偏向與chrome的,而execute_script會帶上selenium的參數,易被檢測出

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})""",
    })
  注:低版本的chrome是不支持cdp協議的,盡量保持chrome在79以上的版本


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM