每天都在重复着登录网站、点击按钮、下载数据的机械操作?加班到深夜,只是为了把网页上的表格一点点复制到Excel里?
醒醒吧!你的时间比这宝贵得多!
今天,给大家带来一款Python自动化测试与爬虫界的“核武器”——Selenium。它可以让你的浏览器变成一个听话的机器人,你喝咖啡的时间,它已经帮你把活干完了!
本文从零开始,带你全面搞定Selenium,建议先收藏再看!👍
简单来说,Selenium 是一个用于Web应用程序测试的工具,但它在Python圈子里,更出名的身份是动态网页爬虫神器。
传统的 Requests 库只能获取网页的源代码,但如果数据是 JavaScript 动态加载的(比如往下滚才出现的内容),Requests 就抓瞎了。而 Selenium 的绝招是:它直接驱动真实的浏览器去操作!
你能做的(点击、输入、滚动、截图),它都能做;你不能做的(一天点一万次),它也能做!
1. 安装 Selenium 库打开终端,一行命令搞定:
ounter(linepip install selenium
2. 下载浏览器驱动(重点!)Selenium 需要一个“驾驶员”来操控浏览器,以 Chrome 为例,你需要下载 ChromeDriver。
chromedriver.exe 放到 Python 的安装目录下,或者配置到系统的环境变量里。(💡 小贴士:Selenium 4.6 以上版本自带了 Selenium Manager,可以自动下载和管理驱动,越来越智能啦!)
让我们以最基础的百度搜索为例,感受一下 Selenium 的魅力。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(linefrom selenium import webdriverfrom selenium.webdriver.common.by import Byimport time# 1. 打开浏览器driver = webdriver.Chrome()# 2. 访问百度driver.get("https://www.baidu.com")# 3. 找到搜索框,输入关键字# 这里用的是元素的 ID 定位search_box = driver.find_element(By.ID, "kw")search_box.send_keys("Python Selenium")# 4. 找到“百度一下”按钮,并点击search_btn = driver.find_element(By.ID, "su")search_btn.click()# 5. 等待2秒,让我们看看搜索结果time.sleep(2)# 6. 退出浏览器driver.quit()
运行这段代码,你会看到电脑自动打开了 Chrome,输入了文字,点击了搜索,然后自动关闭。是不是很酷?
操作网页的前提是“找到那个按钮/输入框”。Selenium 提供了 8 种定位方式,目前最推荐使用 By 类的写法:
driver.find_element(By.ID, "username")driver.find_element(By.NAME, "email")driver.find_element(By.CLASS_NAME, "btn-primary")driver.find_element(By.LINK_TEXT, "登录")driver.find_element(By.CSS_SELECTOR, "#username > input")driver.find_element(By.XPATH, "//input[@placeholder='请输入密码']")(🔥 技巧:在浏览器按 F12 打开开发者工具,选中元素右键 -> Copy -> Copy XPath / Copy selector,一键获取定位代码!)
很多新手刚学 Selenium 时,最常遇到的报错就是:“元素不可见”或“找不到元素”。
为什么?因为网页还没加载完,你的代码就急着去点击了!这时候必须引入等待机制。
❌ 绝对不推荐:time.sleep(5)(死等,太傻,严重影响效率)
✅ 强烈推荐:显式等待让程序智能地等待,直到某个条件成立,最多等多少秒。如果1秒就加载出来了,绝不浪费第2秒。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(linefrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC# 智能等待:最多等10秒,直到百度搜索框出现try:element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "kw")))finally:driver.quit()
现在的网站都很聪明,一看你是 Selenium,就给你弹验证码或者直接封 IP。怎么破?
1. 隐藏 Selenium 特征默认情况下,Selenium 驱动的浏览器会有一个变量 window.navigator.webdriver 值为 true。网站就是通过这个抓你的!
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# 在打开浏览器前,加入实验性配置options = webdriver.ChromeOptions()options.add_experimental_option("excludeSwitches", ["enable-automation"])options.add_experimental_option('useAutomationExtension', False)driver = webdriver.Chrome(options=options)# 执行 CDP 命令,彻底隐藏 webdriver 特征driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})
2. 使用代理 IP
ounter(lineoptions.add_argument('--proxy-server=http://你的代理IP:端口')
3. 使用无头模式不需要显示浏览器界面,在服务器上默默运行,速度更快。
ounter(lineoptions.add_argument('--headless')
driver.quit(),不要只用 close(),否则后台会残留大量 chromedriver 进程,吃光你的内存!driver.switch_to.alert.accept();如果是网页自定义弹窗,找到弹窗的关闭按钮点击即可。iframe 里面!需要先切换:driver.switch_to.frame("iframe_name"),操作完记得切回主页面:driver.switch_to.default_content()。Selenium 是一把自动化和爬虫的利器,掌握它,你就能解放双手,让电脑为你打工。
核心学习路径:定位元素 -> 模拟操作 -> 显式等待 -> 隐藏特征。