使用Selenium爬取漫威官网时搜索功能无法正常运行
问题根因
代码无法触发搜索有几个明确的问题:
- 自定义Chrome配置完全没生效:代码里定义了无头模式、窗口尺寸参数,但初始化
webdriver.Chrome()时没有传入options参数,所有配置都没实际加载,默认小窗口下很容易出现元素定位偏移、点击被页面其他元素拦截的问题。 - 前端动画阻断交互:Cookie同意弹窗、搜索弹出框都有淡入淡出的过渡动画,仅判断DOM里元素可点击就立刻操作,大概率会被还没消失的遮罩层挡住,或者搜索框还没完成焦点绑定,输入的内容、触发的回车都不会被响应。
- 搜索触发逻辑不匹配:当前漫威站点的搜索框做了输入防抖,直接把
Keys.RETURN拼在搜索关键词后面一起传入send_keys,事件会被防抖逻辑吞掉,不会触发搜索跳转。 - 硬编码驱动路径兼容性差:手动写死chromedriver的本地存储路径,只要浏览器自动更新、驱动位置变动,代码就会直接启动失败。
可运行修正代码
from selenium import webdriver from selenium.webdriver import Keys from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC import time user_input = input("character: ") options = Options() options.headless = True options.add_argument("--window-size=1920,1080") # 关闭自动化标识,降低被站点反爬识别的概率 options.add_argument("--disable-blink-features=AutomationControlled") options.add_experimental_option("excludeSwitches", ["enable-automation"]) # 传入配置参数,Selenium 4.6及以上版本无需手动指定chromedriver路径,会自动匹配对应浏览器版本的驱动 driver = webdriver.Chrome(options=options) wait = WebDriverWait(driver, 20) driver.get("https://www.marvel.com/search") # 处理Cookie授权弹窗,等待弹窗遮罩完全消失再进行下一步 wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button#onetrust-accept-btn-handler"))).click() wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR, "div.onetrust-pc-dark-filter"))) time.sleep(0.5) # 点击搜索图标,等待搜索框弹出动画完全结束后再输入内容 wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.nav-icon.gcom-icon-search"))).click() search_input = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#searchString"))) time.sleep(0.8) search_input.clear() search_input.send_keys(user_input) time.sleep(0.3) # 等待输入内容同步到输入框,避开防抖拦截 search_input.send_keys(Keys.RETURN) # 后续可在此处添加搜索结果解析逻辑 print("搜索触发完成,当前页面地址:", driver.current_url) driver.quit()
更稳定的优化方案
不需要模拟繁琐的前端点击操作,漫威搜索页原生支持URL传参直达结果页,跳过所有交互步骤,运行效率和稳定性比模拟UI操作高很多:
user_input = input("character: ") options = Options() options.headless = True options.add_argument("--window-size=1920,1080") options.add_argument("--disable-blink-features=AutomationControlled") driver = webdriver.Chrome(options=options) wait = WebDriverWait(driver, 20) # 直接构造搜索结果页地址访问 driver.get(f"https://www.marvel.com/search?query={user_input}") # 等待搜索结果模块加载完成即可开始解析 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.search-results")))
内容的提问来源于stack exchange,提问作者Christopher McClure
相关产品推荐
相关产品推荐

