背景
大家在使用Selenium + Chromedriver爬取網站資訊的時候,以為這樣就能做到不被網站的反爬蟲機制發現,但是實際上很多引數和實際瀏覽器還是不一樣的,只要網站進行判斷處理,就能輕輕松松識別你是否使用了Selenium + Chromedriver模擬瀏覽器,其中
window.navigator.webdriver
就是很重要的一個,
問題窺探
正常瀏覽器打開是這樣的

模擬器打開是這樣的
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模擬瀏覽器,
解決辦法
那么對于這種情況,在爬蟲開發的程序中如何防止這個引數告訴網站你在模擬瀏覽器呢?執行對應的js,改掉它的值,
IJavaScriptExecutor js = (IJavaScriptExecutor)driver; string returnjs = (string)js.ExecuteScript("Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});");
運行效果

完美,達到預期效果,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/248818.html
標籤:C#
