你們在使用Selenium + Chromedriver爬取網站信息的時候,覺得這樣就能作到不被網站的反爬蟲機制發現。可是實際上不少參數和實際瀏覽器仍是不同的,只要網站進行判斷處理,就能輕輕鬆鬆識別你是否使用了Selenium + Chromedriver模擬瀏覽器。其中css
window.navigator.webdriver
就是很重要的一個。web
正常瀏覽器打開是這樣的瀏覽器
模擬器打開是這樣的 session
ChromeOptions options = null; IWebDriver driver = null; try { options = new ChromeOptions(); options.AddArguments("--ignore-certificate-errors"); options.AddArguments("--ignore-ssl-errors"); // options.AddExcludedArgument("enable-automation"); // options.AddAdditionalCapability("useAutomationExtension", false); var listCookie = CookieHelp.GetCookie(); if (listCookie != null) { // options.AddArgument("headless"); } // string ss = @"{ ""source"": ""Object.defineProperty(navigator, 'webdriver', { get: () => undefined})""}"; // options.AddUserProfilePreference("Page.addScriptToEvaluateOnNewDocument", new ssss() { source = " Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) " }); ChromeDriverService service = ChromeDriverService.CreateDefaultService(System.Environment.CurrentDirectory); service.HideCommandPromptWindow = true; driver = new ChromeDriver(service, options, TimeSpan.FromSeconds(120)); ////session.Page.AddScriptToEvaluateOnNewDocument(new OpenQA.Selenium.DevTools.Page.AddScriptToEvaluateOnNewDocumentCommandSettings() ////{ //// Source = @"Object.defineProperty(navigator, 'webdriver', { get: () => undefined })" ////} //// );
因此,若是網站經過js代碼獲取這個參數,返回值爲undefined說明是正常的瀏覽器,返回true說明用的是Selenium模擬瀏覽器。less
那麼對於這種狀況,在爬蟲開發的過程當中如何防止這個參數告訴網站你在模擬瀏覽器呢?執行對應的js,改掉它的值。編輯器
IJavaScriptExecutor js = (IJavaScriptExecutor)driver; string returnjs = (string)js.ExecuteScript("Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});");
完美,達到預期效果。ide