542 lines
24 KiB
Plaintext
542 lines
24 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "a738ca16021a9e3b",
|
||
"metadata": {},
|
||
"source": [
|
||
"# 车辆信息导出"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"id": "initial_id",
|
||
"metadata": {
|
||
"collapsed": true,
|
||
"ExecuteTime": {
|
||
"end_time": "2026-03-24T03:12:19.747274800Z",
|
||
"start_time": "2026-03-24T02:42:20.660416400Z"
|
||
}
|
||
},
|
||
"source": [
|
||
"import time\n",
|
||
"import pandas as pd\n",
|
||
"import requests\n",
|
||
"from tqdm import tqdm\n",
|
||
"\n",
|
||
"# Cookie 和 Headers 配置\n",
|
||
"cookies = {\n",
|
||
" 'acw_tc': '76b20f7917743149845914058ebc47559507cd60c8642e0d54dbe45b6da222',\n",
|
||
" 'Hm_lvt_684c22b31d0037eca5a691cde16370ad': '1773130169,1774314982',\n",
|
||
" 'Hm_lpvt_684c22b31d0037eca5a691cde16370ad': '1774314982',\n",
|
||
" 'HMACCOUNT': 'A6A0585E8C70051D',\n",
|
||
" 'e_token': 'f44423067c184689a19eb9dc564bf33e',\n",
|
||
" 'weixin_token': 'Y',\n",
|
||
" 'e_c': 'NTQ0MzQ1MDE0MTA3ODA1Mg==',\n",
|
||
" 'e_i_o_c_n': 'JTIyJUU1JTlCJTlCJUU0JUJDJTlBJUU1JUI4JTgyJUU4JThEJUEzJUU5JUFBJThGJUU2JUIxJUJEJUU4JUJEJUE2JUU3JUJCJUI0JUU0JUJGJUFFJUU0JUI4JUFEJUU1JUJGJTgzJTVCKzIwMDM5MDYrJTVEJTIy',\n",
|
||
" 'e_i_p_c_n': 'JTIyJUU5JUE5JUIwJUU1JThBJUEwJUU2JUIxJUJEJUU4JUJEJUE2JUU2JTlDJThEJUU1JThBJUExJUU0JUI4JUFEJUU1JUJGJTgzJUU1JTlCJTlCJUU0JUJDJTlBJUU1JUI4JTgyJUU2JUEzJTk1JUU2JUE2JTg4JUU1JTlCJUFEJUU1JUJBJTk3JUU1JUJBJTk3JUU0JUI4JUJCJTVCKzIwMjk5MDkrJTVEJTIy',\n",
|
||
"}\n",
|
||
"\n",
|
||
"headers = {\n",
|
||
" 'Accept': 'application/json, text/plain, */*',\n",
|
||
" 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',\n",
|
||
" 'Connection': 'keep-alive',\n",
|
||
" 'Content-Type': 'application/json;charset=UTF-8',\n",
|
||
" 'Irisclient': 'PC-web#tedspc',\n",
|
||
" 'Origin': 'https://teds.tyreplus.com.cn',\n",
|
||
" 'Referer': 'https://teds.tyreplus.com.cn/tedspc/index.html',\n",
|
||
" 'Sec-Fetch-Dest': 'empty',\n",
|
||
" 'Sec-Fetch-Mode': 'cors',\n",
|
||
" 'Sec-Fetch-Site': 'same-origin',\n",
|
||
" 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36 Edg/146.0.0.0',\n",
|
||
" 'sec-ch-ua': '\"Chromium\";v=\"146\", \"Not-A.Brand\";v=\"24\", \"Microsoft Edge\";v=\"146\"',\n",
|
||
" 'sec-ch-ua-mobile': '?0',\n",
|
||
" 'sec-ch-ua-platform': '\"Windows\"',\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"all_data = []\n",
|
||
"for i in tqdm(range(1, 2019)):\n",
|
||
" json_data = {\n",
|
||
" 'pageStart': i,\n",
|
||
" 'pageNums': 10,\n",
|
||
" 'pageNum': 1,\n",
|
||
" 'pageSize': 10,\n",
|
||
" }\n",
|
||
"\n",
|
||
" response = requests.post(\n",
|
||
" 'https://teds.tyreplus.com.cn/api/v1/custom/vehicle/queryVehicleInfosByStore',\n",
|
||
" cookies=cookies,\n",
|
||
" headers=headers,\n",
|
||
" json=json_data,\n",
|
||
" )\n",
|
||
" data_list = response.json()['obj']['list']\n",
|
||
" all_data += data_list\n",
|
||
"\n",
|
||
"df = pd.DataFrame(all_data)\n",
|
||
"df.to_excel(r\"D:\\Idea Project\\F6+宜搭+其它(1)\\张阳脚本\\文件输出\\13719825616驰加车辆信息1.xlsx\", index=False)\n"
|
||
],
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"100%|██████████| 2018/2018 [29:27<00:00, 1.14it/s]\n"
|
||
]
|
||
}
|
||
],
|
||
"execution_count": 2
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "e166fa181fddc651",
|
||
"metadata": {},
|
||
"source": [
|
||
"# 历史维修记录列表(结算单)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"id": "51f8f4b21505280a",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-03-24T07:37:35.090160900Z",
|
||
"start_time": "2026-03-24T05:31:09.783019900Z"
|
||
}
|
||
},
|
||
"source": [
|
||
"import time\n",
|
||
"import requests\n",
|
||
"from tqdm import tqdm\n",
|
||
"import pandas as pd\n",
|
||
"\n",
|
||
"# ================= 配置区域 =================\n",
|
||
"# Cookie 和 Headers 配置\n",
|
||
"cookies = {\n",
|
||
" 'acw_tc': '76b20f7917743149845914058ebc47559507cd60c8642e0d54dbe45b6da222',\n",
|
||
" 'Hm_lvt_684c22b31d0037eca5a691cde16370ad': '1773130169,1774314982',\n",
|
||
" 'Hm_lpvt_684c22b31d0037eca5a691cde16370ad': '1774314982',\n",
|
||
" 'HMACCOUNT': 'A6A0585E8C70051D',\n",
|
||
" 'e_token': 'f44423067c184689a19eb9dc564bf33e',\n",
|
||
" 'weixin_token': 'Y',\n",
|
||
" 'e_c': 'NTQ0MzQ1MDE0MTA3ODA1Mg==',\n",
|
||
" 'e_i_o_c_n': 'JTIyJUU1JTlCJTlCJUU0JUJDJTlBJUU1JUI4JTgyJUU4JThEJUEzJUU5JUFBJThGJUU2JUIxJUJEJUU4JUJEJUE2JUU3JUJCJUI0JUU0JUJGJUFFJUU0JUI4JUFEJUU1JUJGJTgzJTVCKzIwMDM5MDYrJTVEJTIy',\n",
|
||
" 'e_i_p_c_n': 'JTIyJUU5JUE5JUIwJUU1JThBJUEwJUU2JUIxJUJEJUU4JUJEJUE2JUU2JTlDJThEJUU1JThBJUExJUU0JUI4JUFEJUU1JUJGJTgzJUU1JTlCJTlCJUU0JUJDJTlBJUU1JUI4JTgyJUU2JUEzJTk1JUU2JUE2JTg4JUU1JTlCJUFEJUU1JUJBJTk3JUU1JUJBJTk3JUU0JUI4JUJCJTVCKzIwMjk5MDkrJTVEJTIy',\n",
|
||
"}\n",
|
||
"\n",
|
||
"headers = {\n",
|
||
" 'Accept': 'application/json, text/plain, */*',\n",
|
||
" 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',\n",
|
||
" 'Connection': 'keep-alive',\n",
|
||
" 'Content-Type': 'application/json;charset=UTF-8',\n",
|
||
" 'Irisclient': 'PC-web#tedspc',\n",
|
||
" 'Origin': 'https://teds.tyreplus.com.cn',\n",
|
||
" 'Referer': 'https://teds.tyreplus.com.cn/tedspc/index.html',\n",
|
||
" 'Sec-Fetch-Dest': 'empty',\n",
|
||
" 'Sec-Fetch-Mode': 'cors',\n",
|
||
" 'Sec-Fetch-Site': 'same-origin',\n",
|
||
" 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36 Edg/146.0.0.0',\n",
|
||
" 'sec-ch-ua': '\"Chromium\";v=\"146\", \"Not-A.Brand\";v=\"24\", \"Microsoft Edge\";v=\"146\"',\n",
|
||
" 'sec-ch-ua-mobile': '?0',\n",
|
||
" 'sec-ch-ua-platform': '\"Windows\"',\n",
|
||
" # 'Cookie': 'acw_tc=76b20f7917743149845914058ebc47559507cd60c8642e0d54dbe45b6da222; Hm_lvt_684c22b31d0037eca5a691cde16370ad=1773130169,1774314982; Hm_lpvt_684c22b31d0037eca5a691cde16370ad=1774314982; HMACCOUNT=A6A0585E8C70051D; e_token=f44423067c184689a19eb9dc564bf33e; weixin_token=Y; e_c=NTQ0MzQ1MDE0MTA3ODA1Mg==; e_i_o_c_n=JTIyJUU1JTlCJTlCJUU0JUJDJTlBJUU1JUI4JTgyJUU4JThEJUEzJUU5JUFBJThGJUU2JUIxJUJEJUU4JUJEJUE2JUU3JUJCJUI0JUU0JUJGJUFFJUU0JUI4JUFEJUU1JUJGJTgzJTVCKzIwMDM5MDYrJTVEJTIy; e_i_p_c_n=JTIyJUU5JUE5JUIwJUU1JThBJUEwJUU2JUIxJUJEJUU4JUJEJUE2JUU2JTlDJThEJUU1JThBJUExJUU0JUI4JUFEJUU1JUJGJTgzJUU1JTlCJTlCJUU0JUJDJTlBJUU1JUI4JTgyJUU2JUEzJTk1JUU2JUE2JTg4JUU1JTlCJUFEJUU1JUJBJTk3JUU1JUJBJTk3JUU0JUI4JUJCJTVCKzIwMjk5MDkrJTVEJTIy',\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"# 业务参数配置\n",
|
||
"TARGET_URL = 'https://teds.tyreplus.com.cn/api/aftersales/payment/queryPaymentSettlementListByCondition'\n",
|
||
"STORE_CODES = [\"330522\", \"343280\"] # 门店列表\n",
|
||
"PAGE_SIZE = 10\n",
|
||
"OUTPUT_PATH = r\"D:\\Idea Project\\F6+宜搭+其它(1)\\张阳脚本\\文件输出\\13822673880结算单.xlsx\"\n",
|
||
"MAX_RETRIES = 3\n",
|
||
"\n",
|
||
"# ================= 功能函数 =================\n",
|
||
"\n",
|
||
"def fetch_page_with_retry(page_num, store_list, max_retries=MAX_RETRIES):\n",
|
||
" \"\"\"\n",
|
||
" 带重试机制的单页数据获取函数\n",
|
||
" :param page_num: 当前页码 (从1开始)\n",
|
||
" :param store_list: 门店代码列表\n",
|
||
" :param max_retries: 最大重试次数\n",
|
||
" :return: 成功的响应JSON对象,若最终失败则返回None\n",
|
||
" \"\"\"\n",
|
||
" json_data = {\n",
|
||
" 'storeCodeList': store_list,\n",
|
||
" 'pageStart': page_num,\n",
|
||
" 'pageNums': 10,\n",
|
||
" 'pageNum': page_num,\n",
|
||
" 'pageSize': PAGE_SIZE,\n",
|
||
" }\n",
|
||
"\n",
|
||
" for attempt in range(max_retries):\n",
|
||
" try:\n",
|
||
" response = requests.post(\n",
|
||
" TARGET_URL,\n",
|
||
" cookies=cookies,\n",
|
||
" headers=headers,\n",
|
||
" json=json_data,\n",
|
||
" timeout=15 # 增加超时时间以防网络波动\n",
|
||
" )\n",
|
||
" response.raise_for_status() # 检查HTTP状态码 (如404, 500)\n",
|
||
" result = response.json()\n",
|
||
"\n",
|
||
" # 检查业务逻辑是否成功 (通常code=200或success=true表示成功)\n",
|
||
" # 根据实际接口返回调整判断条件,这里假设 obj 存在即视为结构正常\n",
|
||
" if 'obj' in result and 'list' in result['obj']:\n",
|
||
" return result\n",
|
||
" else:\n",
|
||
" # 如果返回了错误信息\n",
|
||
" error_msg = result.get('msg', result.get('message', 'Unknown business error'))\n",
|
||
" print(f\"第{page_num}页业务返回异常: {error_msg}\")\n",
|
||
" # 如果是明确的业务错误(如权限不足),通常重试无效,可直接跳出\n",
|
||
" if \"权限\" in str(error_msg) or \"token\" in str(error_msg).lower():\n",
|
||
" return None\n",
|
||
"\n",
|
||
" except Exception as e:\n",
|
||
" print(f\"第{page_num}页请求失败 (尝试 {attempt+1}/{max_retries}): {str(e)}\")\n",
|
||
" if attempt < max_retries - 1:\n",
|
||
" wait_time = 2 ** attempt # 指数退避: 1s, 2s, 4s...\n",
|
||
" time.sleep(wait_time)\n",
|
||
" else:\n",
|
||
" print(f\"第{page_num}页最终获取失败,将跳过该页。\")\n",
|
||
" return None\n",
|
||
"\n",
|
||
" return None\n",
|
||
"\n",
|
||
"# ================= 主执行逻辑 =================\n",
|
||
"\n",
|
||
"all_data = []\n",
|
||
"current_page = 1\n",
|
||
"total_records = 0\n",
|
||
"total_pages = 0\n",
|
||
"\n",
|
||
"print(\"正在获取第 1 页数据以计算总记录数...\")\n",
|
||
"\n",
|
||
"# 1. 获取第一页,确定总数\n",
|
||
"first_response = fetch_page_with_retry(current_page, STORE_CODES)\n",
|
||
"\n",
|
||
"if first_response:\n",
|
||
" data_list = first_response['obj']['list']\n",
|
||
" all_data += data_list\n",
|
||
"\n",
|
||
" # 获取总数\n",
|
||
" total_records = first_response['obj'].get('total', 0)\n",
|
||
" print(f\"✅ 获取成功。总记录数: {total_records}\")\n",
|
||
"\n",
|
||
" if total_records > 0:\n",
|
||
" # 计算总页数 (向上取整)\n",
|
||
" total_pages = (total_records + PAGE_SIZE - 1) // PAGE_SIZE\n",
|
||
" print(f\"📄 预计总页数: {total_pages} (每页 {PAGE_SIZE} 条)\")\n",
|
||
"\n",
|
||
" # 2. 循环获取剩余页面\n",
|
||
" if total_pages > 1:\n",
|
||
" for page_idx in tqdm(range(2, total_pages + 1), desc=\"正在爬取结算单\", initial=1, total=total_pages):\n",
|
||
" response = fetch_page_with_retry(page_idx, STORE_CODES)\n",
|
||
"\n",
|
||
" if response:\n",
|
||
" page_data = response['obj']['list']\n",
|
||
" all_data += page_data\n",
|
||
" else:\n",
|
||
" print(f\"⚠️ 警告:第 {page_idx} 页数据获取失败,已跳过。\")\n",
|
||
"\n",
|
||
" # 礼貌性延时,防止触发风控\n",
|
||
" time.sleep(0.5)\n",
|
||
" else:\n",
|
||
" print(\"ℹ️ 所有数据已在第一页获取完毕,无需继续爬取。\")\n",
|
||
" else:\n",
|
||
" print(\"ℹ️ 未找到任何符合条件的数据。\")\n",
|
||
"else:\n",
|
||
" print(\"❌ 无法获取第一页数据,程序终止。请检查Cookie是否过期或网络是否正常。\")\n",
|
||
"\n",
|
||
"# ================= 数据保存 =================\n",
|
||
"\n",
|
||
"if all_data:\n",
|
||
" df = pd.DataFrame(all_data)\n",
|
||
" try:\n",
|
||
" df.to_excel(OUTPUT_PATH, index=False)\n",
|
||
" print(f\"\\n🎉 数据已成功保存至: {OUTPUT_PATH}\")\n",
|
||
" print(f\"📊 共保存 {len(df)} 条记录 (期望: {total_records})\")\n",
|
||
"\n",
|
||
" if len(df) < total_records:\n",
|
||
" print(f\"⚠️ 注意:实际保存数量 ({len(df)}) 少于期望数量 ({total_records}),部分页面可能获取失败。\")\n",
|
||
"\n",
|
||
" except Exception as e:\n",
|
||
" print(f\"❌ 保存文件时出错: {e}\")\n",
|
||
" print(\"请检查文件路径是否正确,且文件未被其他程序占用。\")\n",
|
||
"else:\n",
|
||
" print(\"\\n💤 没有数据可保存。\")"
|
||
],
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"正在获取第 1 页数据以计算总记录数...\n",
|
||
"✅ 获取成功。总记录数: 43728\n",
|
||
"📄 预计总页数: 4373 (每页 10 条)\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"正在爬取结算单: 33%|███▎ | 1441/4373 [38:12<1:29:11, 1.83s/it]"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"第1442页请求失败 (尝试 1/3): ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None))\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"正在爬取结算单: 51%|█████ | 2241/4373 [1:02:36<1:01:42, 1.74s/it]"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"第2242页请求失败 (尝试 1/3): ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None))\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"正在爬取结算单: 100%|██████████| 4373/4373 [2:05:27<00:00, 1.72s/it] \n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\n",
|
||
"🎉 数据已成功保存至: D:\\Idea Project\\F6+宜搭+其它(1)\\张阳脚本\\文件输出\\13822673880结算单.xlsx\n",
|
||
"📊 共保存 43730 条记录 (期望: 43728)\n"
|
||
]
|
||
}
|
||
],
|
||
"execution_count": 3
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "44cdf0d8f5f01c7d",
|
||
"metadata": {},
|
||
"source": [
|
||
"历史维修记录明细(结算单明细)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"id": "b7e0d7a4da6c9b03",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-03-25T10:15:04.125375900Z",
|
||
"start_time": "2026-03-24T12:31:05.631170600Z"
|
||
}
|
||
},
|
||
"source": [
|
||
"import requests\n",
|
||
"from tqdm.notebook import tqdm\n",
|
||
"import pandas as pd\n",
|
||
"import time\n",
|
||
"\n",
|
||
"cookies = {\n",
|
||
" 'acw_tc': '76b20f7917743149845914058ebc47559507cd60c8642e0d54dbe45b6da222',\n",
|
||
" 'Hm_lvt_684c22b31d0037eca5a691cde16370ad': '1773130169,1774314982',\n",
|
||
" 'Hm_lpvt_684c22b31d0037eca5a691cde16370ad': '1774314982',\n",
|
||
" 'HMACCOUNT': 'A6A0585E8C70051D',\n",
|
||
" 'e_token': 'f44423067c184689a19eb9dc564bf33e',\n",
|
||
" 'weixin_token': 'Y',\n",
|
||
" 'e_c': 'NTQ0MzQ1MDE0MTA3ODA1Mg==',\n",
|
||
" 'e_i_o_c_n': 'JTIyJUU1JTlCJTlCJUU0JUJDJTlBJUU1JUI4JTgyJUU4JThEJUEzJUU5JUFBJThGJUU2JUIxJUJEJUU4JUJEJUE2JUU3JUJCJUI0JUU0JUJGJUFFJUU0JUI4JUFEJUU1JUJGJTgzJTVCKzIwMDM5MDYrJTVEJTIy',\n",
|
||
" 'e_i_p_c_n': 'JTIyJUU5JUE5JUIwJUU1JThBJUEwJUU2JUIxJUJEJUU4JUJEJUE2JUU2JTlDJThEJUU1JThBJUExJUU0JUI4JUFEJUU1JUJGJTgzJUU1JTlCJTlCJUU0JUJDJTlBJUU1JUI4JTgyJUU2JUEzJTk1JUU2JUE2JTg4JUU1JTlCJUFEJUU1JUJBJTk3JUU1JUJBJTk3JUU0JUI4JUJCJTVCKzIwMjk5MDkrJTVEJTIy',\n",
|
||
"}\n",
|
||
"\n",
|
||
"headers = {\n",
|
||
" 'Accept': 'application/json, text/plain, */*',\n",
|
||
" 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',\n",
|
||
" 'Connection': 'keep-alive',\n",
|
||
" 'Content-Type': 'application/json;charset=UTF-8',\n",
|
||
" 'Irisclient': 'PC-web#tedspc',\n",
|
||
" 'Origin': 'https://teds.tyreplus.com.cn',\n",
|
||
" 'Referer': 'https://teds.tyreplus.com.cn/tedspc/index.html',\n",
|
||
" 'Sec-Fetch-Dest': 'empty',\n",
|
||
" 'Sec-Fetch-Mode': 'cors',\n",
|
||
" 'Sec-Fetch-Site': 'same-origin',\n",
|
||
" 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36 Edg/146.0.0.0',\n",
|
||
" 'sec-ch-ua': '\"Chromium\";v=\"146\", \"Not-A.Brand\";v=\"24\", \"Microsoft Edge\";v=\"146\"',\n",
|
||
" 'sec-ch-ua-mobile': '?0',\n",
|
||
" 'sec-ch-ua-platform': '\"Windows\"',\n",
|
||
" # 'Cookie': 'acw_tc=76b20f7917743149845914058ebc47559507cd60c8642e0d54dbe45b6da222; Hm_lvt_684c22b31d0037eca5a691cde16370ad=1773130169,1774314982; Hm_lpvt_684c22b31d0037eca5a691cde16370ad=1774314982; HMACCOUNT=A6A0585E8C70051D; e_token=f44423067c184689a19eb9dc564bf33e; weixin_token=Y; e_c=NTQ0MzQ1MDE0MTA3ODA1Mg==; e_i_o_c_n=JTIyJUU1JTlCJTlCJUU0JUJDJTlBJUU1JUI4JTgyJUU4JThEJUEzJUU5JUFBJThGJUU2JUIxJUJEJUU4JUJEJUE2JUU3JUJCJUI0JUU0JUJGJUFFJUU0JUI4JUFEJUU1JUJGJTgzJTVCKzIwMDM5MDYrJTVEJTIy; e_i_p_c_n=JTIyJUU5JUE5JUIwJUU1JThBJUEwJUU2JUIxJUJEJUU4JUJEJUE2JUU2JTlDJThEJUU1JThBJUExJUU0JUI4JUFEJUU1JUJGJTgzJUU1JTlCJTlCJUU0JUJDJTlBJUU1JUI4JTgyJUU2JUEzJTk1JUU2JUE2JTg4JUU1JTlCJUFEJUU1JUJBJTk3JUU1JUJBJTk3JUU0JUI4JUJCJTVCKzIwMjk5MDkrJTVEJTIy',\n",
|
||
"}\n",
|
||
"\n",
|
||
"df = pd.read_excel(fr\"D:\\Idea Project\\F6+宜搭+其它(1)\\张阳脚本\\文件输出\\13822673880结算单.xlsx\", sheet_name='Sheet1')\n",
|
||
"\n",
|
||
"all_data_list = []\n",
|
||
"all_service_data = []\n",
|
||
"all_order_data = []\n",
|
||
"all_payment_data = []\n",
|
||
"\n",
|
||
"for index, row in tqdm(df.iterrows(), total=len(df)):\n",
|
||
" id = row[\"paymentNo\"]\n",
|
||
" json_data = {\n",
|
||
" 'paymentNo': id,\n",
|
||
" }\n",
|
||
"\n",
|
||
" retry_count = 0\n",
|
||
" success = False\n",
|
||
"\n",
|
||
" while retry_count < 5 and not success:\n",
|
||
" try:\n",
|
||
" response = requests.post(\n",
|
||
" 'https://teds.tyreplus.com.cn/api/v2/aftersales/payment/queryPaymentSettlementDetail',\n",
|
||
" cookies=cookies,\n",
|
||
" headers=headers,\n",
|
||
" json=json_data,\n",
|
||
" timeout=10 # 建议加上超时防止卡死\n",
|
||
" )\n",
|
||
"\n",
|
||
" # 检查响应状态码和返回内容是否有效\n",
|
||
" if response.status_code == 200:\n",
|
||
" resp_json = response.json()\n",
|
||
" if resp_json.get('code') == 'success' and 'obj' in resp_json:\n",
|
||
" all_data = resp_json['obj']\n",
|
||
" service_list = all_data.get('orderServiceList', [])\n",
|
||
" order_list = all_data.get('orderSkuList', [])\n",
|
||
" paymentMethodList = all_data.get('paymentMethodList', [])\n",
|
||
"\n",
|
||
" # 添加 paymentNo 字段\n",
|
||
" all_data['paymentNo'] = id\n",
|
||
" all_data_list.append(all_data)\n",
|
||
"\n",
|
||
" for service in service_list:\n",
|
||
" service['paymentNo'] = id\n",
|
||
" all_service_data.append(service)\n",
|
||
"\n",
|
||
" for order in order_list:\n",
|
||
" order['paymentNo'] = id\n",
|
||
" all_order_data.append(order)\n",
|
||
"\n",
|
||
" for payment in paymentMethodList:\n",
|
||
" payment['paymentNo'] = id\n",
|
||
" all_payment_data.append(payment)\n",
|
||
"\n",
|
||
" success = True # 成功获取数据,跳出重试循环\n",
|
||
" else:\n",
|
||
" print(f\"请求返回非成功状态: {resp_json.get('message', '未知错误')} (paymentNo: {id})\")\n",
|
||
" else:\n",
|
||
" print(f\"HTTP 请求失败,状态码: {response.status_code} (paymentNo: {id})\")\n",
|
||
"\n",
|
||
" except Exception as e:\n",
|
||
" print(f\"请求异常: {e} (paymentNo: {id})\")\n",
|
||
"\n",
|
||
" if not success:\n",
|
||
" retry_count += 1\n",
|
||
" if retry_count < 5:\n",
|
||
" time.sleep(2) # 等待 2 秒后重试\n",
|
||
" else:\n",
|
||
" print(f\"已达到最大重试次数,跳过 paymentNo: {id}\")\n",
|
||
"\n",
|
||
" time.sleep(1) # 正常请求之间仍保留 1 秒间隔\n",
|
||
"\n",
|
||
"# 创建DataFrame\n",
|
||
"df = pd.DataFrame(all_data_list)\n",
|
||
"df1 = pd.DataFrame(all_service_data)\n",
|
||
"df2 = pd.DataFrame(all_order_data)\n",
|
||
"df3 = pd.DataFrame(all_payment_data)\n",
|
||
"\n",
|
||
"# 保存到Excel\n",
|
||
"df.to_excel(r\"D:\\Idea Project\\F6+宜搭+其它(1)\\张阳脚本\\文件输出\\1历史维修记录明细1.xlsx\", index=False)\n",
|
||
"df1.to_excel(r\"D:\\Idea Project\\F6+宜搭+其它(1)\\张阳脚本\\文件输出\\1历史维修记录明细-服务明细1.xlsx\",\n",
|
||
" index=False)\n",
|
||
"df2.to_excel(r\"D:\\Idea Project\\F6+宜搭+其它(1)\\张阳脚本\\文件输出\\1历史维修记录明细-产品明细1.xlsx\",\n",
|
||
" index=False)\n",
|
||
"df3.to_excel(r\"D:\\Idea Project\\F6+宜搭+其它(1)\\张阳脚本\\文件输出\\1历史维修记录明细-支付方式1.xlsx\",\n",
|
||
" index=False)\n"
|
||
],
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
" 0%| | 0/43730 [00:00<?, ?it/s]"
|
||
],
|
||
"application/vnd.jupyter.widget-view+json": {
|
||
"version_major": 2,
|
||
"version_minor": 0,
|
||
"model_id": "2475aaf2f08b4f3f9b6915bcbc30a4fc"
|
||
}
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data",
|
||
"jetTransient": {
|
||
"display_id": null
|
||
}
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"请求异常: ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None)) (paymentNo: SI2511031810785166)\n",
|
||
"请求异常: ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None)) (paymentNo: SI2510121646331912)\n",
|
||
"请求异常: ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None)) (paymentNo: SI2504251333197830)\n",
|
||
"请求异常: HTTPSConnectionPool(host='teds.tyreplus.com.cn', port=443): Read timed out. (read timeout=10) (paymentNo: SI2504251333197185)\n",
|
||
"HTTP 请求失败,状态码: 504 (paymentNo: SI2504251328192860)\n",
|
||
"请求异常: ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None)) (paymentNo: SI2504251327191463)\n",
|
||
"HTTP 请求失败,状态码: 502 (paymentNo: SI2504251326190989)\n",
|
||
"请求异常: ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None)) (paymentNo: SI2504251320185538)\n",
|
||
"请求异常: ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None)) (paymentNo: SI2504251319184980)\n",
|
||
"HTTP 请求失败,状态码: 502 (paymentNo: SI2504251316180693)\n",
|
||
"请求异常: HTTPSConnectionPool(host='teds.tyreplus.com.cn', port=443): Read timed out. (read timeout=10) (paymentNo: SI2504251302159764)\n"
|
||
]
|
||
}
|
||
],
|
||
"execution_count": 5
|
||
},
|
||
{
|
||
"metadata": {},
|
||
"cell_type": "code",
|
||
"outputs": [],
|
||
"execution_count": null,
|
||
"source": [
|
||
"\n",
|
||
"# 保存到Excel\n",
|
||
"df.to_excel(r\"D:\\Idea Project\\F6+宜搭+其它(1)\\张阳脚本\\文件输出\\1历史维修记录明细1.xlsx\", index=False)\n",
|
||
"df1.to_excel(r\"D:\\Idea Project\\F6+宜搭+其它(1)\\张阳脚本\\文件输出\\1历史维修记录明细-服务明细1.xlsx\",\n",
|
||
" index=False)\n",
|
||
"df2.to_excel(r\"D:\\Idea Project\\F6+宜搭+其它(1)\\张阳脚本\\文件输出\\1历史维修记录明细-产品明细1.xlsx\",\n",
|
||
" index=False)\n",
|
||
"df3.to_excel(r\"D:\\Idea Project\\F6+宜搭+其它(1)\\张阳脚本\\文件输出\\1历史维修记录明细-支付方式1.xlsx\",\n",
|
||
" index=False)"
|
||
],
|
||
"id": "bdef2047419fb838"
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "F6+宜搭+其它",
|
||
"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.13.11"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 5
|
||
}
|