You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BeautifulSoup爬取MQL5经济日历返回空列表问题求助

嘿,我明白你遇到的问题了——我之前爬动态渲染的页面也踩过这个坑!

问题根源

你用requests拿到的页面其实是静态初始HTML,而MQL5的经济日历内容是通过JavaScript动态加载的。也就是说,当你用requests请求时,那些带ec-table__title的元素还没被渲染出来,economicCalendarTable标签里的超长文本其实是未执行的JS模板或数据占位符,不是真正的DOM元素,所以BeautifulSoup自然找不到目标内容。

解决方案

这里给你两种可行的解决思路,按需选择:

方案一:用Selenium模拟浏览器渲染页面

Selenium可以模拟真实浏览器加载页面,等待JS执行完成后再获取完整的DOM内容,步骤如下:

  1. 先安装依赖和浏览器驱动:
pip install selenium

(记得把对应浏览器的驱动比如ChromeDriver放到系统PATH里,或者在代码里指定路径)

  1. 修改后的代码示例:
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

# 配置浏览器选项,启用无头模式(不弹出可视化窗口)
options = webdriver.ChromeOptions()
options.add_argument('--headless=new')
options.add_argument('--disable-images')  # 禁用图片加载提升速度
driver = webdriver.Chrome(options=options)

try:
    driver.get('https://www.mql5.com/en/economic-calendar/united-states')
    # 等待目标元素加载完成,最多等待10秒
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'ec-table__title'))
    )
    # 获取渲染后的完整页面源码
    page_source = driver.page_source
    soup = BeautifulSoup(page_source, 'html.parser')
    calendar = soup.find(id="economicCalendarTable")
    items = calendar.find_all(class_="ec-table__title")
    
    # 打印提取到的内容
    for item in items:
        print(item.get_text(strip=True))
finally:
    # 不管成功失败,都关闭浏览器
    driver.quit()

方案二:直接调用页面的API接口(更高效)

模拟浏览器虽然有效,但速度慢还容易触发反爬。更优的方法是找到页面加载数据的API接口,直接请求接口获取结构化的JSON数据:

  1. 打开浏览器开发者工具(F12),切换到Network标签页,刷新页面;
  2. 筛选XHR请求,找到类似get_events或包含economic-calendar的请求——这就是页面获取日历数据的接口;
  3. 直接用requests请求该接口,解析JSON即可:
import requests

# 配置请求头,模拟真实浏览器
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
# 替换成你从开发者工具里找到的真实API地址
api_url = 'https://www.mql5.com/en/economic-calendar/get_events'
# 接口参数从开发者工具的请求里复制(比如国家、日期范围等)
params = {
    'country': 'united-states',
    'date_from': '2024-05-01',
    'date_to': '2024-05-07'
}

response = requests.get(api_url, headers=headers, params=params)
data = response.json()

# 遍历JSON数据提取你需要的标题内容
for event in data.get('events', []):
    print(event.get('title'))  # 字段名根据实际API返回调整

注意事项

  • 两种方法都要设置合理的User-Agent请求头,避免被网站识别为爬虫封禁IP;
  • API接口的参数可能会随网站更新变化,需要定期检查开发者工具确认接口有效性;
  • 用Selenium时,建议添加无头模式和禁用图片加载,提升爬取效率。

内容的提问来源于stack exchange,提问作者manojg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:03:28