前言做爬虫的同学肯定都有过这样的经历遇到一个纯前端渲染的网站Requests抓包只能拿到一堆空的div标签所有数据都是JS动态生成的。这时候你想到了Selenium结果刚打开浏览器网站直接跳出来一个检测到机器人访问的页面或者直接返回403。我之前做一个跨境电商的爬虫项目就踩了这个大坑。一开始用默认的Selenium ChromeDriver10次请求有9次被封通过率不到10%。我花了整整两周时间研究了市面上所有的Selenium反爬绕过方法从最基础的隐藏WebDriver特征到模拟真实用户行为再到绕过Canvas指纹检测最终把通过率提升到了99%以上连续运行一个月没有被封过一次。本文没有任何过时的内容所有技巧都是基于2026年最新的Selenium 4.22版本。我会从最基础的环境搭建讲起一步步带你掌握浏览器控制、动态渲染处理、反爬绕过的核心技术最后通过一个完整的实战案例教你写出一个稳定运行的Selenium爬虫。一、Selenium的定位与适用场景很多人对Selenium有误解觉得它又慢又容易被检测不如Requests好用。但实际上Selenium和Requests是互补的关系各自有不同的适用场景。是否是否遇到一个网站是否是静态渲染?使用RequestsBeautifulSoup是否能找到未加密的API接口?使用Requests调用接口使用Selenium模拟浏览器需要登录验证有复杂的交互操作接口加密无法逆向Selenium的核心优势完全模拟真实浏览器的行为能处理任何JS动态渲染的内容自动处理Cookie、Session、重定向等浏览器底层逻辑支持鼠标点击、键盘输入、滑块拖动等复杂交互不需要逆向JS代码降低了爬虫的开发难度Selenium的缺点速度比Requests慢10-20倍资源消耗大并发能力有限容易被反爬系统检测到自动化特征核心结论当Requests搞不定的时候再用Selenium。它是爬虫的最后一道防线也是解决动态网站爬取问题的终极武器。二、2026最新环境搭建告别ChromeDriver版本问题以前用Selenium最头疼的问题就是ChromeDriver和Chrome浏览器版本不兼容每次Chrome自动更新爬虫就会崩溃。现在Selenium 4.6版本已经内置了Selenium Manager会自动下载和管理对应版本的ChromeDriver再也不用手动下载了。2.1 安装依赖# 安装最新版本的Seleniumpipinstallselenium4.22.0# 安装反爬神器undetected-chromedriverpipinstallundetected-chromedriver3.5.5# 安装可选工具pipinstallfake-useragent1.5.1 pipinstallpillow10.3.0# 处理验证码2.2 最简单的启动示例fromseleniumimportwebdriverfromselenium.webdriver.chrome.optionsimportOptions# 配置Chrome选项chrome_optionsOptions()chrome_options.add_argument(--start-maximized)# 最大化窗口chrome_options.add_argument(--disable-notifications)# 禁用通知# 启动浏览器Selenium会自动下载对应版本的ChromeDriverdriverwebdriver.Chrome(optionschrome_options)# 访问百度driver.get(https://www.baidu.com)print(driver.title)# 关闭浏览器driver.quit()就这么简单再也不用管ChromeDriver的版本问题了。三、动态渲染核心处理技巧Selenium最强大的地方就是能处理JS动态渲染的内容。下面是我总结的最常用的动态渲染处理技巧覆盖90%的场景。3.1 正确的等待方式显式等待90%的新手都会犯的错误用time.sleep()等待元素加载。这不仅慢而且不稳定网络波动的时候很容易报错。正确的做法是使用显式等待它会一直等待直到元素出现最多等待指定的时间。fromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.common.byimportBy# 初始化等待对象最多等待10秒waitWebDriverWait(driver,10)# 等待元素出现并点击elementwait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,button.submit)))element.click()# 等待元素出现并获取文本textwait.until(EC.presence_of_element_located((By.CSS_SELECTOR,div.content))).text3.2 处理无限滚动很多网站比如微博、抖音、电商商品列表都是无限滚动加载的需要向下滚动页面才能加载更多内容。importtimeimportrandomdefscroll_to_bottom(driver,scroll_times10):无限滚动加载更多内容foriinrange(scroll_times):print(f正在滚动第{i1}次...)# 滚动到页面底部driver.execute_script(window.scrollTo(0, document.body.scrollHeight);)# 随机延迟模拟真实用户滚动time.sleep(1random.random()*2)# 检查是否已经滚动到底部new_heightdriver.execute_script(return document.body.scrollHeight)ifnew_heightdriver.execute_script(return document.body.scrollHeight):break3.3 处理iframe很多网站会把登录框、广告、视频等内容放在iframe里直接定位元素会找不到。这时候需要先切换到iframe里面。# 切换到iframedriver.switch_to.frame(iframe_id)# 现在可以定位iframe里面的元素了driver.find_element(By.ID,username).send_keys(your_username)# 切换回主页面driver.switch_to.default_content()3.4 执行任意JS代码Selenium最强大的功能之一就是可以执行任意的JS代码这能帮你解决很多Selenium本身解决不了的问题。# 获取页面的完整HTMLhtmldriver.execute_script(return document.documentElement.outerHTML)# 隐藏不需要的元素driver.execute_script(document.querySelector(.ad).style.display none;)# 直接修改元素的属性driver.execute_script(document.querySelector(#password).value your_password;)# 获取AJAX请求返回的数据datadriver.execute_script(return window.__DATA__;)四、2026最新Selenium反爬全突破这是本文最核心的部分也是90%的人最关心的部分。现在的反爬系统已经非常先进了默认的Selenium会留下大量的自动化特征很容易被检测到。下面是我总结的10个核心技巧能帮你把通过率提升到99%以上。4.1 反爬第一神器undetected-chromedriver这是目前最有效的Selenium反爬工具它修改了ChromeDriver的源码移除了所有的自动化特征能绕过几乎所有的反爬系统包括Cloudflare、Akamai、reCAPTCHA等。importundetected_chromedriverasuc# 启动undetected-chromedriverdriveruc.Chrome(headlessFalse,version_main124,# 指定Chrome版本和你电脑上的Chrome版本一致optionschrome_options)# 访问被反爬保护的网站driver.get(https://www.example.com)注意不要用默认的ChromeDriver一定要用undetected-chromedriver。这一个技巧就能解决80%的反爬问题。4.2 添加Chrome启动参数隐藏自动化特征chrome_options.add_argument(--disable-blink-featuresAutomationControlled)chrome_options.add_argument(--excludeSwitchesenable-automation)chrome_options.add_argument(--useAutomationExtensionfalse)chrome_options.add_argument(--disable-extensions)chrome_options.add_argument(--disable-plugins)chrome_options.add_argument(--disable-gpu)chrome_options.add_argument(--no-sandbox)chrome_options.add_argument(--disable-dev-shm-usage)# 随机User-Agentfromfake_useragentimportUserAgent chrome_options.add_argument(fuser-agent{UserAgent().random})4.3 移除window.navigator.webdriver标志这是最基础的反爬检测点默认的Selenium会把window.navigator.webdriver设置为true反爬系统一检测就知道是自动化工具。# 执行JS代码移除webdriver标志driver.execute_script( Object.defineProperty(navigator, webdriver, { get: () undefined }) )4.4 模拟真实用户行为反爬系统会分析用户的行为模式自动化工具的行为太规律了很容易被检测到。我们需要模拟真实用户的随机行为。# 随机鼠标移动defrandom_mouse_move(driver,element):actionwebdriver.ActionChains(driver)# 随机移动到元素附近action.move_to_element_with_offset(element,random.randint(-10,10),random.randint(-10,10))action.pause(random.random())# 点击action.click()action.perform()# 随机键盘输入defrandom_send_keys(element,text):forcharintext:element.send_keys(char)time.sleep(random.uniform(0.1,0.3))4.5 处理滑块验证码滑块验证码是最常见的反爬手段用Selenium可以很容易地模拟拖动。defsolve_slider_captcha(driver,slider_selector,track):处理滑块验证码sliderdriver.find_element(By.CSS_SELECTOR,slider_selector)actionwebdriver.ActionChains(driver)action.click_and_hold(slider)# 模拟人类拖动轨迹先快后慢forxintrack:action.move_by_offset(x,random.randint(-2,2))action.pause(random.uniform(0.01,0.03))action.release()action.perform()如果是复杂的滑块验证码建议使用第三方打码平台成功率更高。五、完整实战流程是否配置Chrome选项启动undetected-chromedriver访问目标网站自动登录无限滚动加载数据提取页面数据数据清洗与存储是否还有更多数据?关闭浏览器5.1 完整实战代码爬取电商商品列表importundetected_chromedriverasucimporttimeimportrandomimportpandasaspdfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.common.byimportBydefmain():# 配置Chrome选项chrome_optionsuc.ChromeOptions()chrome_options.add_argument(--start-maximized)chrome_options.add_argument(--disable-notifications)chrome_options.add_argument(--disable-blink-featuresAutomationControlled)# 启动浏览器driveruc.Chrome(optionschrome_options,version_main124)waitWebDriverWait(driver,10)try:# 访问电商网站driver.get(https://www.example.com)# 自动登录wait.until(EC.element_to_be_clickable((By.ID,login-btn))).click()wait.until(EC.presence_of_element_located((By.ID,username))).send_keys(your_username)wait.until(EC.presence_of_element_located((By.ID,password))).send_keys(your_password)wait.until(EC.element_to_be_clickable((By.ID,submit-btn))).click()# 等待登录成功time.sleep(3)# 搜索商品search_inputwait.until(EC.presence_of_element_located((By.ID,search-input)))random_send_keys(search_input,手机)wait.until(EC.element_to_be_clickable((By.ID,search-btn))).click()# 无限滚动加载商品all_products[]forpageinrange(5):print(f正在爬取第{page1}页...)scroll_to_bottom(driver,scroll_times3)# 提取商品信息productsdriver.find_elements(By.CSS_SELECTOR,div.product-item)forproductinproducts:try:titleproduct.find_element(By.CSS_SELECTOR,h3.product-title).text.strip()priceproduct.find_element(By.CSS_SELECTOR,span.price).text.strip()salesproduct.find_element(By.CSS_SELECTOR,span.sales).text.strip()shopproduct.find_element(By.CSS_SELECTOR,span.shop-name).text.strip()all_products.append({title:title,price:price,sales:sales,shop:shop})exceptExceptionase:print(f提取商品失败{e})continue# 点击下一页next_btnwait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,li.next a)))next_btn.click()time.sleep(2)# 保存数据dfpd.DataFrame(all_products)df.to_csv(products.csv,indexFalse,encodingutf-8-sig)print(f爬取完成共获取{len(all_products)}个商品)finally:# 关闭浏览器driver.quit()if__name____main__:main()六、性能优化技巧Selenium虽然慢但通过合理的优化可以把速度提升3-5倍。使用无头模式chrome_options.add_argument(--headlessnew)注意要用新的无头模式和真实浏览器行为一致禁用图片和视频chrome_options.add_argument(--blink-settingsimagesEnabledfalse)禁用不必要的插件和扩展减少资源消耗复用浏览器会话不要每次都重新启动浏览器复用同一个会话多线程并发启动多个浏览器实例同时爬取不同的页面七、踩坑实录90%的人都会遇到的问题Chrome版本不兼容现在Selenium 4.6会自动管理ChromeDriver不要手动下载了。如果还是有问题指定version_main参数为你电脑上的Chrome版本。元素定位不稳定永远不要用time.sleep()一定要用显式等待。优先使用CSS选择器其次是XPath不要用ID和类名因为它们经常会变。被Cloudflare检测一定要用undetected-chromedriver不要用默认的ChromeDriver。如果还是被检测更新undetected-chromedriver到最新版本。无头模式被封不要用旧的--headless参数要用新的--headlessnew。如果还是不行就用有头模式加虚拟显示器。内存泄漏Selenium运行时间长了会有内存泄漏建议每爬取1000个页面就重启一次浏览器。八、总结Selenium是解决动态网站爬取问题的终极武器虽然它有速度慢、资源消耗大的缺点但它的通用性和易用性是无可替代的。在2026年的今天反爬技术已经非常先进了默认的Selenium已经完全无法使用。但只要掌握了本文讲的核心技巧尤其是undetected-chromedriver的使用和真实用户行为的模拟你就能绕过绝大多数的反爬系统写出稳定运行的Selenium爬虫。最后再次强调请遵守法律法规不要爬取敏感信息不要用于商业用途不要给网站服务器造成过大的负担。技术本身没有对错关键在于如何使用。 点击我的头像进入主页关注专栏第一时间收到更新提醒有问题评论区交流看到都会回。