无法在BeautifulSoup中获取页面历史行情数据的技术求助
问题原因
这个页面的「历史行情」数据是通过JavaScript动态加载的,requests库只能获取页面的初始HTML源码,无法执行JS渲染后续加载的内容,所以你用BeautifulSoup解析不到目标数据。
方案1:用Selenium模拟浏览器加载(直观易实现)
Selenium可以模拟浏览器打开页面,等待JS渲染完成后再获取页面内容,这样就能拿到包含历史行情的HTML。
代码示例:
import pandas as pd 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.marketscreener.com/quote/index/MSCI-WORLD-SIZE-TILT-NETR-121861272/quotes/" # 初始化Chrome浏览器(需提前下载对应版本的chromedriver) driver = webdriver.Chrome() driver.get(url) # 等待历史行情表格加载完成 try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "table.historicalQuotes")) ) finally: page_content = driver.page_source driver.quit() # 解析提取数据 page_soup = BeautifulSoup(page_content, "html.parser") table = page_soup.find("table", class_="historicalQuotes") data = [] # 跳过表头行,遍历数据行 for row in table.find_all("tr")[1:]: cols = row.find_all("td") if len(cols) >= 2: date = cols[0].text.strip() close_price = cols[1].text.strip() data.append({"日期": date, "收盘价": close_price}) # 转为DataFrame df = pd.DataFrame(data) print(df)
方案2:直接调用API接口(更高效)
通过浏览器开发者工具(F12-网络标签页)抓包,能发现页面加载时会调用API接口获取历史行情数据,直接请求接口比模拟浏览器更高效。
代码示例(需根据实际抓包结果更新API地址和参数):
import requests import pandas as pd # 抓包获取的API地址及参数 api_url = "https://www.marketscreener.com/api/historical-quotes" params = { "instrumentId": "121861272", "period": "daily", "startDate": "2023-01-01", "endDate": "2024-01-01" } headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.1234.567 Safari/537.36", "Referer": "https://www.marketscreener.com/quote/index/MSCI-WORLD-SIZE-TILT-NETR-121861272/quotes/" } response = requests.get(api_url, params=params, headers=headers) data = response.json() # 转换为DataFrame df = pd.DataFrame(data, columns=["date", "close"]) df.columns = ["日期", "收盘价"] print(df)
注意事项
- 使用Selenium时,需保证
chromedriver版本与Chrome浏览器版本匹配。 - API接口的地址、参数可能随网站更新变化,需自行抓包确认最新信息。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

