Selenium爬取LinkedIn Sales Navigator出现ElementClickInterceptedException如何解决
问题分析
ElementClickInterceptedException报错核心有两个问题,还有一处明显的逻辑漏洞:
- 显式等待语法错误:
wait.until(EC.element_to_be_clickable(lead.click()))写法完全错误,EC.element_to_be_clickable的入参应该是元素/元素定位器,你直接在入参里执行lead.click(),等于还没做可点击判断就提前触发了点击操作,完全不符合显式等待的逻辑。 - 元素被遮挡:报错里明确提到你要点击的按钮被
account-sticky-header类的悬浮头部挡住了,LinkedIn Sales Navigator的固定顶栏会挡住滚动到顶部附近的元素,导致点击被拦截。 - 页面数据源逻辑错误:你点击按钮打开新标签页后,没有切换到新标签页的页面对象,
soup如果还是基于原标签页的内容解析,自然拿不到新页面的线索数据。
修复方案
修复后的代码如下:
from selenium.webdriver.common.action_chains import ActionChains from bs4 import BeautifulSoup import time lead_links = [] # 建议换成CSS选择器定位多类元素,兼容性更好 leads_button = browser.find_elements_by_css_selector('.button--unstyled.t-16.font-weight-600.nowrap-ellipsis') original_window = browser.current_window_handle # 保存原标签页句柄 for lead in leads_button: wait = WebDriverWait(browser, 10) # 先等待元素可点击 wait.until(EC.element_to_be_clickable(lead)) # 把元素滚动到视口中间,避免被顶部悬浮头挡住 browser.execute_script("arguments[0].scrollIntoView({block: 'center'});", lead) time.sleep(0.5) # 直接用JS执行点击,绕过前端点击拦截校验 browser.execute_script("arguments[0].click();", lead) # 等待新标签页打开,切换到新标签页 wait.until(EC.number_of_windows_to_be(2)) for window_handle in browser.window_handles: if window_handle != original_window: browser.switch_to.window(window_handle) break # 等待新页面加载完成 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.artdeco-entity-lockup__title'))) # 用新标签页的内容初始化soup,再提取数据 soup = BeautifulSoup(browser.page_source, 'html.parser') leads = soup.find_all("div", attrs={ 'class': 'artdeco-entity-lockup__title artdeco-entity-lockup__title--alt-link ember-view'}) for lead_person in leads: lead_links.append(lead_person.a["href"]) # 关闭当前标签页,切回原页面处理下一个按钮 browser.close() browser.switch_to.window(original_window) time.sleep(1) # 加延迟避免触发反爬
额外注意
- 操作频率不要太高,LinkedIn反爬机制严格,频繁操作容易触发验证码甚至封号。
- 如果你不需要操作页面交互,也可以直接提取按钮里的跳转链接,用
requests请求对应页面,性能更高也不容易出现点击异常。
内容的提问来源于stack exchange,提问作者technophile_3
相关产品推荐
相关产品推荐

