c# Selenium爬取數據時防止webdriver封爬蟲的方法
背景
大傢在使用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}});");
運行效果
完美,達到預期效果。
以上就是c# Selenium爬取數據時防止webdriver封爬蟲的方法的詳細內容,更多關於c# 防止webdriver封爬蟲的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- c# 從內存中釋放Selenium chromedriver.exe
- Python中selenium_webdriver下拉框操作指南
- python+selenium行為鏈登錄12306(滑動驗證碼滑塊)
- Selenium+Python自動化測試入門
- Python語言中的Selenium環境搭建