使用Selenium爬取HackerOne网页时无法获取任何数据是什么原因?
问题根因
- 未设置元素等待逻辑:HackerOne页面为客户端动态渲染,调用
driver.get()或点击跳转后,DOM元素不会立刻渲染完成,直接执行元素查找逻辑会返回空列表。 - 未提取WebElement对象的文本内容:当前代码直接将WebElement对象存入列表返回,就算元素定位成功,输出的也不是你需要的URL文本。
- 驱动生命周期逻辑错误:
scanProgramme方法内执行了driver.close(),单次调用后浏览器就会被关闭,后续再次调用该方法无可用驱动实例。 - 缺少异常捕获逻辑:若传入的项目名不存在、页面加载失败都会直接抛出异常,无法正常返回结果。
修复方案
1. 引入显式等待
使用Selenium自带的WebDriverWait配合expected_conditions,等待目标元素渲染完成后再执行提取逻辑,避免空结果。
2. 调整驱动生命周期逻辑
不要在单次查询后直接关闭浏览器,仅在所有任务执行完成后再退出驱动。
3. 补充元素文本提取逻辑
定位到<span>元素后调用.text属性提取URL文本。
4. 补充异常捕获
对超时、元素不存在等常见异常做捕获,返回可识别的错误提示。
修正后的核心代码示例
import bs4 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException, NoSuchElementException # 全局仅初始化一次驱动 driver = webdriver.Chrome() # 全局设置最长等待时间为10秒,可根据网络情况调整 wait = WebDriverWait(driver, 10) driver.get("https://hackerone.com/directory/programs?offers_bounties=true&asset_type=URL&order_direction=DESC&order_field=started_accepting_at") def scanProgramme(programme): try: # 等待项目链接可点击后再执行点击操作 programme_link = wait.until( EC.element_to_be_clickable((By.LINK_TEXT, programme)) ) programme_link.click() # 等待目标span元素全部加载完成 link_elements = wait.until( EC.presence_of_all_elements_located((By.XPATH, '//span[@class="break-word"]')) ) # 提取元素文本存入列表,而非直接返回WebElement对象 all_links = [elem.text for elem in link_elements] # 退回项目列表页,方便后续调用 driver.back() return all_links except TimeoutException: return ["错误:页面加载超时,未找到对应元素"] except NoSuchElementException: return ["错误:未找到指定名称的项目"] # 所有爬虫任务执行完成后再退出驱动 # driver.quit()
补充:若调整后仍返回空结果,可在Selenium打开的浏览器窗口中手动登录HackerOne账号,部分项目的资产列表对未登录用户不可见。
内容的提问来源于stack exchange,提问作者CrypticDev
相关产品推荐
相关产品推荐

