From 78aa8e1b758e5679cbd8dd393966da0b4d788b1d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E5=AD=90=E6=81=BA?= <1621362626@qq.com>
Date: Fri, 22 Aug 2025 10:04:00 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=A4=A9=E4=B8=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
crawler/get_tianyi_1.ipynb | 298 ++++++++++++++++++++++++-------------
data.db.zip | Bin 204101 -> 401557 bytes
2 files changed, 192 insertions(+), 106 deletions(-)
diff --git a/crawler/get_tianyi_1.ipynb b/crawler/get_tianyi_1.ipynb
index c977068..2142b1f 100644
--- a/crawler/get_tianyi_1.ipynb
+++ b/crawler/get_tianyi_1.ipynb
@@ -6,8 +6,8 @@
"metadata": {
"collapsed": true,
"ExecuteTime": {
- "end_time": "2025-08-21T08:51:45.729834Z",
- "start_time": "2025-08-21T08:51:45.724789Z"
+ "end_time": "2025-08-22T00:51:15.383830Z",
+ "start_time": "2025-08-22T00:51:15.162928Z"
}
},
"source": [
@@ -21,13 +21,13 @@
"from selenium.webdriver.edge.options import Options"
],
"outputs": [],
- "execution_count": 10
+ "execution_count": 1
},
{
"metadata": {
"ExecuteTime": {
- "end_time": "2025-08-21T08:51:45.747072Z",
- "start_time": "2025-08-21T08:51:45.743237Z"
+ "end_time": "2025-08-22T00:51:16.137665Z",
+ "start_time": "2025-08-22T00:51:16.016527Z"
}
},
"cell_type": "code",
@@ -37,13 +37,13 @@
],
"id": "f184b255d5098302",
"outputs": [],
- "execution_count": 11
+ "execution_count": 2
},
{
"metadata": {
"ExecuteTime": {
- "end_time": "2025-08-21T08:51:45.773737Z",
- "start_time": "2025-08-21T08:51:45.769129Z"
+ "end_time": "2025-08-22T01:24:38.259284Z",
+ "start_time": "2025-08-22T01:24:38.253051Z"
}
},
"cell_type": "code",
@@ -53,13 +53,26 @@
],
"id": "4813fcf4dea28b8d",
"outputs": [],
- "execution_count": 12
+ "execution_count": 54
},
{
"metadata": {
"ExecuteTime": {
- "end_time": "2025-08-21T08:51:45.797561Z",
- "start_time": "2025-08-21T08:51:45.790647Z"
+ "end_time": "2025-08-22T01:24:21.532983Z",
+ "start_time": "2025-08-22T01:24:21.528098Z"
+ }
+ },
+ "cell_type": "code",
+ "source": "# conn.close()",
+ "id": "8ea63e4cb82fe0c",
+ "outputs": [],
+ "execution_count": 53
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-08-22T00:51:16.185320Z",
+ "start_time": "2025-08-22T00:51:16.176280Z"
}
},
"cell_type": "code",
@@ -83,13 +96,13 @@
],
"id": "e5632e44a52d5dc4",
"outputs": [],
- "execution_count": 13
+ "execution_count": 4
},
{
"metadata": {
"ExecuteTime": {
- "end_time": "2025-08-21T08:51:47.136948Z",
- "start_time": "2025-08-21T08:51:45.814223Z"
+ "end_time": "2025-08-22T00:51:18.395Z",
+ "start_time": "2025-08-22T00:51:16.198246Z"
}
},
"cell_type": "code",
@@ -101,19 +114,21 @@
],
"id": "28b1479c3decc6b1",
"outputs": [],
- "execution_count": 14
+ "execution_count": 5
},
{
"metadata": {
"ExecuteTime": {
- "end_time": "2025-08-21T08:51:53.084554Z",
- "start_time": "2025-08-21T08:51:47.152588Z"
+ "end_time": "2025-08-22T00:51:27.692312Z",
+ "start_time": "2025-08-22T00:51:18.413131Z"
}
},
"cell_type": "code",
"source": [
"driver.get(\"https://www.tianyiwangxiao.com/new/question-bank/learn-center-analyze/4d60c96ef05c452b812654e78af7701a/1957604601548296194?from=ht2\")\n",
"\n",
+ "\"https://www.tianyiwangxiao.com/new/question-bank/learn-center-analyze/94cfba022e2f4c7ebbeaa400576b3a9a/1958703246433423361?from=ht2\"\n",
+ "\n",
"# 等待页面渲染完成(例如等待 body 加载)\n",
"wait = WebDriverWait(driver, 720)\n",
"wait.until(EC.presence_of_element_located((By.TAG_NAME, \"body\")))\n",
@@ -122,148 +137,219 @@
],
"id": "779f88e1c3670c02",
"outputs": [],
- "execution_count": 15
+ "execution_count": 6
},
{
"metadata": {
"ExecuteTime": {
- "end_time": "2025-08-21T08:51:59.934014Z",
- "start_time": "2025-08-21T08:51:59.829632Z"
+ "end_time": "2025-08-22T00:51:27.716520Z",
+ "start_time": "2025-08-22T00:51:27.708786Z"
}
},
"cell_type": "code",
"source": [
- "#进入背题模式\n",
- "clickable_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, \".el-icon-right.next\")))\n",
- "clickable_element.click()\n",
- "\n"
+ "def next_page():\n",
+ " clickable_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, \".el-icon-right.next\")))\n",
+ " clickable_element.click()\n",
+ "\n",
+ "def get_html():\n",
+ " rendered_html = driver.page_source\n",
+ " return rendered_html"
],
"id": "721f5a8a872bfdce",
"outputs": [],
- "execution_count": 17
+ "execution_count": 7
},
{
"metadata": {
"ExecuteTime": {
- "end_time": "2025-08-21T08:52:07.855382Z",
- "start_time": "2025-08-21T08:52:07.834085Z"
+ "end_time": "2025-08-22T01:24:45.201186Z",
+ "start_time": "2025-08-22T01:24:45.184772Z"
}
},
"cell_type": "code",
"source": [
- "# 获取渲染后的 HTML\n",
- "rendered_html = driver.page_source"
- ],
- "id": "aa728e660ee9bbe5",
- "outputs": [],
- "execution_count": 18
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2025-08-21T09:03:09.025560Z",
- "start_time": "2025-08-21T09:03:08.973835Z"
- }
- },
- "cell_type": "code",
- "source": [
- "soup = BeautifulSoup(rendered_html, 'html.parser')\n",
+ "def html_parser(rendered_html):\n",
+ " soup = BeautifulSoup(rendered_html, 'html.parser')\n",
"\n",
- "title = soup.find_all('p', class_='title')\n",
+ " title = soup.find_all('p', class_='title')\n",
"\n",
- "out_options_box = soup.find_all('div', class_='options-box')\n",
+ " out_options_box = soup.find_all('div', class_='options-box')\n",
"\n",
- "analyze = soup.find_all('div', class_='analyze')"
+ " analyze = soup.find_all('div', class_='analyze')\n",
+ "\n",
+ "\n",
+ " result={\"title\":title[0].text.strip(), \"analyze\":analyze[0].text.strip()}\n",
+ "\n",
+ " if (len(out_options_box)!=1):\n",
+ " raise out_options_box\n",
+ " out_options = out_options_box[0].find_all(\"div\",class_=\"options-item\")\n",
+ "\n",
+ " if len(out_options)==4:\n",
+ " # 多选\n",
+ " for out_option in out_options:\n",
+ "\n",
+ " abcd = out_option.find(\"p\",\"label\")\n",
+ "\n",
+ " trueFalse = False\n",
+ " if \"success-active\" in abcd.get(\"class\"):\n",
+ " trueFalse = True\n",
+ "\n",
+ " abcd = abcd.text.strip().lower()\n",
+ "\n",
+ " answer = out_option.find(\"p\",\"text\").text.strip()\n",
+ "\n",
+ " result[abcd] = [answer, trueFalse]\n",
+ " else:\n",
+ " # 单选\n",
+ " def get_tf():\n",
+ " out_options_box = soup.find_all('div', class_='answer-box')\n",
+ " for i in out_options_box:\n",
+ " for ii in i.find_all('div', class_='CORRECT'):\n",
+ " if ii.text == \"正确\":\n",
+ " return True\n",
+ " elif ii.text == \"错误\":\n",
+ " return False\n",
+ " print(out_options_box)\n",
+ " return 0\n",
+ " result[\"tf\"] = get_tf()\n",
+ "\n",
+ " return result\n",
+ "\n"
],
"id": "5db0bbd564c0b53f",
"outputs": [],
- "execution_count": 33
+ "execution_count": 55
},
{
"metadata": {
"ExecuteTime": {
- "end_time": "2025-08-21T09:03:10.108380Z",
- "start_time": "2025-08-21T09:03:10.102301Z"
- }
- },
- "cell_type": "code",
- "source": "print(title)",
- "id": "9ae9f13772cfed6a",
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[
根据《期货经营机构投资者适当性管理实施指引(试行)》,经营机构评估,划分所销售产品或者所提供服务的风险等级时,涉及投资组合的产品或服务的,下列表述中正确的是( )。
]\n"
- ]
- }
- ],
- "execution_count": 34
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2025-08-21T09:11:05.144092Z",
- "start_time": "2025-08-21T09:11:05.136517Z"
+ "end_time": "2025-08-22T01:41:12.394198Z",
+ "start_time": "2025-08-22T01:41:12.386634Z"
}
},
"cell_type": "code",
"source": [
- "out_options_box = soup.find_all('div', class_='options-box')\n",
+ "def write2db(index, result):\n",
"\n",
+ " if \"tf\" not in result:\n",
"\n",
- "if (len(out_options_box)!=1):\n",
- " raise out_options_box\n",
- "out_options = out_options_box[0].find_all(\"div\",class_=\"options-item\")\n",
+ " conn.execute(\n",
+ " \"INSERT INTO questions (title, chapter, q_num, q_type, question, a, b, c, d, a_result, b_result, c_result, d_result, explanation) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\",\n",
+ " (\n",
+ " info[0],\n",
+ " info[1],\n",
+ " index,\n",
+ " \"多选题\",\n",
+ " result.get(\"title\"),\n",
+ " result.get(\"a\")[0],\n",
+ " result.get(\"b\")[0],\n",
+ " result.get(\"c\")[0],\n",
+ " result.get(\"d\")[0],\n",
+ " result.get(\"a\")[1],\n",
+ " result.get(\"b\")[1],\n",
+ " result.get(\"c\")[1],\n",
+ " result.get(\"d\")[1],\n",
+ " result.get(\"analyze\"),\n",
+ " )\n",
+ " )\n",
"\n",
- "for out_option in out_options:\n",
- " abcd = out_option.find(\"p\",\"label\")\n",
+ " else:\n",
+ " if result[\"tf\"] == 0:\n",
+ " return\n",
"\n",
- " trueFalse = False\n",
- " if \"success-active\" in abcd.get(\"class\"):\n",
- " trueFalse = True\n",
+ " conn.execute(\n",
+ " \"INSERT INTO questions (title, chapter, q_num, q_type, question, a, b, c, d, a_result, b_result, c_result, d_result, explanation) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\",\n",
+ " (\n",
+ " info[0],\n",
+ " info[1],\n",
+ " index,\n",
+ " \"判断题\",\n",
+ " result.get(\"title\"),\n",
+ " \"\",\n",
+ " \"\",\n",
+ " \"\",\n",
+ " \"\",\n",
+ " 1 if result[\"tf\"] else 0,\n",
+ " 0 if result[\"tf\"] else 1,\n",
+ " \"\",\n",
+ " \"\",\n",
+ " result.get(\"analyze\"),\n",
+ " )\n",
+ " )\n",
"\n",
- " abcd = abcd.text.strip()\n",
- "\n",
- " answer = out_option.find(\"p\",\"text\").text.strip()\n",
- "\n",
- " print(abcd, answer, trueFalse)"
+ " conn.commit()"
],
- "id": "11d9051ab089122d",
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "A 可以按照产品或服务对应的任何一个风险等级进行评估 False\n",
- "B 应当按照产品或服务最低风险等级进行评估 False\n",
- "C 应当按照产品或服务最高风险等级进行评估 False\n",
- "D 应当按照产品或服务整体风险等级进行评估 True\n"
- ]
- }
- ],
- "execution_count": 39
+ "id": "853f278c1123cae1",
+ "outputs": [],
+ "execution_count": 69
},
{
"metadata": {
"ExecuteTime": {
- "end_time": "2025-08-21T08:55:04.344999Z",
- "start_time": "2025-08-21T08:55:04.339191Z"
+ "end_time": "2025-08-22T01:46:12.973092Z",
+ "start_time": "2025-08-22T01:46:12.968961Z"
}
},
"cell_type": "code",
- "source": "print(analyze)",
- "id": "b7f43a482ce3c619",
+ "source": "info = [\"天一\",0,130]",
+ "id": "71ef002122c67647",
+ "outputs": [],
+ "execution_count": 81
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-08-22T01:50:44.170181Z",
+ "start_time": "2025-08-22T01:50:27.773842Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "for i in range(info[2]):\n",
+ " p = get_html()\n",
+ " result = html_parser(p)\n",
+ " write2db(i, result)\n",
+ " next_page()\n",
+ "\n"
+ ],
+ "id": "11d9051ab089122d",
+ "outputs": [],
+ "execution_count": 89
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-08-22T01:10:27.088143Z",
+ "start_time": "2025-08-22T01:10:27.076521Z"
+ }
+ },
+ "cell_type": "code",
+ "source": "",
+ "id": "ad769b774bac8989",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "[涉及投资组合的产品或服务,应当按照产品或服务整体风险等级进行评估。
]\n"
+ "正确
\n"
]
}
],
- "execution_count": 22
+ "execution_count": 40
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-08-22T01:06:54.877198Z",
+ "start_time": "2025-08-22T01:06:54.867849Z"
+ }
+ },
+ "cell_type": "code",
+ "source": "",
+ "id": "e1474fd283674850",
+ "outputs": [],
+ "execution_count": 35
},
{
"metadata": {},
@@ -271,7 +357,7 @@
"outputs": [],
"execution_count": null,
"source": "",
- "id": "ad769b774bac8989"
+ "id": "54ad268f864e1f6c"
}
],
"metadata": {
diff --git a/data.db.zip b/data.db.zip
index 31fe72d398ce13d8827b9cffffecd101607112e5..e2f5a29c3c81231373f63afd5ac0b970ae658d55 100644
GIT binary patch
literal 401557
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