You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Linux环境下SeleniumBase脚本无法通过Cloudflare验证导致元素查找失败求助

Linux环境下SeleniumBase脚本无法通过Cloudflare验证导致元素查找失败求助

看起来你在Linux环境下用SeleniumBase处理Cloudflare人机验证时遇到了棘手的问题——Windows上能正常跑的脚本,到了Linux用xvfb-run运行就因为验证没通过,找不到后续操作的元素,确实挺闹心的!

结合你的代码和报错信息,我整理了几个针对性的解决方案,帮你搞定这个问题:

一、优化Cloudflare验证的处理逻辑(核心修复)

你当前的代码里,CDP模式的验证处理和页面打开的顺序有点混乱,而且固定的sleep在Linux环境下可靠性不高。推荐用SeleniumBase UC模式自带的专用方法来处理验证,它在对抗Cloudflare检测上更专业:

import json
from seleniumbase import SB

with SB(uc=True, test=True, ad_block=True, headless2=True) as sb:
    url = "https://www.nombrerutyfirma.com/"
    
    # 用UC模式的专用方法打开页面,自动处理Cloudflare验证,失败会重试
    sb.uc_open_with_reconnect(url, reconnect_time=15)
    
    # 等待验证完全通过,直到目标tab元素可点击(替代固定sleep)
    sb.wait_for_element_visible('a[href="#rut"]', timeout=20)
    
    # 后续业务逻辑保持不变
    sb.click('a[href="#rut"]')
    rut_input = sb.wait_for_element_visible('div#rut input[name="term"]', timeout=10)
    rut_input.send_keys("21.405.338-1") 
    rut_input.send_keys("\ue007")
    
    rows = sb.wait_for_elements('table.table-hover tbody tr', timeout=10)
    data = []
    for row in rows:
        columns = row.find_elements('td')
        record = {
            "Nombre": columns[0].text,
            "RUT": columns[1].text,
            "Sexo": columns[2].text,
            "Dirección": columns[3].text,
            "Ciudad/Comuna": columns[4].text,
        }
        data.append(record)

    json_data = json.dumps(data, ensure_ascii=False, indent=4)
    print(json_data)

二、调整xvfb-run的运行参数,模拟真实浏览器环境

Linux下无头浏览器的默认分辨率很低,容易被Cloudflare识别为机器人。给xvfb-run指定一个接近真实屏幕的分辨率,能大幅降低被拦截的概率:

xvfb-run -a -s "-screen 0 1920x1080x24" python3 py3.py

参数说明:

  • -a:自动选择可用的显示编号,避免冲突
  • -s "-screen 0 1920x1080x24":设置虚拟屏幕分辨率为1920x1080,24位色深

三、额外的优化建议

  1. 升级SeleniumBase到最新版本:UC模式的反检测逻辑一直在更新,旧版本可能存在Linux环境的兼容性问题:
    pip install -U seleniumbase
    
  2. 避免重复打开页面:你原来的代码里先activate_cdp_mode(url)sb.open(url),属于重复操作,会重置之前的验证状态,用uc_open_with_reconnect就能一步到位完成验证+页面加载。
  3. 替换固定sleep为显式等待:所有业务操作都用wait_for_element_visiblewait_for_elements这类方法,不要依赖sleep,能让脚本在不同性能的机器上都保持稳定。

为什么原来的代码在Linux下失效?

主要有两个原因:

  1. Linux无头浏览器的默认环境(分辨率、浏览器特征)和Windows有差异,更容易被Cloudflare的检测机制标记为机器人
  2. 你用的验证码选择器[style="display: grid;"] div div依赖页面的内联样式,Linux下页面渲染可能导致样式变化,选择器匹配失败,根本没触发验证点击

备注:内容来源于stack exchange,提问作者Oswuell

火山引擎 最新活动