You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium网页爬取脚本未返回预期结果,手动搜索正常求助

Selenium爬取ruesfront.rues.org.co突然无结果,但手动搜索正常的排查与解决

一、优先排查反爬机制触发

网站大概率新增了反爬检测,针对自动化工具的特征识别:

  • 浏览器指纹检测:Selenium默认浏览器会暴露navigator.webdriver等自动化特征,网站会据此拦截请求,而手动浏览器无此标识。
  • IP访问频率限制:脚本频繁请求可能触发IP临时封禁,日常手动搜索用的是常用IP,不受影响。
  • 会话验证差异:网站可能依赖特定会话Cookie返回结果,自动化工具的会话与手动浏览器会话不匹配。

对应解决方法:

  1. 隐藏自动化特征:
    给FirefoxOptions添加参数,移除webdriver标识:
    options = webdriver.FirefoxOptions()
    # 禁用自动化控制特征
    options.add_argument("--disable-blink-features=AutomationControlled")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Firefox(options=options)
    # 执行JS覆盖webdriver属性
    driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
    
  2. 模拟真实用户行为:
    添加随机延迟、页面滚动等操作,降低被识别概率:
    time.sleep(1)  # 打开页面后等待1秒
    driver.find_element(By.ID, "search").send_keys(nom_empresa)
    time.sleep(1)  # 输入完成后等待1秒再点击
    
  3. 切换代理IP:若怀疑IP被封,更换代理后测试。

二、检查元素定位是否失效

你的代码通过拼接多个类名定位元素(空格转.),这种方式极易因网站前端样式更新(新增/删除类名、调整顺序)而失效:

  • 搜索按钮定位:"d-none d-sm-block btn btn-primary input-group-append btn-busqueda busqueda__button--xs".replace(" ", ".")
  • 结果卡片定位:"row card-result p-4 bg-featured".replace(" ", ".")

对应解决方法:

  1. 改用稳定定位方式:
    • 搜索按钮用唯一属性定位:
      # 通过按钮文本定位
      driver.find_element(By.XPATH, "//button[contains(text(), 'Buscar')]").click()
      # 或通过核心类名定位
      driver.find_element(By.CSS_SELECTOR, "button.btn-busqueda").click()
      
    • 结果卡片保留核心类名:
      text = driver.find_element(By.CSS_SELECTOR, ".card-result").text
      
  2. 添加异常捕获验证:
    打印页面源码排查元素是否存在:
    try:
        text = driver.find_element(By.CSS_SELECTOR, ".card-result").text
    except Exception as e:
        print("获取结果失败,当前页面源码:")
        print(driver.page_source)
        raise e
    

三、修正等待逻辑错误

你重复调用implicitly_wait的方式有误,该方法是全局隐式等待,只需初始化driver后设置一次。推荐用显式等待精准等待元素加载:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 初始化后设置一次全局隐式等待
driver.implicitly_wait(10)

# 显式等待搜索按钮可点击
search_btn = WebDriverWait(driver, 20).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, "button.btn-busqueda"))
)
search_btn.click()

# 显式等待结果卡片加载完成
result_card = WebDriverWait(driver, 30).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, ".card-result"))
)
text = result_card.text

四、验证搜索词格式匹配

确保脚本搜索词与手动搜索完全一致,比如去除多余空格、调整大小写:

nom_empresa = "LINEAS ESCOLARES Y TURISMO S.A.S".strip()
# 或尝试手动搜索的格式
nom_empresa = "Lineas Escolares Y Turismo S.A.S"

五、检查浏览器与驱动兼容性

若浏览器自动更新,需确保geckodriver版本匹配,用webdriver-manager自动管理:

from webdriver_manager.firefox import GeckoDriverManager
driver = webdriver.Firefox(options=options, executable_path=GeckoDriverManager().install())

内容的提问来源于stack exchange,提问作者MatCordTo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 09:17:04