selenium反反爬


1. 反爬

有時候,我們利用 Selenium 自動化爬取某些網站時,極有可能會遭遇反爬。

實際上,我們使用默認的方式初始化 WebDriver 打開一個網站,下面這段 JS 代碼永遠為 true,而手動打開目標網站的話,則為:undefined

# 通過這段 JS 腳本區分是爬蟲還是人工操作
window.navigator.webdriver 
稍微有一點反爬經驗的工程師利用上面的差別,很容易判斷訪問對象是否為一個爬蟲,然后對其做反爬處理,返回一堆臟數據或各種驗證碼。

 

如果要實現后面的自動化操作,首先要解決的就是這個反爬的問題。

常見的反反爬方案包含:設置參數 excludeSwitches、mitmproxy 攔截過濾、cdp 命令,下面分別來說說。

2.設置參數 excludeSwitches

Chrome79 之前可以通過配置 ChromeOptions 驅動參數,來達到反反爬的目的。

只需要將參數打開,設置 excludeSwitches 值為 enable-automation 即可。

 1 from selenium.webdriver import Chrome  2 from selenium.webdriver import ChromeOptions  3 
 4 option = ChromeOptions()  5 
 6 # 打開參數
 7 option.add_experimental_option('excludeSwitches', ['enable-automation'])  8 
 9 driver = Chrome(options=option) 10 
11 driver.implicitly_wait(10) 12 
13 driver.get("http://www.google.com")

 


這個參數是實驗性參數,所以右上角會提示:請停用開發者模式運行的擴展程序,不能點擊停用。

這樣,設置這個參數后:

window.navigator.webdriver 的值就變成 undefined 了。

3. mitproxy 攔截

眾所周知,mitproxy 可以攔截到網絡請求,做其他處理,這里只需要進行 JS 代碼注入即可。

# 待執行的 JS 代碼,修改 window.navigator.webdriver 的值

1 js_exec = 'Object.defineProperties(navigator,{webdriver:{get:() => false}});'
2 
3 # 重寫 response,截獲網絡請求,js注入
4 def response(slef,flow: mitmproxy.http.HTTPFlow): 5         if 'google' in flow.request.url: 6                 flow.response.text = js_exec + flow.response.text


然后啟動 mitmdump

# 啟動mitmproxy
mitmdump -p 8888 -s 111.py 
最后,配置 ChromeOptions 指向 mitmdump代碼即可。

 1 # 配置ChromeOptions 2 option.add_argument("--proxy-server=http://127.0.0.1:8888") 
4. cdp 命令

cdp 全稱是:Chrome Devtools-Protocol

通過 addScriptToEvaluateOnNewDocument() 方法可以在頁面還未加載之前,運行一段腳本。

如此,我們只需要提前設置:

window.navigator.webdriver 的值為 undefined 即可。

 1 from selenium.webdriver import Chrome  2 from selenium.webdriver import ChromeOptions  3 
 4 option = ChromeOptions()  5 
 6 # 打開參數
 7 # option.add_argument("--proxy-server=http://127.0.0.1:8888")
 8 # driver = Chrome(options=option)
 9 
10 driver = Chrome() 11 driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { 12   "source": """
13  Object.defineProperty(navigator, 'webdriver', { 14  get: () => undefined 15  }) 16   """
17 }) 18 
19 driver.implicitly_wait(10) 20 driver.get("http://www.google.com")

 


5. 其他

通過上面的 3 種方法可以很好的解決 Selenium 自動化被反爬的問題。

原文鏈接:https://blog.csdn.net/pythonauto/java/article/details/104744743


免責聲明!

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



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