首次网页爬取遇阻:无法获取bonbast.com的美元、欧元汇率值
解决bonbast.com爬取汇率为空的问题
问题原因
你用requests获取的是网站的静态初始HTML,但bonbast的汇率数据是通过JavaScript动态渲染生成的——这些你要找的元素(id="usd1"、class="same_val")在静态页面里根本不存在,所以BeautifulSoup自然找不到对应内容,输出为空。
两种可行解决方案
方案一:直接调用API接口(高效推荐)
bonbast提供了公开的汇率API接口,直接请求就能拿到结构化的JSON数据,无需解析HTML:
import requests # 请求汇率API resp = requests.get("https://bonbast.com/api/latest") exchange_data = resp.json() # 提取美元、欧元的买卖汇率 usd_buy = exchange_data['usd']['buy'] usd_sell = exchange_data['usd']['sell'] eur_buy = exchange_data['eur']['buy'] eur_sell = exchange_data['eur']['sell'] print(f"美元买入: {usd_buy} | 美元卖出: {usd_sell}") print(f"欧元买入: {eur_buy} | 欧元卖出: {eur_sell}")
方案二:用Selenium模拟浏览器加载动态内容
如果找不到API,可通过模拟浏览器等待JS渲染完成后再抓取页面:
- 先安装依赖:
pip install selenium - 下载对应浏览器的驱动(比如ChromeDriver,需和浏览器版本匹配)
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from bs4 import BeautifulSoup # 初始化Chrome驱动(需确保驱动路径正确) driver = webdriver.Chrome() driver.get("https://bonbast.com/") # 等待目标元素加载完成(最多等10秒) WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "usd1")) ) # 获取渲染后的页面源码 page_html = driver.page_source soup = BeautifulSoup(page_html, "html.parser") # 提取目标数据 usd_element = soup.find(id="usd1") same_val_elements = soup.find_all(class_="same_val") print(usd_element.text if usd_element else "未找到美元汇率") for elem in same_val_elements: print(elem.text.strip()) # 关闭浏览器 driver.quit()
注意事项
- 使用API时,不要频繁请求,避免触发网站的反爬限制;
- Selenium驱动版本必须和浏览器版本一致,否则会启动失败。
内容的提问来源于stack exchange,提问作者Zeroday
相关产品推荐
相关产品推荐

