Skip to content

Instantly share code, notes, and snippets.

@daviddwlee84
Last active April 11, 2025 03:14
Show Gist options
  • Save daviddwlee84/9f0ef8d8c2ba18efd18ef748cc7170bf to your computer and use it in GitHub Desktop.
Save daviddwlee84/9f0ef8d8c2ba18efd18ef748cc7170bf to your computer and use it in GitHub Desktop.
Easily get A-Share symbol market data as image from Easy Money
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>EastMoney K-line Picture Viewer</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 2em;
}
label {
display: block;
margin: 0.5em 0 0.2em;
}
input {
margin-bottom: 1em;
padding: 0.3em;
width: 200px;
}
#urlDisplay {
font-family: monospace;
margin-top: 1em;
}
</style>
</head>
<body>
<h1>EastMoney K-line Picture Viewer</h1>
<form id="controlForm">
<label for="symbol">Symbol:</label>
<input type="text" id="symbol" name="symbol" value="600519" required>
<label for="unitWidth">unitWidth: (-9 ~ 0)</label>
<input type="number" id="unitWidth" name="unitWidth" value="-6">
<label for="formula">Formula (RSI, CCI):</label>
<input type="text" id="formula" name="formula" value="RSI">
<label for="imageType">imageType (KXL, r):</label>
<input type="text" id="imageType" name="imageType" value="KXL">
<label for="timespan">Timespan:</label>
<input type="number" id="timespan" name="timespan" value="1744335466">
<br>
<button type="button" onclick="updateImage()">Update Image</button>
</form>
<div id="urlDisplay"></div>
<br>
<img id="resultImage" alt="EastMoney Chart" style="max-width: 100%; border: 1px solid #ccc;">
<script>
/**
* Determine the exchange prefix for an A-Share symbol.
* Rules:
* - If symbol starts with '6', return "1." (Shanghai).
* - If symbol starts with '0' or '3', return "0." (Shenzhen).
* - Otherwise, returns null.
*/
function getExchangePrefix(symbol) {
if (symbol.startsWith("6") || symbol.startsWith("11")) {
return "1.";
} else if (symbol.startsWith("0") || symbol.startsWith("3") || symbol.startsWith("12")) {
return "0.";
} else {
return null;
}
}
/**
* Build the URL and update the <img> element.
*/
function updateImage() {
// Get input values
var symbol = document.getElementById('symbol').value.trim();
var unitWidth = document.getElementById('unitWidth').value;
var formula = document.getElementById('formula').value.trim();
var imageType = document.getElementById('imageType').value.trim();
var timespan = document.getElementById('timespan').value;
var prefix = getExchangePrefix(symbol);
if (!prefix) {
alert("Unsupported or invalid A-Share symbol: " + symbol);
return;
}
// Construct URL for the API (daily frequency endpoint)
var url = "https://webquoteklinepic.eastmoney.com/GetPic.aspx?" +
"nid=" + encodeURIComponent(prefix + symbol) +
"&type=" +
"&unitWidth=" + encodeURIComponent(unitWidth) +
"&ef=" +
"&formula=" + encodeURIComponent(formula) +
"&imageType=" + encodeURIComponent(imageType) +
"&timespan=" + encodeURIComponent(timespan);
// Display the URL for debugging purposes
document.getElementById('urlDisplay').innerText = "Fetching URL:\n" + url;
// Update the image source
document.getElementById('resultImage').src = url;
}
</script>
</body>
</html>
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "f6c4204f-f72f-4162-9d4a-0c6875355393",
"metadata": {},
"source": [
"[Vibe Coding with ChatGPT o3-mini-high](https://chatgpt.com/share/67f87ac3-3bcc-8012-990a-26cfc9b9d28d)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "e88ea00e-ee05-4b3d-bdec-188e8cc1622e",
"metadata": {},
"outputs": [],
"source": [
"def get_exchange(symbol: str, use_code: bool = False) -> str:\n",
" \"\"\"\n",
" Determine the prefix for an A-Share stock code based on its exchange listing.\n",
" \n",
" The rules implemented are:\n",
" - Symbols starting with '6' are assumed to be listed on the Shanghai (SH) exchange.\n",
" They receive the prefix \"1.\".\n",
" - Symbols starting with '0' or '3' are assumed to be listed on the Shenzhen (SZ) exchange.\n",
" They receive the prefix \"0.\".\n",
" - Otherwise, a ValueError is raised.\n",
" \n",
" Parameters:\n",
" symbol (str): The A-Share symbol (e.g., \"600519\", \"300750\").\n",
" \n",
" Returns:\n",
" str: The prefix string (\"1.\" for SH or \"0.\" for SZ).\n",
" \n",
" Raises:\n",
" ValueError: If the symbol does not start with '6', '0', or '3'.\n",
" \"\"\"\n",
" if symbol.startswith(\"6\") or symbol.startswith(\"11\"):\n",
" return \"1.\" if not use_code else \"SH\"\n",
" elif symbol.startswith(\"0\") or symbol.startswith(\"3\") or symbol.startswith(\"12\"):\n",
" return \"0.\" if not use_code else \"SZ\"\n",
" else:\n",
" raise ValueError(f\"Unsupported or invalid A-Share symbol: {symbol}\")\n",
"\n",
"def get_daily_pic_url(symbol: str) -> str:\n",
" \"\"\"\n",
" Returns the daily frequency picture URL for a given A-Share symbol.\n",
" \n",
" The URL is constructed by determining the proper exchange prefix via get_exchange_prefix(),\n",
" then filling in the 'nid' parameter in the URL.\n",
" \n",
" Parameters:\n",
" symbol (str): The A-Share symbol (e.g., \"600519\" for SH or \"300750\" for SZ).\n",
" \n",
" Returns:\n",
" str: The full URL for the daily frequency picture.\n",
" \"\"\"\n",
" prefix = get_exchange(symbol)\n",
" url = (\n",
" \"https://webquoteklinepic.eastmoney.com/GetPic.aspx?\"\n",
" f\"nid={prefix}{symbol}&type=&unitWidth=-6&ef=&formula=RSI&imageType=KXL\"\n",
" )\n",
" return url\n",
"\n",
"def get_realtime_pic_url(symbol: str) -> str:\n",
" \"\"\"\n",
" Returns the real-time picture URL for a given A-Share symbol.\n",
" \n",
" The URL is constructed by determining the proper exchange prefix via get_exchange_prefix(),\n",
" then filling in the 'nid' parameter in the URL.\n",
" \n",
" Parameters:\n",
" symbol (str): The A-Share symbol (e.g., \"600519\" for SH or \"300750\" for SZ).\n",
" \n",
" Returns:\n",
" str: The full URL for the real-time picture.\n",
" \"\"\"\n",
" prefix = get_exchange(symbol)\n",
" url = (\n",
" \"https://webquotepic.eastmoney.com/GetPic.aspx?\"\n",
" \"imageType=r&\"\n",
" f\"nid={prefix}{symbol}\"\n",
" )\n",
" return url"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "e028394e-ec59-4e88-9ac3-964a1e90d0b6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Daily Frequency URL for SH symbol: https://webquoteklinepic.eastmoney.com/GetPic.aspx?nid=1.600519&type=&unitWidth=-6&ef=&formula=RSI&imageType=KXL\n",
"Real-time URL for SH symbol: https://webquotepic.eastmoney.com/GetPic.aspx?imageType=r&nid=1.600519\n",
"Daily Frequency URL for SZ symbol: https://webquoteklinepic.eastmoney.com/GetPic.aspx?nid=0.300750&type=&unitWidth=-6&ef=&formula=RSI&imageType=KXL\n",
"Real-time URL for SZ symbol: https://webquotepic.eastmoney.com/GetPic.aspx?imageType=r&nid=0.300750\n"
]
}
],
"source": [
"# Example usage:\n",
"\n",
"# Example for a Shanghai (SH) A-Share symbol:\n",
"sh_symbol = \"600519\" # e.g. Kweichow Moutai\n",
"daily_sh_url = get_daily_pic_url(sh_symbol)\n",
"realtime_sh_url = get_realtime_pic_url(sh_symbol)\n",
"print(\"Daily Frequency URL for SH symbol:\", daily_sh_url)\n",
"print(\"Real-time URL for SH symbol:\", realtime_sh_url)\n",
"\n",
"# Example for a Shenzhen (SZ) A-Share symbol:\n",
"sz_symbol = \"300750\" # e.g. CATL\n",
"daily_sz_url = get_daily_pic_url(sz_symbol)\n",
"realtime_sz_url = get_realtime_pic_url(sz_symbol)\n",
"print(\"Daily Frequency URL for SZ symbol:\", daily_sz_url)\n",
"print(\"Real-time URL for SZ symbol:\", realtime_sz_url)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "864f524a-12ee-4f40-a2be-441fbabf42b1",
"metadata": {},
"outputs": [],
"source": [
"import requests\n",
"from IPython.display import display, Image as IPyImage\n",
"\n",
"def fetch_and_display_image(url: str):\n",
" \"\"\"\n",
" Fetches an image from the specified URL and displays it in a Jupyter Notebook.\n",
" \n",
" Parameters:\n",
" url (str): The URL of the image to be fetched.\n",
" \n",
" Usage:\n",
" fetch_and_display_image(\"https://example.com/myimage.png\")\n",
" \"\"\"\n",
" try:\n",
" # Send a GET request to fetch the image bytes\n",
" response = requests.get(url)\n",
" # Check if the request was successful\n",
" if response.status_code == 200:\n",
" # Display the image using IPython.display.Image and display function\n",
" display(IPyImage(data=response.content))\n",
" else:\n",
" print(f\"Error: Received status code {response.status_code} when trying to fetch the image.\")\n",
" except Exception as e:\n",
" print(\"An error occurred while fetching the image:\", e)\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "2ff8afcc-3a7a-483b-993c-b76862672b9d",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Example usage in Jupyter Notebook:\n",
"\n",
"# Replace with one of your actual URLs to test.\n",
"test_url = \"https://webquoteklinepic.eastmoney.com/GetPic.aspx?nid=1.110059&type=&unitWidth=-6&ef=&formula=RSI&imageType=KXL&timespan=1744335466\"\n",
"fetch_and_display_image(test_url)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "16569c46-db04-4e29-8a3f-04e1e588fe90",
"metadata": {},
"outputs": [],
"source": [
"def fetch_and_save_image(url: str, image_type: str, symbol: str):\n",
" \"\"\"\n",
" Fetch the image from the provided URL and save it as a file with the naming\n",
" pattern: type.symbol.exchange.png.\n",
" \n",
" Parameters:\n",
" url (str): The URL of the image to fetch.\n",
" image_type (str): A label indicating the image type (e.g., \"daily\" or \"realtime\").\n",
" symbol (str): The A-Share symbol.\n",
" \n",
" The saved filename will follow the format: type.symbol.exchange.png\n",
" where 'exchange' is determined from the symbol (e.g., \"SH\" or \"SZ\").\n",
" \"\"\"\n",
" try:\n",
" response = requests.get(url)\n",
" if response.status_code == 200:\n",
" # Determine the exchange code using the provided symbol.\n",
" exchange = get_exchange(symbol, use_code=True)\n",
" # Create the filename in the required format.\n",
" filename = f\"{image_type}.{symbol}.{exchange}.png\"\n",
" # Save the image content to a file.\n",
" with open(filename, \"wb\") as f:\n",
" f.write(response.content)\n",
" print(f\"Image successfully saved as {filename}\")\n",
" else:\n",
" print(f\"Failed to fetch image. Status code: {response.status_code}\")\n",
" except Exception as e:\n",
" print(\"An error occurred while fetching and saving the image:\", e)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "98b04c6f-20a1-49c7-98c8-c1e95624798b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Image successfully saved as daily.600519.SH.png\n",
"Image successfully saved as realtime.300750.SZ.png\n"
]
}
],
"source": [
"# Example usage in a Jupyter Notebook or script:\n",
"\n",
"# Example for a daily image of a Shanghai (SH) symbol (e.g., \"600519\")\n",
"daily_url = \"https://webquoteklinepic.eastmoney.com/GetPic.aspx?nid=1.600519&type=&unitWidth=-6&ef=&formula=RSI&imageType=KXL&timespan=1744335466\"\n",
"fetch_and_save_image(daily_url, \"daily\", \"600519\")\n",
"\n",
"# Example for a real-time image of a Shenzhen (SZ) symbol (e.g., \"300750\")\n",
"realtime_url = \"https://webquotepic.eastmoney.com/GetPic.aspx?imageType=r&token=44c9d251add88e27b65ed86506f6e5da&nid=0.300750&timespan=1744335817\"\n",
"fetch_and_save_image(realtime_url, \"realtime\", \"300750\")"
]
},
{
"cell_type": "markdown",
"id": "0738fe7e-d6cb-499f-8130-5fbb2486f053",
"metadata": {},
"source": [
"- [ipywidgets — Jupyter Widgets 8.1.5 documentation](https://ipywidgets.readthedocs.io/en/latest/reference/ipywidgets.html#ipywidgets.widgets.interaction.interactive_output)\n",
"- [Widget List — Jupyter Widgets 8.1.5 documentation](https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20List.html#selection-widgets)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "ac0d3234-06ed-4cde-a8d2-e507ca29e743",
"metadata": {},
"outputs": [],
"source": [
"# You need to restart Jupyter Notebook to take effect\n",
"!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ipywidgets -q"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "d5694d5a-591a-4ab7-a0af-b1277fe4c650",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "667b64453d9d4c409ef51b407260d9e0",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(Text(value='600519', description='Symbol:', placeholder='Enter A-Share symbol (e.g. 600519 or 3…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8b01260f81b2477fb4233cc5492bee29",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Output()"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import ipywidgets as widgets\n",
"from IPython.display import display, clear_output, Image\n",
"\n",
"def update_image(symbol, unitWidth, formula, imageType, timespan):\n",
" \"\"\"\n",
" Update the displayed image based on interactive widget values.\n",
" \n",
" Constructs the URL using the parameters and fetches the image.\n",
" \"\"\"\n",
" try:\n",
" prefix = get_exchange(symbol)\n",
" # Construct the URL based on the daily frequency endpoint.\n",
" url = (\n",
" \"https://webquoteklinepic.eastmoney.com/GetPic.aspx?\"\n",
" f\"nid={prefix}{symbol}\"\n",
" f\"&type=\" # Empty type parameter.\n",
" f\"&unitWidth={unitWidth}\"\n",
" f\"&ef=\" # Empty ef parameter.\n",
" f\"&formula={formula}\"\n",
" f\"&imageType={imageType}\"\n",
" f\"&timespan={timespan}\"\n",
" )\n",
" print(\"Fetching image from URL:\")\n",
" print(url)\n",
" # Retrieve image data from the constructed URL.\n",
" response = requests.get(url)\n",
" if response.status_code == 200:\n",
" clear_output(wait=True)\n",
" display(Image(response.content))\n",
" else:\n",
" print(f\"Error: Received status code {response.status_code}\")\n",
" except Exception as e:\n",
" print(\"Error:\", e)\n",
"\n",
"# Create widgets for input parameters.\n",
"symbol_widget = widgets.Text(\n",
" value=\"600519\",\n",
" description=\"Symbol:\",\n",
" placeholder=\"Enter A-Share symbol (e.g. 600519 or 300750)\",\n",
" disabled=False\n",
")\n",
"unitWidth_widget = widgets.IntSlider(\n",
" value=-6,\n",
" min=-20,\n",
" max=20,\n",
" step=1,\n",
" description=\"unitWidth:\"\n",
")\n",
"formula_widget = widgets.Text(\n",
" value=\"RSI\",\n",
" description=\"Formula:\",\n",
" placeholder=\"Enter formula\",\n",
" disabled=False\n",
")\n",
"imageType_widget = widgets.Text(\n",
" value=\"KXL\",\n",
" description=\"imageType:\",\n",
" placeholder=\"Enter imageType\",\n",
" disabled=False\n",
")\n",
"timespan_widget = widgets.IntText(\n",
" value=1744335466,\n",
" description=\"Timespan:\",\n",
" disabled=False\n",
")\n",
"\n",
"# Arrange widgets in a vertical layout.\n",
"ui = widgets.VBox([\n",
" symbol_widget, \n",
" unitWidth_widget, \n",
" formula_widget, \n",
" imageType_widget, \n",
" timespan_widget\n",
"])\n",
"\n",
"# Link widgets to update_image function; every change will fetch and update the image.\n",
"interactive_output = widgets.interactive_output(\n",
" update_image, \n",
" {\n",
" 'symbol': symbol_widget, \n",
" 'unitWidth': unitWidth_widget, \n",
" 'formula': formula_widget, \n",
" 'imageType': imageType_widget, \n",
" 'timespan': timespan_widget\n",
" }\n",
")\n",
"\n",
"# Display the widgets and the output.\n",
"display(ui, interactive_output)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "e0c72caf-31e3-48d6-9ae2-7982d0d7bf80",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a23a109c841f48a0b2ce97493ab7f20f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"interactive(children=(Text(value='127078', description='Symbol:'), IntSlider(value=-6, description='unitWidth'…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"@widgets.interact(\n",
" symbol=widgets.Text(value=\"127078\", description=\"Symbol:\"),\n",
" unitWidth=widgets.IntSlider(value=-6, min=-20, max=20, step=1, description=\"unitWidth\"),\n",
" formula=widgets.Text(value=\"RSI\", description=\"Formula:\"),\n",
" imageType=widgets.Dropdown(\n",
" options=['r', 'KXL'],\n",
" value='r',\n",
" description='imageType:',\n",
" disabled=False,\n",
" ),\n",
" timespan=widgets.IntText(value=1744335466, description=\"timespan\")\n",
")\n",
"def update_image(symbol, unitWidth, formula, imageType, timespan):\n",
" \"\"\"\n",
" Fetch and display an EastMoney K-line picture for the given symbol and parameters.\n",
" This function is called automatically whenever a widget value changes.\n",
" \"\"\"\n",
" try:\n",
" prefix = get_exchange(symbol)\n",
" # Construct the URL\n",
" url = (\n",
" \"https://webquoteklinepic.eastmoney.com/GetPic.aspx?\"\n",
" f\"nid={prefix}{symbol}\"\n",
" f\"&type=\" # Empty 'type' param\n",
" f\"&unitWidth={unitWidth}\"\n",
" f\"&ef=\" # Empty 'ef' param\n",
" f\"&formula={formula}\"\n",
" f\"&imageType={imageType}\"\n",
" f\"&timespan={timespan}\"\n",
" )\n",
" \n",
" # Display the URL in the notebook so we can see what is being fetched\n",
" clear_output(wait=True)\n",
" print(\"Fetching image from URL:\")\n",
" print(url)\n",
" \n",
" response = requests.get(url)\n",
" if response.status_code == 200:\n",
" display(Image(response.content))\n",
" else:\n",
" print(f\"Error: Received status code {response.status_code}\")\n",
" except Exception as e:\n",
" print(\"Error:\", e)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "f4f33568-80d8-4e44-8937-b93d5165ff17",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<iframe src=\"https://xueqiu.com/S/SH113569\" width=\"800\" height=\"600\"></iframe>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%html\n",
"<iframe src=\"https://xueqiu.com/S/SH113569\" width=\"800\" height=\"600\"></iframe>"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "6d8c7e8a-02f2-444f-afc0-a3617e731724",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <iframe\n",
" width=\"900\"\n",
" height=\"500\"\n",
" src=\"https://xueqiu.com/S/SH113569\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" \n",
" ></iframe>\n",
" "
],
"text/plain": [
"<IPython.lib.display.IFrame at 0x113436fc0>"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# https://stackoverflow.com/questions/52969973/how-to-embed-a-website-within-ipython-notebook\n",
"# falied to use xueqiu\n",
"from IPython.display import IFrame\n",
"IFrame(\"https://xueqiu.com/S/SH113569\", 900, 500)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment