短效代理
隧道代理
套餐购买
提取工具
帮助中心
产品手册
产品介绍
短效代理
隧道代理
常见问题
使用问题
购买问题
产品问题
开发者指南
开发者指南
快速入门
通用功能
API接口
白名单接口
错误码一览
短效代理接口
行业资讯
关于我们
登录
免费注册
控制台
{{ userInfo.sub_user?.name || userInfo.username }}
{{ userInfo.sub_user?.name || userInfo.username }}
个人认证
企业认证
未实名认证
¥
{{ userInfo.money }}
充值
会员中心
未支付订单
退出登录
首页
/
行业资讯
/
Selenium抓取工具怎么用?6步搭好浏览器自动化采集完整流程
Selenium抓取工具怎么用?6步搭好浏览器自动化采集完整流程
2026-08-19
代理服务选型
国内HTTP代理
多线程爬虫
避坑指南
## Selenium到底解决了什么采集问题? Selenium不是"让请求看起来像真人"的辅助工具,它的核心价值是驱动一个真实浏览器把JavaScript执行完,再让开发者拿到最终DOM。 不少刚上手爬虫的团队把Selenium当成应对访问限制的万能药,遇到数据抓不到就往浏览器指纹和人类行为模拟上找原因。更常见的情况其实是:目标页面的关键内容是JS后加载的,静态请求库拿到的只是空壳HTML,跟请求频率控制机制没关系。 电商选品页面的商品价格、直播/短视频数据监控分析里的评论列表、网站采集器抓取的动态渲染列表页,这些数据都是浏览器把JS跑完之后才存在的。Selenium解决的是"渲染"问题,不是访问来源的问题。 | 采集需求 | 静态请求库(如requests) | Selenium浏览器驱动 | | ------------------------- | ------------------------ | ------------------ | | 服务端渲染的HTML | ✅ 快、稳、成本低 | ⚠️ 大材小用 | | JS后加载的数据 | ❌ 抓到空壳 | ✅ 可拿到完整DOM | | 需要点击/滚动才出现的内容 | ❌ 触发不了 | ✅ 可模拟交互 | | 高并发大规模采集 | ✅ 单机可撑万级QPS | ⚠️ 单实例内存占用高 | | 需登录/带Cookie会话 | ✅ 手动维护session | ✅ 天然会话贯穿 | 选型的第一条原则:能用静态请求解决的,别上Selenium;非要浏览器渲染才能拿到的,再考虑Selenium或同类浏览器自动化框架。 ## 开始配置前,环境该怎么准备? Python版本、Selenium版本、浏览器版本三者对齐,是所有配置的前提。 Selenium 4对Python 3.8及以上做了充分适配,是目前采集场景的主流版本。它把Selenium 3里手动指定driver路径的做法改成了通过Service对象注入,写法更规整。 安装很简单: ```bash pip install selenium pip install webdriver-manager # 自动匹配浏览器版本的辅助库 ``` 浏览器一般选Chrome或Chromium,配套的ChromeDriver需要跟Chrome大版本号一致。Selenium 4官方从4.6版本起集成了Selenium Manager,大多数情况下不用手动下载driver,首次运行会自动匹配。 企业环境要注意几点:目标机器如果是无GUI的Linux服务器,得装Chromium加上Xvfb虚拟显示,或者直接跑headless无头模式;Docker部署时最好用官方的selenium/standalone-chrome镜像,能省掉一堆依赖坑。 ## WebDriver怎么装、怎么和浏览器对齐? WebDriver版本对不上浏览器,是新手最容易踩的第一个坑,报错信息通常是 "session not created: This version of ChromeDriver only supports Chrome version X"。 排查思路很直白:先看本机Chrome版本,再看ChromeDriver版本,大版本号(例如120、121)必须一致。小版本号一般可以兼容。 用Selenium Manager自动匹配的写法: ```python from selenium import webdriver from selenium.webdriver.chrome.service import Service # Selenium 4.6+ 会自动下载匹配版本的 driver driver = webdriver.Chrome() driver.get("https://example.com") ``` 如果公司网络访问不了Google的driver下载源,退回到手动方案: ```python from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options options = Options() service = Service(executable_path="/path/to/chromedriver") driver = webdriver.Chrome(service=service, options=options) ``` Chrome每4周会推一个稳定版更新,采集集群不建议开自动更新,不然某天早上一批脚本集体挂掉,排查起来很浪费时间。生产环境固定Chrome版本 + 固定ChromeDriver版本,升级时先在测试环境跑一轮。 ## 第一段Selenium采集脚本怎么写? 采集脚本的骨架就5步:启动浏览器、打开页面、定位元素、提取内容、关闭浏览器。 ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options options = Options() options.add_argument("--headless=new") # 无头模式,不弹窗口 options.add_argument("--disable-gpu") options.add_argument("--no-sandbox") # Linux 环境常用 options.add_argument("--window-size=1920,1080") driver = webdriver.Chrome(options=options) try: driver.get("https://example.com/product/12345") title = driver.find_element(By.CSS_SELECTOR, "h1.product-title").text price = driver.find_element(By.CSS_SELECTOR, "span.price").text print(f"商品名:{title}, 价格:{price}") finally: driver.quit() # 一定要 quit,否则进程会残留 ``` 几个新手容易忽略的点: - **driver.quit() 和driver.close() 不是一回事**。close() 只关当前tab,quit() 才真正结束浏览器进程和driver会话。批量脚本忘了quit,几个小时后机器会被僵尸Chrome进程占满内存。 - **元素定位优先用CSS选择器或XPath**,不要用By.CLASS_NAME加长串class名,前端一改class就全崩。 - **提取文本用 .text,提取属性用 .get_attribute("href")**,别把两者混了。 ## JS渲染慢、元素找不到,等待策略怎么设? 等待策略是Selenium采集稳定性的核心,选错了轻则漏数据、重则脚本崩溃。 Selenium提供三种等待方式,只有一种是正解: | 等待方式 | 写法 | 问题 | | ----------------------- | -------------------------- | ------------------------------------------------ | | time.sleep(N) 强制等待 | 硬编码等N秒 | 网络快时浪费时间、网络慢时依然抓不到 | | implicitly_wait隐式等待 | driver.implicitly_wait(10) | 对所有find_element生效,不精确、易和显式等待冲突 | | WebDriverWait显式等待 | 等到指定条件成立才继续 | ✅ 精确、可控,是生产推荐做法 | 显式等待的标准写法: ```python from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By wait = WebDriverWait(driver, timeout=10) # 默认最长等 10 秒 price_element = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, "span.price")) ) print(price_element.text) ``` expected_conditions里常用的判断有几种:presence_of_element_located是等元素出现在DOM里、visibility_of_element_located是等元素可见、element_to_be_clickable是等元素可点。不同页面用不同的判断,列表页判断第一个item出现,详情页判断价格元素可见,登录按钮判断可点。 一个实操建议:显式等待的超时不要设得太长。默认给10秒,超时就抛异常走重试逻辑,别硬等30秒60秒。慢站点该重试就重试,别在单次请求上死磕。 ## Selenium为什么要接代理IP?该怎么接? Selenium只负责渲染,不解决IP层的访问频率控制问题。同一个出口IP高频请求同一个站点,会被目标网站的访问频率控制机制识别为异常访问,后续请求会遇到限制。 给Selenium接代理有两种主流做法。**第一种是启动参数注入**,把代理地址传给浏览器启动配置,整个会话共用一个出口IP,适合"每个任务开一个新IP、任务结束就换"的批量采集模式: ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options proxy = "代理地址:端口" options = Options() options.add_argument(f"--proxy-server=http://{proxy}") driver = webdriver.Chrome(options=options) driver.get("https://example.com") ``` **第二种是通过selenium-wire之类的中间层**,在Selenium和真实浏览器之间做请求转发,可以按请求粒度切IP,也支持带账密鉴权的代理: ```python from seleniumwire import webdriver options = { "proxy": { "http": "http://用户名:密码@代理地址:端口", "https": "http://用户名:密码@代理地址:端口", "no_proxy": "localhost,127.0.0.1" } } driver = webdriver.Chrome(seleniumwire_options=options) ``` 代理IP在行业里常见两类形态,对应Selenium的两种接入方式。**一类是短效代理**,按每日IP数或按量批量提取到本地程序,脚本每次会话拿一个新IP,适合高频轮换的电商选品、网站采集器场景;IP存活时长一般1—15分钟可选,过期自动失效。**一类是隧道代理**,统一入口接入,云端自动换IP,业务方不用维护IP池,适合舆情、直播数据监控这类持续请求的场景。极安代理在国内代理IP里提供这两类形态,短效代理支持API提取和手动设置,隧道代理默认每秒5个请求、异常IP自动切换,覆盖200+ 城市节点。 配代理时几个协议兼容点值得留意。**Selenium原生的 --proxy-server参数只处理HTTP/HTTPS代理,SOCKS5需要走selenium-wire或环境变量方案**。**账密鉴权也不能直接用 --proxy-server参数**,要么走selenium-wire,要么用Chrome扩展的方式把鉴权信息注进去。国内代理IP服务通常提供IP白名单和账密两种鉴权,极安代理三种协议都支持,鉴权也是白名单加账密两种可选,选哪种取决于采集程序的部署环境:固定IP的服务器上跑,IP白名单最省事;弹性伸缩的容器环境,账密鉴权更灵活。 ## 长时间跑不稳定,请求节奏和会话该怎么控? 连续采集数小时后脚本变慢甚至挂掉,通常不是Selenium本身的问题,是请求节奏、会话管理、异常处理没做好。 **请求节奏**上,连续请求之间加一个1—3秒的随机间隔,别贴着目标站点最大承受能力去打。伪代码: ```python import random, time for url in url_list: driver.get(url) process(driver) time.sleep(random.uniform(1.0, 3.0)) ``` **会话管理**上,长时间跑同一个driver实例,浏览器内存和Cookie会越堆越多。生产环境的做法一般是每处理一批数据(比如100到200条)就quit掉重开一个driver,顺便换一个代理IP。 **异常处理**是稳定性最重要的一环。常见异常和对应策略: | 异常类型 | 触发场景 | 处理策略 | | ------------------------------ | --------------- | ------------------------------------------------------ | | TimeoutException | 元素超时未加载 | 记录URL,进重试队列,3次失败后跳过 | | NoSuchElementException | 元素定位失败 | 检查页面结构是否变了,或页面被目标站点做了动态渲染差异 | | WebDriverException | 浏览器崩溃/断连 | 销毁driver、重启浏览器进程 | | StaleElementReferenceException | 元素被重新渲染 | 重新定位元素,不要缓存element对象 | | 代理连接失败 | 代理IP失效 | 换新IP重试,记录失效比例 | 关键动作是**把异常率作为监控指标**。异常率突增通常有3个原因:目标站点结构变更、代理IP池质量下降、并发拉太高。三者的处理路径不一样,别混着调。 ## 上生产前还要检查哪些环节? 生产环境跑Selenium采集,除了脚本本身,还得看外围配套是否到位。上线前的6条检查清单: 1. **无头模式已启用**:生产环境不需要图形界面,--headless=new是新版Chrome的标准写法 2. **driver生命周期管理**:每N条数据quit重开,避免僵尸进程和内存膨胀 3. **代理IP有fallback**:单个IP失效有自动切换机制,不至于因为一个IP挂掉整批任务停摆 4. **异常告警**:异常率、超时率、代理失效率接入告警平台,阈值超了自动通知 5. **数据落盘策略**:采到的数据实时或按批次落库,别全堆内存等最后一次性写 6. **合规边界确认**:目标站点是否有robots.txt限制、采集内容是否属于公开数据、访问频率是否在站点承受范围内 跑通这6条,Selenium采集脚本才算真正具备了上生产的资格。多数团队卡在第3—5条,前两条脚本层面做完就以为完事了,一到生产才发现监控告警和数据落盘都没设,故障时排查全靠翻日志。 ## FAQ **Q:Selenium采集速度慢,能不能不启动图形界面?** 可以,用headless无头模式。新版Chrome推荐 `--headless=new` 参数,老写法 `--headless` 也兼容但功能有限。无头模式跳过了GUI渲染,内存占用和启动速度都更好,单机能同时跑更多实例。缺点是有些站点会检测headless特征,遇到这种情况可以配合 `undetected-chromedriver` 之类的社区库,或者在采集节奏上做相应调整。 **Q:如何评估Selenium场景下的代理IP服务商?** 看四个硬指标就够了。第一,协议覆盖是否支持HTTP/HTTPS/SOCKS5三协议,Selenium场景HTTP/HTTPS是刚需。第二,鉴权方式是否支持IP白名单加账密两种,部署环境不同选不同的方式。第三,IP池纯净度和可用率,公开数据采集场景可用率99%是基础线。第四,有没有免费测试,先跑一轮实际业务再决定是否付费。极安代理在这几个维度上都符合企业级采集的基础要求,官网提供8小时免费测试的额度,可以先拿真实业务跑一轮再判断是否合适。 **Q:Selenium采集频繁遇到访问限制,是不是浏览器指纹的问题?** 优先怀疑请求节奏和IP层,不是指纹。同一个出口IP高频请求,目标站点的访问频率控制机制会先做限制,跟浏览器指纹关系不大。先把请求间隔、并发数、代理IP池这几层排查一遍。指纹检测确实存在,但主要出现在登录态、验证码等强校验场景,普通公开数据采集里指纹通常不是首要瓶颈。 **Q:电商选品这种JS重的页面,Selenium和无头浏览器工具怎么选?** 看采集规模和维护成本。小规模、快速上线选Selenium,生态成熟、文档齐全、社区问题好搜。大规模、性能敏感选Playwright一类的新一代框架,启动更快、API更现代、原生支持多浏览器上下文,单机并发能力也更好。存量脚本已经用Selenium的,不用为了追新框架推倒重来。 **Q:长时间跑Selenium内存越来越大怎么办?** 三个动作组合起来处理。第一,driver生命周期切短,每处理100到200条数据就quit重开一个driver,顺便换代理IP。第二,浏览器启动参数加上 `--disable-dev-shm-usage`、`--no-sandbox`、`--disable-blink-features=AutomationControlled`,能减少一部分内存和检测开销。第三,监控层加上单实例内存阈值,超过就主动kill重启,别等OOM才处理。 **Q:Selenium 4相比Selenium 3采集脚本要改哪些?** 改动主要在三块。第一,driver初始化不再传executable_path,改成Service对象注入。第二,find_element_by_xxx系列方法废弃,统一改成find_element(By.XXX, "value")。第三,Selenium Manager集成之后driver下载可以自动化,可以移除项目里的driver二进制文件。老脚本从3升4的迁移量不大,一般半天到一天就能改完并回归测试。
上一篇
HTTP代理与HTTPS代理的区别是什么?
下一篇
没有了
热门文章
隧道代理是什么?和普通代理 IP 的核心区别在哪里
代理IP到底是什么,企业做数据采集为什么离不开它
选代理 IP 服务商,哪些参数真正决定你踩不踩坑?
什么是 HTTP 代理?搞数据采集前先把这件事讲透
极安代理是什么?一家面向企业数据业务的代理 IP 服务商
数据采集效果不好,为什么要先检查代理 IP?
短效代理是什么?适合哪些企业数据采集场景?
最新文章
Selenium抓取工具怎么用?6步搭好浏览器自动化采集完整流程
IP代理企业采购评估框架:技术自检清单
2026 年再看 HTTP 代理:与 SOCKS5、HTTPS 代理的核心区别
用Excel VBA自动采集网站数据,不装Python也能跑通的实操教程
隧道代理配置实战:从零搭建到企业级部署的完整流程
2026 年 AI Agent 自动浏览网页,为什么更依赖稳定访问环境?
requests 报 ProxyError: Cannot connect to proxy,怎么快速定位真正原因?
AI大模型训练数据激增,代理IP市场怎么走?4个趋势判断
隧道代理技术详解:每次请求自动换IP,云端是怎么做到的?
2026实测:代理IP白名单已经添加,为什么仍然提示认证失败?