使用Selenium抓取StartupBase网站子页面遇到问题求助
解决思路
核心问题
你点击子页面失败主要有三点原因:
- 使用了绝对路径的XPath,页面结构稍有变动就会定位失效
- 未做元素加载校验,容易出现元素未渲染完成就执行点击的报错
- 部分场景下元素可能被其他组件遮挡,普通点击操作无法触发
推荐修改方案
方案1:通过拼接href直接访问子页面(稳定性最高)
你已经通过BeautifulSoup拿到了子页面的相对路径,直接拼接域名即可访问,无需走点击逻辑,修改代码如下:
base_domain = "https://startupbase.com.br" for container in containers: # 获取子页面相对路径 child_path = container.find('a', href=True)['href'] # 拼接完整访问地址 child_url = base_domain + child_path # 直接访问子页面 driver.get(child_url) time.sleep(3) # 此处编写子页面信息提取逻辑 # 提取完成后返回列表页 driver.back() time.sleep(2)
方案2:优化Selenium点击逻辑
如果必须使用点击操作,替换绝对XPath为相对选择器+显式等待+JS点击,首先导入依赖:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC
修改循环内的点击逻辑:
# 显式等待当前页所有公司卡片加载完成 card_links = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.search-body__item a")) ) for idx in range(len(card_links)): # 每次返回列表页后重新定位元素,避免元素过期报错 target_link = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, f"div.search-body__item a:nth-child({idx+1})")) ) # JS点击规避元素遮挡问题 driver.execute_script("arguments[0].click();", target_link) time.sleep(3) # 此处编写子页面信息提取逻辑 # 返回列表页 driver.back() time.sleep(2)
其他优化建议
- 尽量用显式等待替代
time.sleep()硬等待,既能提升爬取效率也能减少加载异常 - 单页公司提取完成后增加翻页判断,检测到下一页按钮可点击时加载下一页数据
- 可适当增加请求间隔,避免触发反爬限制
内容的提问来源于stack exchange,提问作者conradobio
相关产品推荐
相关产品推荐

