使用Selenium与BeautifulSoup爬取三家银行汇率表仅获取HTML元素无文本内容的技术求助
解决Selenium爬取银行汇率表仅获取HTML结构无文本内容的问题
你遇到的这个问题在爬取现代动态网站时很常见——很多银行网站会用JavaScript异步加载汇率数据,仅仅靠implicitly_wait(10)不一定能确保数据完全渲染到页面中。下面我帮你一步步排查和解决:
核心原因分析
隐式等待implicitly_wait只是告诉Selenium在找不到元素时最多等待指定时间,但它不会等待动态加载的数据填充到表格。当你调用driver.page_source时,可能表格的HTML结构已经生成,但数据还没从后端接口加载完成,所以只能拿到空的表格壳子。
解决方案1:改用显式等待(确保数据加载完成)
显式等待可以指定等待某个具体条件满足(比如表格出现数据行),这能保证你获取页面源码时,数据已经渲染完成。修改后的代码示例:
import requests from bs4 import BeautifulSoup 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 PATH = r'C:\Users\xxxxxx\AppData\Local\chromedriver.exe' driver = webdriver.Chrome(PATH) driver.get('https://www.erstebank.hr/hr/tecajna-lista') try: # 等待表格的tbody出现,并且里面至少有一行数据(根据网站实际结构调整选择器) WebDriverWait(driver, 20).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'tbody tr')) ) finally: # 此时再获取页面源码,就能拿到带数据的表格 soup = BeautifulSoup(driver.page_source, 'lxml') tables = soup.find_all('table') # 遍历表格并打印文本内容 for idx, table in enumerate(tables): print(f"=== 表格 {idx+1} 内容 ===") print(table.get_text(strip=True, separator='\n')) driver.close()
其他可能的排查方向
1. 检查页面是否包含iframe
部分网站会把汇率表格放在iframe中,这时候你需要先切换到iframe才能获取内容:
# 先找到对应的iframe(需要查看页面源码确认iframe的id/name/选择器) iframe = driver.find_element(By.ID, 'rate-frame') driver.switch_to.frame(iframe) # 之后再执行显式等待和爬取操作
2. 应对反爬机制
银行网站可能会检测自动化工具,你可以给Chrome添加模拟浏览器的参数,避免被识别:
from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--disable-blink-features=AutomationControlled") chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") driver = webdriver.Chrome(PATH, options=chrome_options)
3. 直接抓取API接口(更高效)
打开浏览器开发者工具的「Network」标签,刷新页面后查看XHR/fetch请求,你会发现很多银行会用API接口返回JSON格式的汇率数据。直接用requests请求这个接口,比用Selenium更高效,也避免了动态渲染的问题。
针对三个网站的通用建议
每个银行网站的页面结构不同,你需要分别检查:
- 对于Erste Bank:确认表格是否在iframe中,或者调整显式等待的元素选择器
- 对于OTP Bank:查看表格的CSS类/id,针对性设置等待条件
- 对于Sber Bank:检查是否有动态加载的API接口,优先考虑直接请求接口
内容的提问来源于stack exchange,提问作者sitni
相关产品推荐
相关产品推荐

