Selenium网页爬取脚本未返回预期结果,手动搜索正常求助
Selenium爬取ruesfront.rues.org.co突然无结果,但手动搜索正常的排查与解决
一、优先排查反爬机制触发
网站大概率新增了反爬检测,针对自动化工具的特征识别:
- 浏览器指纹检测:Selenium默认浏览器会暴露
navigator.webdriver等自动化特征,网站会据此拦截请求,而手动浏览器无此标识。 - IP访问频率限制:脚本频繁请求可能触发IP临时封禁,日常手动搜索用的是常用IP,不受影响。
- 会话验证差异:网站可能依赖特定会话Cookie返回结果,自动化工具的会话与手动浏览器会话不匹配。
对应解决方法:
- 隐藏自动化特征:
给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})") - 模拟真实用户行为:
添加随机延迟、页面滚动等操作,降低被识别概率:time.sleep(1) # 打开页面后等待1秒 driver.find_element(By.ID, "search").send_keys(nom_empresa) time.sleep(1) # 输入完成后等待1秒再点击 - 切换代理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(" ", ".")
对应解决方法:
- 改用稳定定位方式:
- 搜索按钮用唯一属性定位:
# 通过按钮文本定位 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
- 搜索按钮用唯一属性定位:
- 添加异常捕获验证:
打印页面源码排查元素是否存在: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
相关产品推荐
相关产品推荐

