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