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

Python异步请求爬取求助:东方财富港股通EventSteam数据爬取问题

如何爬取东方财富沪港通页面的实时推送数据?

问题背景

你尝试用Python爬取东方财富沪港通页面(http://data.eastmoney.com/hsgt/index.html),想要获取页面上的-94.67亿元数据,但遇到了两个棘手问题:

  1. 用requests请求页面后,返回的静态HTML里完全找不到目标数据——查看请求日志发现,页面没有用常规XHR接口加载数据,而是通过**Server-Sent Events(SSE/EventStream)**实时推送内容;
  2. 想通过dryscape模拟浏览器渲染解决,但安装失败,提示缺少web服务器相关文件。

你原本的代码如下:

import requests
import pandas as pd
from pyquery import PyQuery
from lxml import etree
import time
response = requests.get(url='http://data.eastmoney.com/hsgt/index.html', headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'})
response.encoding = 'GB2312'
# 此代码的response.text中无法找到'-94.67'

问题原因拆解

  • requests只能获取页面的初始静态HTML,无法建立长连接接收SSE推送的实时数据,所以找不到目标值;
  • dryscape是一个停止维护的老旧库,依赖环境复杂,现在已经不推荐使用,安装失败是常见问题。

可行解决方案

方案1:直接对接SSE接口(轻量高效)

页面的实时数据是通过SSE接口推送的,我们可以直接请求这个接口并解析推送的内容:

  1. 抓包获取SSE接口信息:打开浏览器开发者工具(F12)→ 切换到Network标签 → 筛选Type为event-stream的请求,复制它的URL和请求头(比如Referer、Cookie等,从抓包结果里直接复制即可);
  2. 安装SSE处理库:
pip install sseclient-py
  1. 编写代码接收并解析数据:
import requests
from sseclient import SSEClient
import json

# 替换成你抓包到的EventStream接口URL
sse_url = "你的SSE接口URL"
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36',
    'Referer': 'http://data.eastmoney.com/hsgt/index.html',
    # 其他需要的请求头从抓包结果复制
}

# 建立长连接接收SSE事件
messages = SSEClient(sse_url, headers=headers)
for msg in messages:
    if msg.data:
        try:
            # 推送的数据一般是JSON格式,解析后提取目标字段
            data = json.loads(msg.data)
            # 根据实际数据结构调整字段名,这里假设目标字段是netAmount
            if 'netAmount' in data:
                print(f"北向资金净额:{data['netAmount']}亿元")
                # 获取到数据后终止连接
                break
        except json.JSONDecodeError:
            # 忽略非JSON格式的推送消息
            continue

注意:部分SSE接口可能带临时参数,需要定期抓包更新,或者从页面初始JS中提取参数。

方案2:用现代无头浏览器模拟渲染(省心稳定)

如果不想处理接口细节,推荐使用维护活跃的无头浏览器工具(比如playwright),它能完整模拟浏览器渲染过程,自动处理SSE推送:

  1. 安装依赖:
pip install playwright
# 安装Chrome浏览器驱动
playwright install chrome
  1. 编写代码获取数据:
from playwright.sync_api import sync_playwright
import time

with sync_playwright() as p:
    # 启动无头浏览器(headless=True表示不显示窗口)
    browser = p.chromium.launch(headless=True)
    page = browser.new_page(user_agent='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36')
    page.goto('http://data.eastmoney.com/hsgt/index.html')
    # 等待SSE数据推送完成,根据实际情况调整等待时间
    time.sleep(3)
    # 替换成你在浏览器中找到的目标元素CSS选择器(比如右键元素→检查→复制选择器)
    target_locator = page.locator('目标元素的CSS选择器')
    # 获取元素文本
    net_amount = target_locator.text_content()
    print(f"北向资金净额:{net_amount}")
    browser.close()

这个方法无需关心数据加载方式,只要页面能显示,就能捕获到数据,非常适合复杂的动态页面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:37:46