进阶技巧
设定options与chrome_options
chromeOptions 是一个配置 chrome 启动时属性的类
位于
# .\Lib\site-packages\selenium\webdriver\chrome\options.py
1
2
3
4
5
6
7
8
9
10
11
12
13>class Options(object):
def __init__(self):
# 设置 chrome 二进制文件位置
self._binary_location = ''
# 添加启动参数
self._arguments = []
# 添加扩展应用
self._extension_files = []
self._extensions = []
# 添加实验性质的设置参数
self._experimental_options = {}
# 设置调试器地址
self._debugger_address = None1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27# 无可视化界面
chrome_options=Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# 规避检测
options=ChromeOptions()
options.add_experimental_option('excludeSwitches',['enable-automation'])
# 防止自动关闭浏览器
options.add_experimental_option("detach", True)
# 去掉“正在受到自动化测试软件的控制”
optiosn.add_experimental_option('useAutomationExtension', False)
# 设置user-agent
options.add_argument('user-agent=xxx')
# 设置无用户名密码认证的代理ip
options.add_argument('--proxy-server=http://ip:port')
# 禁止图片加载,提升爬取速度
prefs = {"profile.managed_default_content_settings.images": 2}
options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(chrome_options=chrome_options,options=options)利用
fake_useragent
1
2
3
4
5from fake_useragent import UserAgent
headers = {
‘User-Agent’: UserAgent().random,
}防止浏览器检测出selenium
F12,选择Console,输入
window.navigator.webdriver
- 如果我们是正常打开的浏览器,则应该显示
undefined
或false
- 而如果是通过selenium打开的浏览器,则会显示
true
这是因为selenium在运行的时候会暴露出一些预定义的
Javascript
变量(特征字符串),例如window.navigator.webdriver
,1
2
3
4
5
6
7
8chrome = webdriver.Chrome(chrome_options=option)
chrome.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})这段代码帮助selenium将
window.navigator.webdriver
字段定义成undefined
另外也可以通过CDP(cdp命令是chrome支持的一种基于websocket的协议)来修改User-Agent
1
2chrome.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.97 Safari/537.36'})- 如果我们是正常打开的浏览器,则应该显示
未完待续…
本教程仅供学习,若被他人用于其他用途,与本人无关