Last active
April 11, 2025 03:14
-
-
Save daviddwlee84/9f0ef8d8c2ba18efd18ef748cc7170bf to your computer and use it in GitHub Desktop.
Easily get A-Share symbol market data as image from Easy Money
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!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) + | |
"×pan=" + 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> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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×pan=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×pan=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×pan=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\"×pan={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\"×pan={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