使用BeautifulSoup爬取港交所市值数据失败问题求助
港交所市值数据爬取问题解决方法
问题原因
港交所该页面的市值数据是动态加载的,requests.get()仅能获取页面初始的静态HTML,而实际市值数据是通过JavaScript在浏览器渲染完成后才加载到页面中的,所以你用BeautifulSoup解析静态内容时,目标dt标签内没有实际文本内容。
解决方案1:使用Selenium模拟浏览器加载
Selenium可以模拟浏览器打开页面,等待JavaScript加载完成后再获取完整页面内容,从而拿到动态渲染的市值数据。
代码示例
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 from bs4 import BeautifulSoup URL = 'https://www.hkex.com.hk/Market-Data/Securities-Prices/Equities/Equities-Quote?sym=82&sc_lang=en' # 初始化Chrome浏览器驱动(需提前下载对应版本的ChromeDriver并配置路径) driver = webdriver.Chrome() driver.get(URL) # 等待目标元素加载完成,最长等待10秒 try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'col_mktcap')) ) # 获取加载完成后的页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, "html.parser") # 查找市值标签并提取相邻dd标签内的数值 mktcap_element = soup.find("dt", class_="ico_data col_mktcap") if mktcap_element: mktcap_value = mktcap_element.find_next_sibling("dd").text.strip() print(f"市值:{mktcap_value}") finally: driver.quit()
解决方案2:直接调用页面API接口
通过浏览器开发者工具找到页面加载市值数据的API接口,直接请求接口获取数据,这种方法比Selenium更高效。
操作步骤
- 打开目标页面,按F12打开开发者工具
- 切换到「网络」标签,刷新页面
- 筛选「XHR」类型的请求,查找包含
mktcap或quote关键词的接口 - 复制接口URL和请求参数,用
requests直接请求获取JSON格式数据
示例代码(需根据实际接口调整)
import requests # 示例API接口(实际需从开发者工具中获取真实接口) API_URL = "https://www.hkex.com.hk/Market-Data/Securities-Prices/Equities/Equities-Quote/GetQuote?sym=82&sc_lang=en" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } response = requests.get(API_URL, headers=headers) if response.status_code == 200: data = response.json() # 根据返回的JSON结构提取市值数据,路径需按需调整 mktcap = data.get("quote", {}).get("mktCap", "") print(f"市值:{mktcap}")
注意事项
- 使用Selenium时,浏览器驱动版本需与本地浏览器版本匹配
- 请求API接口时,需携带合适的请求头,避免被网站拦截
- 港交所的接口可能会不定期更新,需定期验证接口有效性
内容的提问来源于stack exchange,提问作者zaaaaannnnnnnng
相关产品推荐
相关产品推荐

