选择下拉框后URL未变化,无法爬取克林顿基金会网站数据排查
问题修复方案
你的代码存在几个关键问题,导致无法成功爬取数据,以下是问题分析和修复方案:
核心问题分析
- 动态内容请求错误:选择"ALL"后页面数据是通过JavaScript动态渲染的,
requests.get(current_url)获取的是页面初始静态内容,并非加载后的完整捐赠者数据。 - 未定义变量报错:代码中
donor_list未声明就直接调用find_all,会触发NameError。 - 下拉框操作方式错误:该下拉框是标准select元素,应使用Selenium的
Select类处理,而非点击后查找链接文本。 - 等待逻辑不稳定:仅靠
time.sleep(5)无法确保数据完全加载,容易出现元素未找到的情况。
修复后的代码
import pandas as pd from selenium import webdriver from selenium.webdriver.support.ui import Select from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器驱动(注意:ChromeDriver版本需与本地Chrome浏览器匹配) driver = webdriver.Chrome() driver.get("https://www.clintonfoundation.org/about-the-clinton-foundation#reports-financials/") try: # 显式等待下拉框加载完成,用Select类选择"ALL"选项 dropdown = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "filtered-list-taxonomy")) ) select = Select(dropdown) select.select_by_visible_text("ALL") # 等待捐赠者列表完全加载 WebDriverWait(driver, 15).until( EC.presence_of_all_elements_located((By.CLASS_NAME, "items-list-block-item")) ) # 从已渲染的页面中提取数据 donor_items = driver.find_elements(By.CLASS_NAME, "items-list-block-item") donors = [] for item in donor_items: name = item.find_element(By.TAG_NAME, "h3").text.strip() amount = item.find_element(By.CLASS_NAME, "item-amount").text.strip() donors.append({"捐赠者姓名": name, "捐赠区间": amount}) # 转换为DataFrame并保存 df = pd.DataFrame(donors) print(df.head()) df.to_csv("克林顿基金会捐赠者数据.csv", index=False, encoding="utf-8-sig") finally: driver.quit()
额外说明
- 需保证ChromeDriver版本与本地Chrome浏览器版本一致,否则会出现驱动不兼容问题。
- 若页面加载缓慢,可适当调整显式等待的超时时间(如将10改为15)。
- 动态页面爬取时,无需用requests重新请求URL,直接通过Selenium操作已渲染的页面即可。
内容的提问来源于stack exchange,提问作者Umesh Kumar
相关产品推荐
相关产品推荐

