Selenium 基于浏览器自动化模块
Selenium 基于浏览器自动化模块
什么是 Selenium?
假设你想开辆车,可懒得亲自坐进去踩油门换挡,那你就需要一个机器人帮你搞定一切,Selenium 就是这样的机器人。它负责浏览器的自动化操作,帮你完成一系列繁琐的网页操作。
PhantomJS 是啥玩意?
想象一下,一辆车竟然没有车窗和座椅,里面黑漆漆一片,这就是 PhantomJS,无可视化界面的浏览器。不过,老伙计已经退休了,咱不再用它。
Selenium 的基本操作
要想用好这个机器人,先得搞定它的操作手册和驾驶员。
- 官方参考文档:传送门
- 谷歌驱动下载:传送门
- 火狐驱动下载:传送门
谷歌无头浏览器配置
无头浏览器就是没有车窗的车,但还是能跑起来。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options # 导入无头浏览器模块
# 创建一个对象,用来控制 Chrome 以无界面模式打开
chrome_options = Options()
chrome_options.add_argument('--headless') # 浏览器隐藏
chrome_options.add_argument('--disable-gpu') # 禁用 GPU
# 创建浏览器对象
driver = webdriver.Chrome(options=chrome_options)
火狐无头浏览器配置
火狐版的无头汽车也能上路。
from selenium import webdriver
from selenium.webdriver.firefox.options import Options # 导入无头浏览器模块
# 创建一个对象,用来控制 Firefox 以无界面模式打开
firefox_options = Options()
firefox_options.add_argument('--headless') # 浏览器隐藏
firefox_options.add_argument('--disable-gpu') # 禁用 GPU
# 创建浏览器对象
driver = webdriver.Firefox(options=firefox_options)
规避网站的“狗狗”检测
如今的大网站可精了,它们可以嗅出你是不是在用机器人(Selenium)访问它们。正常用浏览器访问淘宝时,控制台 window.navigator.webdriver
的值是 undefined
,但用 Selenium 就变成 true
。
解决方案
不要怕,我们有办法让 “狗狗” 闻不出来。在启动 Chrome 之前,为它坐个“整形手术”,设定实验性功能参数 excludeSwitches
成 [enable-automation
],具体操作如下:
from selenium import webdriver
from selenium.webdriver import ChromeOptions # 需要导入的类
# 创建 option 对象
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
# 创建浏览器对象
driver = webdriver.Chrome(options=option)
# 打开网页
driver.get('https://www.taobao.com/')
Chrome 79 及以后版本的特别操作
Chrome 79 版本之后,有点调皮了,我们需要一点特别的操作把它的“怪癖”掩盖起来。
from selenium import webdriver
driver = webdriver.Chrome(r'C:\Path\To\chromedriver.exe') # 修改为 Chromedriver 的实际路径
url = 'https://www.taobao.com/'
# 让 Selenium 访问时 window.navigator.webdriver 返回 undefined
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
"""
})
# 打开网页
driver.get(url)
看吧,这样传“驾驶秘籍”,操作机器人浏览器简直 So Easy,规避网站检测也是小菜一碟!