selenium绕过浏览器封装代码
摘要:selenium绕过浏览器的检测的代码,注意需要配合低版本的浏览器,我用的是71.0.3542.0的chromium。下载链接,以及71.0.3578.80版本的chromedriver,chromedriver需要经过特殊的反编译处理。
windows版本和linux版本区别在于UA头的不同以及platform的不同。
windows版本
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
# 开启无界面模式
# chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--disable-extensions')
chrome_options.add_argument('--profile-directory=Default')
chrome_options.add_argument("--incognito")
chrome_options.add_argument("--disable-plugins-discovery")
chrome_options.add_argument("--start-maximized")
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_argument('disable-infobars')
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=chrome_options)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
delete navigator.__proto__.webdriver;
"""
})
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'plugins', {
get: () = > [
{
0: {type: "application/x-google-chrome-pdf", suffixes: "pdf",
description: "Portable Document Format", enabledPlugin: Plugin},
description: "Portable Document Format",
filename: "internal-pdf-viewer",
length: 1,
name: "Chrome PDF Plugin"
},
{
0: {type: "application/pdf", suffixes: "pdf", description: "", enabledPlugin: Plugin},
description: "",
filename: "mhjfbmdgcfjbbpaeojofohoefgiehjai",
length: 1,
name: "Chrome PDF Viewer"
},
{
0: {type: "application/x-nacl", suffixes: "", description: "Native Client Executable",
enabledPlugin: Plugin},
1: {type: "application/x-pnacl", suffixes: "",
description: "Portable Native Client Executable", enabledPlugin: Plugin},
description: "",
filename: "internal-nacl-plugin",
length: 2,
name: "Native Client"
}
],
});
"""
})
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'languages', {
get: () => ['en-US', 'en'],
});
"""
})
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'platform', {
get: () => "Win32",
configurable: true
});
"""
})
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
window.chrome = {
embeddedSearch: function() {},
loadTimes: function() {},
csi: function() {},
app: {},
webstore:{}
};
"""
})
driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'})
driver.set_window_size(1920, 1080)
driver.get('https://www.aqistudy.cn/historydata/daydata.php?city=%E4%B8%8A%E6%B5%B7&month=201406')
driver.implicitly_wait(10)
driver.get_screenshot_as_file("截屏天气网1.png")
f = open("天气网界面1.html", "w", encoding="utf-8")
content = driver.page_source
f.write(content)
f.close()
f = open("天气网界面2.html", "w", encoding="utf-8")
content = driver.execute_script("return document.documentElement.outerHTML")
f.write(content)
f.close()
linux版本
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
# 开启无界面模式
# chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--disable-extensions')
chrome_options.add_argument('--profile-directory=Default')
chrome_options.add_argument("--incognito")
chrome_options.add_argument("--disable-plugins-discovery")
chrome_options.add_argument("--start-maximized")
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_argument('disable-infobars')
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=chrome_options)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
delete navigator.__proto__.webdriver;
"""
})
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'plugins', {
get: () = > [
{
0: {type: "application/x-google-chrome-pdf", suffixes: "pdf",
description: "Portable Document Format", enabledPlugin: Plugin},
description: "Portable Document Format",
filename: "internal-pdf-viewer",
length: 1,
name: "Chrome PDF Plugin"
},
{
0: {type: "application/pdf", suffixes: "pdf", description: "", enabledPlugin: Plugin},
description: "",
filename: "mhjfbmdgcfjbbpaeojofohoefgiehjai",
length: 1,
name: "Chrome PDF Viewer"
},
{
0: {type: "application/x-nacl", suffixes: "", description: "Native Client Executable",
enabledPlugin: Plugin},
1: {type: "application/x-pnacl", suffixes: "",
description: "Portable Native Client Executable", enabledPlugin: Plugin},
description: "",
filename: "internal-nacl-plugin",
length: 2,
name: "Native Client"
}
],
});
"""
})
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'languages', {
get: () => ['en-US', 'en'],
});
"""
})
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'platform', {
get: () => "Linux x86_64",
configurable: true
});
"""
})
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
window.chrome = {
embeddedSearch: function() {},
loadTimes: function() {},
csi: function() {},
app: {},
webstore:{}
};
"""
})
driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3477.0 Safari/537.36"})
driver.set_window_size(1920, 1080)
driver.get('https://www.aqistudy.cn/historydata/daydata.php?city=%E4%B8%8A%E6%B5%B7&month=201406')
driver.implicitly_wait(10)
driver.get_screenshot_as_file("截屏天气网1.png")
f = open("天气网界面1.html", "w", encoding="utf-8")
content = driver.page_source
f.write(content)
f.close()
f = open("天气网界面2.html", "w", encoding="utf-8")
content = driver.execute_script("return document.documentElement.outerHTML")
f.write(content)
f.close()
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。