Python异步请求爬取求助:东方财富港股通EventSteam数据爬取问题
如何爬取东方财富沪港通页面的实时推送数据?
问题背景
你尝试用Python爬取东方财富沪港通页面(http://data.eastmoney.com/hsgt/index.html),想要获取页面上的-94.67亿元数据,但遇到了两个棘手问题:
- 用
requests请求页面后,返回的静态HTML里完全找不到目标数据——查看请求日志发现,页面没有用常规XHR接口加载数据,而是通过**Server-Sent Events(SSE/EventStream)**实时推送内容; - 想通过
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接口推送的,我们可以直接请求这个接口并解析推送的内容:
- 抓包获取SSE接口信息:打开浏览器开发者工具(F12)→ 切换到Network标签 → 筛选Type为
event-stream的请求,复制它的URL和请求头(比如Referer、Cookie等,从抓包结果里直接复制即可); - 安装SSE处理库:
pip install sseclient-py
- 编写代码接收并解析数据:
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推送:
- 安装依赖:
pip install playwright # 安装Chrome浏览器驱动 playwright install chrome
- 编写代码获取数据:
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
相关产品推荐
相关产品推荐

