+
95
-

回答

实际上,我们使用默认的方式初始化 WebDriver 打开一个网站,下面这段 JS 代码永远为 true,而手动打开目标网站的话,则为:undefined或false

<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8">

<script type="text/javascript">
document.write(window.navigator.webdriver )
</script>
<style>
</style>
</head>

<body>

</body>

</html>

上面的代码如果手动打开浏览器执行是fasle,但是在selenium打开就是true,这就是别人能够识别我们在爬取信息,那么怎么将window.navigator.webdriver变成false呢?代码增加

browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})

browser.implicitly_wait(10)

完整可运行代码如下:

#!/usr/local/python3/bin/python3
# -*- coding: utf-8 -*
from selenium import webdriver


chromeOptions = webdriver.ChromeOptions()


# 打开参数
chromeOptions.add_experimental_option('excludeSwitches', ['enable-automation'])

chromeOptions.add_argument("--headless")
chromeOptions.add_argument("--remote-debugging-port=9222")
chromeOptions.add_argument('--no-sandbox')

browser = webdriver.Chrome('/usr/bin/chromedriver',chrome_options=chromeOptions)


#新增反爬识别
browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})

browser.implicitly_wait(10)

browser.get("https://baidu.com")


网友回复

我知道答案,我要回答