如何程序化展开IBM Docs左侧面板开关并抓取动态页面数据?
IBM Docs左侧面板全展开及内容抓取实现思路(基于Selenium)
一、环境准备
- 安装Selenium库:
pip install selenium - 下载对应浏览器的WebDriver(如ChromeDriver),确保版本与浏览器匹配,并配置到系统PATH中
- 导入核心模块:
selenium.webdriver、WebDriverWait(显式等待)、expected_conditions等
二、核心实现步骤
1. 初始化浏览器并加载目标页面
- 配置浏览器选项,降低反爬识别风险:
options = webdriver.ChromeOptions() options.add_argument("--disable-blink-features=AutomationControlled") driver = webdriver.Chrome(options=options) - 打开目标链接,用显式等待确保左侧面板加载完成,避免后续元素定位失败:
driver.get("https://www.ibm.com/docs/en/b2b-integrator/6.1.0") wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".ibm-docs-sidebar")))
2. 循环展开所有左侧面板开关
- 核心逻辑:反复查找未展开的开关元素,逐个点击,直到没有可展开项为止
- 定位未展开开关:通过CSS选择器筛选
aria-expanded="false"的开关按钮(需根据实际页面DOM调整选择器) - 点击细节:滚动到元素可见区域再操作,避免因元素不可见导致点击失败,每次点击后短暂等待子项加载:
while True: toggles = driver.find_elements(By.CSS_SELECTOR, ".ibm-docs-sidebar__toggle[aria-expanded='false']") if not toggles: break for toggle in toggles: try: driver.execute_script("arguments[0].scrollIntoView();", toggle) toggle.click() time.sleep(0.5) except Exception as e: print(f"点击开关失败: {e}") continue
3. 抓取全部URL及对应内容
- 展开所有面板后,定位左侧所有链接元素,提取
href属性去重后存入列表:links = driver.find_elements(By.CSS_SELECTOR, ".ibm-docs-sidebar__link") url_list = list({link.get_attribute("href") for link in links if link.get_attribute("href")}) - 遍历每个URL,加载页面后抓取标题、正文等核心内容,可将数据写入文件或数据库:
for url in url_list: driver.get(url) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".ibm-docs-content"))) title = driver.find_element(By.CSS_SELECTOR, ".ibm-docs-title").text content = driver.find_element(By.CSS_SELECTOR, ".ibm-docs-content").text # 保存逻辑示例:写入txt文件 with open(f"{title.replace('/', '_')}.txt", "w", encoding="utf-8") as f: f.write(f"URL: {url}\n\n{content}")
三、关键注意事项
- 反爬规避:设置合理的等待间隔,避免高频操作;可随机添加短延迟,模拟人工操作节奏
- 元素定位容错:页面DOM结构可能更新,需定期检查选择器是否有效,优先使用稳定的类名+属性组合定位元素
- 资源管理:抓取完成后务必调用
driver.quit()关闭浏览器,释放系统资源
内容的提问来源于stack exchange,提问作者Baradwaj Aryasomayajula
相关产品推荐
相关产品推荐

