如何用BeautifulSoup抓取JavaScript渲染的StatusInvest股票数据?
解决JavaScript渲染页面的数据抓取问题(针对statusinvest.com.br/acoes/petr4)
因为BeautifulSoup只能解析静态HTML,处理不了JavaScript动态渲染的内容,给你两个实用的解决办法:
方法一:直接调用网站的API接口(推荐,效率更高)
很多动态渲染的页面其实是通过后台API获取数据再渲染的,你可以直接抓这个API:
- 打开浏览器F12进入开发者工具,切换到「Network」标签页,刷新页面
- 筛选「XHR」或「Fetch」类型的请求,找包含
PETR4或数据相关的请求(比如返回JSON格式的) - 复制该请求的URL、请求头(尤其是User-Agent),用
requests库直接请求
示例代码:
import requests # 替换成你找到的实际API接口URL api_url = "https://statusinvest.com.br/acao/companyfinancialresult/chartresult?ticker=PETR4&type=1&range=1" headers = { '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' } response = requests.get(api_url, headers=headers) if response.status_code == 200: data = response.json() print(data) # 这里就是你要的结构化数据,直接提取即可 else: print("请求失败,状态码:", response.status_code)
方法二:用Selenium模拟浏览器渲染
如果找不到API,就用Selenium模拟真实浏览器加载页面,等JS渲染完成后再抓取源码:
- 先安装Selenium:
pip install selenium - 下载对应浏览器的驱动(比如ChromeDriver,要和你的Chrome版本匹配)
示例代码:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from bs4 import BeautifulSoup import time # 替换为你的ChromeDriver文件路径 service = Service('chromedriver.exe') # Windows系统,Mac/Linux换成对应的路径 driver = webdriver.Chrome(service=service) driver.get('https://statusinvest.com.br/acoes/petr4') time.sleep(3) # 等待页面完全渲染,时间可根据实际调整 # 获取渲染后的完整页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, 'html.parser') # 示例:抓取当前股价(根据页面实际元素调整选择器) price_element = soup.find('strong', class_='value') if price_element: print(f"PETR4当前股价: {price_element.get_text(strip=True)}") driver.quit() # 关闭浏览器
注意事项
- 不要频繁发送请求,避免触发网站反爬机制导致IP被封
- API接口可能会随网站更新变化,需要定期检查开发者工具里的请求
- Selenium的驱动版本要和浏览器版本保持一致,否则会报错
内容的提问来源于stack exchange,提问作者Álan Gabriel
相关产品推荐
相关产品推荐

