Selenium 的用途
大多数脚本使用的是 Selenium WebDriver。它通过各浏览器的驱动程序向 Chrome、Firefox、Edge 或 Safari 发送命令。Selenium IDE 可录制简单的浏览器操作,Selenium Grid 则能在多台计算机上运行会话。
常见用途包括:
- 测试表单、导航及其他浏览器操作流程。
- 采集需要 JavaScript 渲染的内容。
- 截取屏幕截图,或检查页面在不同浏览器中的表现。
Selenium 控制的是完整浏览器,因此可以点击按钮、输入文本、管理 Cookie,并检查渲染后的文档。
Selenium WebDriver 的工作原理
语言绑定会把 Python、Java、C# 或 JavaScript 调用转换为 WebDriver 命令。浏览器执行每项操作后,会返回元素数据、页面状态或错误。现代版本的 Selenium 通常可以自动查找或下载兼容的浏览器驱动程序。
下面的 Python 示例会打开页面,并等待通过 CSS 选择器找到的元素出现:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://example.com")
heading = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, "h1"))
)
print(heading.text)
driver.quit()
显式等待比固定等待更稳妥,因为预期条件一满足,程序就会立即继续执行。
让 Selenium 通过代理连接
如果代理不需要认证,请在创建 WebDriver 会话前,将代理的主机和端口传给 Chrome:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://HOST:PORT")
driver = webdriver.Chrome(options=options)
需要更换代理设置时,应启动新的浏览器会话。Firefox 使用基于浏览器首选项的配置,而不是 Chrome 的命令行参数。
需要认证的代理端点通常写作 http://USERNAME:PASSWORD@HOST:PORT。WebDriver 的标准代理设置没有用于填写 HTTP 代理认证信息的字段,而把认证信息放入 Chrome 的代理参数后,Chrome 往往也无法完成认证。此时可使用浏览器扩展、已配置的浏览器环境,或能处理代理认证的本地代理适配器。如果未提供认证信息或认证失败,HTTP 代理通常会返回 407 Proxy Authentication Required。
Selenium、Playwright 与 Scrapy 对比
| 工具 | 适用场景 | 主要取舍 |
|---|---|---|
| Selenium | 跨浏览器 UI 测试 | 浏览器配置和资源开销 |
| Playwright | 现代浏览器自动化 | API 和工具体系不同 |
| Scrapy | 大规模 HTTP 采集 | 默认不支持 JavaScript 渲染 |
与直接使用 HTTP 客户端相比,Selenium 会占用更多内存和 CPU。页面需要浏览器渲染或交互时再使用 Selenium。请求频率应保持在网站限制范围内,并遵守其 robots.txt 规则和条款。
常见问题
Selenium 适合网页采集吗?
适合,尤其是内容需要运行 JavaScript 后才会显示,或需要点击和滚动操作时。对于静态 HTML 或 API,直接使用 HTTP 客户端通常更快。
Selenium 可以使用需要认证的代理吗?
可以,但通常需要借助浏览器扩展、已配置的浏览器环境或本地适配器完成认证。WebDriver 的标准代理设置没有用于填写 HTTP 代理认证信息的字段。
无头模式的 Selenium 能避开机器人检测吗?
不能。无头模式只会隐藏浏览器窗口,网站仍可检查 WebDriver 信号、指纹和行为。代理只会更改网站看到的 IP 地址,不会改变 WebDriver 信号、指纹和行为。