Python数据爬取:如何等待请求加载完成以获取目标表格
解决Python爬虫等待动态加载结果的问题
遇到这种需要交互后等待页面动态渲染结果的场景,普通的requests库因为无法处理JavaScript渲染的内容,确实很难搞定。这里推荐你使用Selenium——它能模拟真实浏览器的操作,还支持灵活的等待机制,刚好适配你的需求。下面是具体的实现步骤和代码示例:
准备工作
首先需要安装Selenium和对应浏览器的驱动:
- 安装Selenium:
pip install selenium - 下载对应浏览器的驱动(比如Chrome的ChromeDriver),确保驱动版本和你的浏览器版本匹配,并且把驱动放到系统PATH里,或者在代码里指定路径。
代码实现思路
核心思路是用Selenium模拟手动操作的流程,然后通过显式等待来等待页面元素加载完成(比隐式等待更精准可靠):
- 打开目标页面,等待"Caderno 2.0"按钮加载完成并点击
- 找到下拉列表,选择第一个选项
- 触发查询操作(比如点击查询按钮)
- 等待加载提示消失(或者结果表格出现)
- 提取表格数据
- 关闭浏览器
完整代码示例
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait, Select from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器(这里用Chrome,你也可以换成Firefox等) driver = webdriver.Chrome() # 隐式等待(可选,作为兜底) driver.implicitly_wait(10) try: # 打开目标页面 driver.get("http://www.ans.gov.br/perfil-do-setor/dados-e-indicadores-do-setor/sala-de-situacao") # 等待并点击"Caderno 2.0"按钮(这里的定位器需要你根据实际页面调整) caderno_btn = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), 'Caderno 2.0')]")) ) caderno_btn.click() # 等待下拉列表加载完成,选择第一个选项 dropdown = WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.ID, "替换为实际下拉框ID")) # 换成页面真实的下拉框定位器 ) select = Select(dropdown) select.select_by_index(0) # 选择第一个选项 # 点击查询按钮(替换成实际的按钮定位器) query_btn = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), '执行操作的按钮文本')]")) ) query_btn.click() # 等待加载完成:可以等待加载提示消失,或者结果表格出现 # 示例1:等待加载提示消失(根据你提供的图片,匹配页面加载提示的元素) WebDriverWait(driver, 30).until( EC.invisibility_of_element_located((By.XPATH, "//*[contains(text(), '加载中...')]")) ) # 示例2:等待结果表格出现(替换成实际表格的定位器) result_table = WebDriverWait(driver, 30).until( EC.presence_of_element_located((By.TAG_NAME, "table")) ) # 提取表格数据(这里简单打印HTML,你可以进一步解析成CSV或DataFrame) print(result_table.get_attribute("outerHTML")) finally: # 关闭浏览器 driver.quit()
关键说明
- 元素定位器:代码里的XPath、ID等定位器需要你根据实际页面的HTML结构调整,你可以用浏览器开发者工具(F12)查看元素属性来获取准确的定位方式。
- 显式等待:
WebDriverWait配合expected_conditions(EC)是Selenium中最可靠的等待方式,它会在指定时间内轮询检查条件是否满足,比固定的time.sleep()更高效稳定。 - 加载等待逻辑:你可以根据页面实际情况选择等待加载提示消失,或者等待目标表格出现,哪种逻辑更贴合页面变化就用哪种。
如果在定位元素或者等待逻辑上遇到问题,用浏览器开发者工具跟踪页面的DOM变化,调整对应的定位器和等待条件即可。
内容的提问来源于stack exchange,提问作者Gustavo Cunha
相关产品推荐
相关产品推荐

