如何用Selenium WebDriver获取Quizlet教材页面的习题链接?
解决Quizlet教材习题链接爬取不全的问题
你的问题在于只展开了章节的主面板,但每个章节下的小节可能还需要额外点击展开才能显示所有习题链接。以下是修改后的代码方案:
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 driver = webdriver.Chrome() # 替换为你使用的浏览器驱动 driver.get("https://quizlet.com/explanations/textbook-solutions/linear-algebra-done-right-3rd-edition-9783319110790") urls = [] # 1. 展开所有章节的主面板 chapter_expand_buttons = WebDriverWait(driver, 30).until( EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div.c1tlcqh7 > div.cnuw08l > button")) ) for btn in chapter_expand_buttons: # 仅点击未展开的按钮 if "collapsed" in btn.get_attribute("class"): btn.click() # 等待该章节下的小节区域加载完成 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, f"{btn.parent_element.parent_element} div.e1tk5ihi")) ) # 2. 展开所有章节下的小节面板 section_expand_buttons = WebDriverWait(driver, 30).until( EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div.e1tk5ihi button")) ) for btn in section_expand_buttons: if "collapsed" in btn.get_attribute("class"): btn.click() # 等待小节内的链接加载完成 WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.CSS_SELECTOR, f"{btn.parent_element} a")) ) # 3. 抓取所有习题链接 all_links = WebDriverWait(driver, 60).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.e1tk5ihi > span > a")) ) for link in all_links: href = link.get_attribute("href") if href not in urls: urls.append(href) print(f"共抓取到 {len(urls)} 个习题链接") driver.quit()
核心改进说明:
- 新增小节展开逻辑:遍历章节下所有小节的展开按钮,确保隐藏的习题链接全部显示。
- 增加状态判断:通过按钮的
class属性判断是否处于折叠状态,避免重复点击已展开的面板。 - 优化等待策略:每次点击后针对当前操作区域设置局部等待,避免页面未渲染完成导致的元素查找失败。
内容的提问来源于stack exchange,提问作者Datajack
相关产品推荐
相关产品推荐

