Files
2026-01-30 11:28:35 +08:00

912 lines
88 KiB
Plaintext

{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "客户信息",
"id": "ca035649ea5d4d35"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-02-27T06:22:03.447660Z",
"start_time": "2025-02-27T06:09:20.220231Z"
}
},
"cell_type": "code",
"source": [
"import requests\n",
"from tqdm import tqdm\n",
"import pandas as pd\n",
"import time \n",
"\n",
"url = \"https://shop-gateway.tuhu.cn/md-shop-crm-api/shop-site/shop-user-list\"\n",
"\n",
"columns = ['userId', 'userName', 'carType', 'consumeNum', 'consumeMoney', 'lastTimeArriveTime', 'userTel',\n",
" 'lastRevisitDate', 'evaluate']\n",
"df = pd.DataFrame(columns=columns)\n",
"\n",
"for i in tqdm(range(1, 597)):\n",
" time.sleep(1)\n",
" params = {\n",
" 'apiVersion': '1.0.0',\n",
" 'channel': 'S-SITE',\n",
" 'deviceId': '05c6720e-ca19-4d7a-908c-4d60d20b7059',\n",
" 'pageIndex': i,\n",
" 'pageSize': 10\n",
" }\n",
" headers = {\n",
" 'accept': 'application/json, text/plain, */*',\n",
" 'authorization': \"Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImhHeXFFYi0tZUFFYTExa2lhZGc4ZXBpSGU0VSIsInR5cCI6IkpXVCIsIng1dCI6ImhHeXFFYi0tZUFFYTExa2lhZGc4ZXBpSGU0VSJ9.eyJuYmYiOjE3NDA2MzYzNjAsImV4cCI6MTc0MDYzOTk2MCwiaXNzIjoiaHR0cHM6Ly9hY2Nlc3MudHVodS5jbiIsImF1ZCI6WyJodHRwczovL2FjY2Vzcy50dWh1LmNuL3Jlc291cmNlcyIsInNpdGVfcyIsInNpdGVfc2FwaSIsInNpdGVfc2hvcGFwaSIsInNpdGVfd29ya3Nob3BhcGkiLCJ5ZXd1YXBpIl0sImNsaWVudF9pZCI6InNob3AudHVodS5jbiIsInN1YiI6IjA4ZGEyN2ZlNjQyYzQ5YmU4MGUxYzUwMjhlMzc3ZTkyIiwiYXV0aF90aW1lIjoxNzQwNjM2MzYwLCJpZHAiOiJUZWNobmljaWFuIiwibmFtZSI6IuWImOmTgeWGmyIsImlkIjo1NDIxNzgsInBob25lX251bWJlciI6IjEzMDE1MDYzOTk5IiwiYWNjb3VudF9sZXZlbCI6MTAsInNjb3BlIjpbIm9wZW5pZCIsIm5hbWUiLCJzaXRlX3MiLCJzaXRlX3NhcGkiLCJzaXRlX3Nob3BhcGkiLCJzaXRlX3dvcmtzaG9wYXBpIiwieWV3dWFwaSIsIm9mZmxpbmVfYWNjZXNzIl0sImFtciI6WyJUZWNobmljaWFuIl19.Vr3uFvmEO5PrGrRuDAvPz06kEiMTwm9bRpZJO0D4hLAMAO82iprgurKgny6aH4sFiQDxNahKTERhgF3nFsK17kSVWS6yCrm6iRSZjx3B08gOjVB0CpJ3BHTzqRDR7FUyZI4netggGxMgB3YONfeembX37rIBW7wiPckwIw0eQxhLGfYor9d_Zs5J4bJ-mDfFFb1Y2zYfQe70Or0hevbKisRQ6P6GtEMo5u7YwbkUtSeAsBY2P4LH6g8weM7OJs1I3HcN9OInoDv3UEsIdba3W1jy1OcU36UMXzB7140otB3kZm9bDwyAadNlic6wznpTj3xbXhgfMz6aGeXwSyv1sw\",\n",
" # 替换为你的access token\n",
" 'apiversion': '1.0',\n",
" 'authtype': 'oidc',\n",
" 'channel': 'S-SITE',\n",
" 'deviceid': '05c6720e-ca19-4d7a-908c-4d60d20b7059',\n",
" 'origin': 'https://shop.tuhu.cn',\n",
" 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0'\n",
" }\n",
"\n",
" response = requests.get(url, headers=headers, params=params)\n",
"\n",
" # print('Response Status Code:', response.status_code)\n",
" # print('Response Body:', response.json())\n",
"\n",
" data_list = response.json().get('data', []).get('list', [])\n",
"\n",
" for data in data_list:\n",
" # 创建一个新的DataFrame用于添加单条记录\n",
" df_temp = pd.DataFrame([{\n",
" 'userId': data['userId'],\n",
" 'userName': data['userName'],\n",
" 'carType': data['carType'],\n",
" 'consumeNum': data['consumeNum'],\n",
" 'consumeMoney': data['consumeMoney'],\n",
" 'lastTimeArriveTime': data['lastTimeArriveTime'],\n",
" 'userTel': data['userTel'],\n",
" 'lastRevisitDate': data['lastRevisitDate'],\n",
" 'evaluate': data['evaluate']\n",
" }])\n",
"\n",
" # 将新的DataFrame追加到主DataFrame中\n",
" df = pd.concat([df, df_temp], ignore_index=True)\n",
"\n",
"df.to_excel('D:\\Idea Project\\F6+宜搭+其它(1)\\new\\文件输出\\途虎客户数据.xlsx', index=False)\n",
"\n",
"\n",
"\n"
],
"id": "8c8b4568b7977b28",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"<>:57: SyntaxWarning: invalid escape sequence '\\I'\n",
"<>:57: SyntaxWarning: invalid escape sequence '\\I'\n",
"C:\\Users\\Administrator.DESKTOP-7IC2USJ\\AppData\\Local\\Temp\\ipykernel_6332\\3131821139.py:57: SyntaxWarning: invalid escape sequence '\\I'\n",
" df.to_excel('D:\\Idea Project\\F6+宜搭+其它(1)\\new\\文件输出\\途虎客户数据.xlsx', index=False)\n",
" 0%| | 0/596 [00:00<?, ?it/s]C:\\Users\\Administrator.DESKTOP-7IC2USJ\\AppData\\Local\\Temp\\ipykernel_6332\\3131821139.py:55: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n",
" df = pd.concat([df, df_temp], ignore_index=True)\n",
"100%|██████████| 596/596 [12:42<00:00, 1.28s/it]\n",
"C:\\Users\\Administrator.DESKTOP-7IC2USJ\\AppData\\Local\\Temp\\ipykernel_6332\\3131821139.py:57: SyntaxWarning: invalid escape sequence '\\I'\n",
" df.to_excel('D:\\Idea Project\\F6+宜搭+其它(1)\\new\\文件输出\\途虎客户数据.xlsx', index=False)\n"
]
},
{
"ename": "OSError",
"evalue": "Cannot save file into a non-existent directory: 'D:\\Idea Project\\F6+宜搭+其它(1)\new\\文件输出'",
"output_type": "error",
"traceback": [
"\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
"\u001B[1;31mOSError\u001B[0m Traceback (most recent call last)",
"Cell \u001B[1;32mIn[2], line 57\u001B[0m\n\u001B[0;32m 54\u001B[0m \u001B[38;5;66;03m# 将新的DataFrame追加到主DataFrame中\u001B[39;00m\n\u001B[0;32m 55\u001B[0m df \u001B[38;5;241m=\u001B[39m pd\u001B[38;5;241m.\u001B[39mconcat([df, df_temp], ignore_index\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m)\n\u001B[1;32m---> 57\u001B[0m df\u001B[38;5;241m.\u001B[39mto_excel(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mD:\u001B[39m\u001B[38;5;124m\\\u001B[39m\u001B[38;5;124mIdea Project\u001B[39m\u001B[38;5;124m\\\u001B[39m\u001B[38;5;124mF6+宜搭+其它(1)\u001B[39m\u001B[38;5;130;01m\\n\u001B[39;00m\u001B[38;5;124mew\u001B[39m\u001B[38;5;124m\\\u001B[39m\u001B[38;5;124m文件输出\u001B[39m\u001B[38;5;124m\\\u001B[39m\u001B[38;5;124m途虎客户数据.xlsx\u001B[39m\u001B[38;5;124m'\u001B[39m, index\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mFalse\u001B[39;00m)\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\pandas\\util\\_decorators.py:333\u001B[0m, in \u001B[0;36mdeprecate_nonkeyword_arguments.<locals>.decorate.<locals>.wrapper\u001B[1;34m(*args, **kwargs)\u001B[0m\n\u001B[0;32m 327\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mlen\u001B[39m(args) \u001B[38;5;241m>\u001B[39m num_allow_args:\n\u001B[0;32m 328\u001B[0m warnings\u001B[38;5;241m.\u001B[39mwarn(\n\u001B[0;32m 329\u001B[0m msg\u001B[38;5;241m.\u001B[39mformat(arguments\u001B[38;5;241m=\u001B[39m_format_argument_list(allow_args)),\n\u001B[0;32m 330\u001B[0m \u001B[38;5;167;01mFutureWarning\u001B[39;00m,\n\u001B[0;32m 331\u001B[0m stacklevel\u001B[38;5;241m=\u001B[39mfind_stack_level(),\n\u001B[0;32m 332\u001B[0m )\n\u001B[1;32m--> 333\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m func(\u001B[38;5;241m*\u001B[39margs, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\pandas\\core\\generic.py:2417\u001B[0m, in \u001B[0;36mNDFrame.to_excel\u001B[1;34m(self, excel_writer, sheet_name, na_rep, float_format, columns, header, index, index_label, startrow, startcol, engine, merge_cells, inf_rep, freeze_panes, storage_options, engine_kwargs)\u001B[0m\n\u001B[0;32m 2404\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01mpandas\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mio\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mformats\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mexcel\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m ExcelFormatter\n\u001B[0;32m 2406\u001B[0m formatter \u001B[38;5;241m=\u001B[39m ExcelFormatter(\n\u001B[0;32m 2407\u001B[0m df,\n\u001B[0;32m 2408\u001B[0m na_rep\u001B[38;5;241m=\u001B[39mna_rep,\n\u001B[1;32m (...)\u001B[0m\n\u001B[0;32m 2415\u001B[0m inf_rep\u001B[38;5;241m=\u001B[39minf_rep,\n\u001B[0;32m 2416\u001B[0m )\n\u001B[1;32m-> 2417\u001B[0m formatter\u001B[38;5;241m.\u001B[39mwrite(\n\u001B[0;32m 2418\u001B[0m excel_writer,\n\u001B[0;32m 2419\u001B[0m sheet_name\u001B[38;5;241m=\u001B[39msheet_name,\n\u001B[0;32m 2420\u001B[0m startrow\u001B[38;5;241m=\u001B[39mstartrow,\n\u001B[0;32m 2421\u001B[0m startcol\u001B[38;5;241m=\u001B[39mstartcol,\n\u001B[0;32m 2422\u001B[0m freeze_panes\u001B[38;5;241m=\u001B[39mfreeze_panes,\n\u001B[0;32m 2423\u001B[0m engine\u001B[38;5;241m=\u001B[39mengine,\n\u001B[0;32m 2424\u001B[0m storage_options\u001B[38;5;241m=\u001B[39mstorage_options,\n\u001B[0;32m 2425\u001B[0m engine_kwargs\u001B[38;5;241m=\u001B[39mengine_kwargs,\n\u001B[0;32m 2426\u001B[0m )\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\pandas\\io\\formats\\excel.py:943\u001B[0m, in \u001B[0;36mExcelFormatter.write\u001B[1;34m(self, writer, sheet_name, startrow, startcol, freeze_panes, engine, storage_options, engine_kwargs)\u001B[0m\n\u001B[0;32m 941\u001B[0m need_save \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mFalse\u001B[39;00m\n\u001B[0;32m 942\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[1;32m--> 943\u001B[0m writer \u001B[38;5;241m=\u001B[39m ExcelWriter(\n\u001B[0;32m 944\u001B[0m writer,\n\u001B[0;32m 945\u001B[0m engine\u001B[38;5;241m=\u001B[39mengine,\n\u001B[0;32m 946\u001B[0m storage_options\u001B[38;5;241m=\u001B[39mstorage_options,\n\u001B[0;32m 947\u001B[0m engine_kwargs\u001B[38;5;241m=\u001B[39mengine_kwargs,\n\u001B[0;32m 948\u001B[0m )\n\u001B[0;32m 949\u001B[0m need_save \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mTrue\u001B[39;00m\n\u001B[0;32m 951\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\pandas\\io\\excel\\_xlsxwriter.py:204\u001B[0m, in \u001B[0;36mXlsxWriter.__init__\u001B[1;34m(self, path, engine, date_format, datetime_format, mode, storage_options, if_sheet_exists, engine_kwargs, **kwargs)\u001B[0m\n\u001B[0;32m 201\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m mode \u001B[38;5;241m==\u001B[39m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124ma\u001B[39m\u001B[38;5;124m\"\u001B[39m:\n\u001B[0;32m 202\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mAppend mode is not supported with xlsxwriter!\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n\u001B[1;32m--> 204\u001B[0m \u001B[38;5;28msuper\u001B[39m()\u001B[38;5;241m.\u001B[39m\u001B[38;5;21m__init__\u001B[39m(\n\u001B[0;32m 205\u001B[0m path,\n\u001B[0;32m 206\u001B[0m engine\u001B[38;5;241m=\u001B[39mengine,\n\u001B[0;32m 207\u001B[0m date_format\u001B[38;5;241m=\u001B[39mdate_format,\n\u001B[0;32m 208\u001B[0m datetime_format\u001B[38;5;241m=\u001B[39mdatetime_format,\n\u001B[0;32m 209\u001B[0m mode\u001B[38;5;241m=\u001B[39mmode,\n\u001B[0;32m 210\u001B[0m storage_options\u001B[38;5;241m=\u001B[39mstorage_options,\n\u001B[0;32m 211\u001B[0m if_sheet_exists\u001B[38;5;241m=\u001B[39mif_sheet_exists,\n\u001B[0;32m 212\u001B[0m engine_kwargs\u001B[38;5;241m=\u001B[39mengine_kwargs,\n\u001B[0;32m 213\u001B[0m )\n\u001B[0;32m 215\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[0;32m 216\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_book \u001B[38;5;241m=\u001B[39m Workbook(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_handles\u001B[38;5;241m.\u001B[39mhandle, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mengine_kwargs)\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\pandas\\io\\excel\\_base.py:1246\u001B[0m, in \u001B[0;36mExcelWriter.__init__\u001B[1;34m(self, path, engine, date_format, datetime_format, mode, storage_options, if_sheet_exists, engine_kwargs)\u001B[0m\n\u001B[0;32m 1242\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_handles \u001B[38;5;241m=\u001B[39m IOHandles(\n\u001B[0;32m 1243\u001B[0m cast(IO[\u001B[38;5;28mbytes\u001B[39m], path), compression\u001B[38;5;241m=\u001B[39m{\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mcompression\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;28;01mNone\u001B[39;00m}\n\u001B[0;32m 1244\u001B[0m )\n\u001B[0;32m 1245\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(path, ExcelWriter):\n\u001B[1;32m-> 1246\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_handles \u001B[38;5;241m=\u001B[39m get_handle(\n\u001B[0;32m 1247\u001B[0m path, mode, storage_options\u001B[38;5;241m=\u001B[39mstorage_options, is_text\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mFalse\u001B[39;00m\n\u001B[0;32m 1248\u001B[0m )\n\u001B[0;32m 1249\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_cur_sheet \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[0;32m 1251\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m date_format \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\pandas\\io\\common.py:749\u001B[0m, in \u001B[0;36mget_handle\u001B[1;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001B[0m\n\u001B[0;32m 747\u001B[0m \u001B[38;5;66;03m# Only for write methods\u001B[39;00m\n\u001B[0;32m 748\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mr\u001B[39m\u001B[38;5;124m\"\u001B[39m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;129;01min\u001B[39;00m mode \u001B[38;5;129;01mand\u001B[39;00m is_path:\n\u001B[1;32m--> 749\u001B[0m check_parent_directory(\u001B[38;5;28mstr\u001B[39m(handle))\n\u001B[0;32m 751\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m compression:\n\u001B[0;32m 752\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m compression \u001B[38;5;241m!=\u001B[39m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mzstd\u001B[39m\u001B[38;5;124m\"\u001B[39m:\n\u001B[0;32m 753\u001B[0m \u001B[38;5;66;03m# compression libraries do not like an explicit text-mode\u001B[39;00m\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\pandas\\io\\common.py:616\u001B[0m, in \u001B[0;36mcheck_parent_directory\u001B[1;34m(path)\u001B[0m\n\u001B[0;32m 614\u001B[0m parent \u001B[38;5;241m=\u001B[39m Path(path)\u001B[38;5;241m.\u001B[39mparent\n\u001B[0;32m 615\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m parent\u001B[38;5;241m.\u001B[39mis_dir():\n\u001B[1;32m--> 616\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mOSError\u001B[39;00m(\u001B[38;5;124mrf\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mCannot save file into a non-existent directory: \u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;132;01m{\u001B[39;00mparent\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n",
"\u001B[1;31mOSError\u001B[0m: Cannot save file into a non-existent directory: 'D:\\Idea Project\\F6+宜搭+其它(1)\new\\文件输出'"
]
}
],
"execution_count": 2
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"## 客户信息-手机号\n",
"\n",
"### 废弃,可从历史维修记录导出"
],
"id": "ee3958136175def1"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-02-27T06:23:34.712867Z",
"start_time": "2025-02-27T06:22:33.744399Z"
}
},
"cell_type": "code",
"source": [
"import requests\n",
"import json\n",
"import pandas as pd\n",
"from tqdm import tqdm\n",
"import time\n",
"\n",
"df = pd.read_excel('途虎客户数据.xlsx')\n",
"all_data = []\n",
"\n",
"for userId in tqdm(df.userId):\n",
" url = \"https://shop-gateway.tuhu.cn/md-shop-crm-api/common/decrypt\"\n",
" # print(userId)\n",
" # 请求头headers\n",
" headers = {\n",
" 'apiVersion': '1.0.0',\n",
" 'channel': 'S-SITE',\n",
" 'deviceId': '05c6720e-ca19-4d7a-908c-4d60d20b7059',\n",
" 'Content-Type': 'application/json;charset=UTF-8',\n",
" 'authorization': 'Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImhHeXFFYi0tZUFFYTExa2lhZGc4ZXBpSGU0VSIsInR5cCI6IkpXVCIsIng1dCI6ImhHeXFFYi0tZUFFYTExa2lhZGc4ZXBpSGU0VSJ9.eyJuYmYiOjE3NDA2MzYzNjAsImV4cCI6MTc0MDYzOTk2MCwiaXNzIjoiaHR0cHM6Ly9hY2Nlc3MudHVodS5jbiIsImF1ZCI6WyJodHRwczovL2FjY2Vzcy50dWh1LmNuL3Jlc291cmNlcyIsInNpdGVfcyIsInNpdGVfc2FwaSIsInNpdGVfc2hvcGFwaSIsInNpdGVfd29ya3Nob3BhcGkiLCJ5ZXd1YXBpIl0sImNsaWVudF9pZCI6InNob3AudHVodS5jbiIsInN1YiI6IjA4ZGEyN2ZlNjQyYzQ5YmU4MGUxYzUwMjhlMzc3ZTkyIiwiYXV0aF90aW1lIjoxNzQwNjM2MzYwLCJpZHAiOiJUZWNobmljaWFuIiwibmFtZSI6IuWImOmTgeWGmyIsImlkIjo1NDIxNzgsInBob25lX251bWJlciI6IjEzMDE1MDYzOTk5IiwiYWNjb3VudF9sZXZlbCI6MTAsInNjb3BlIjpbIm9wZW5pZCIsIm5hbWUiLCJzaXRlX3MiLCJzaXRlX3NhcGkiLCJzaXRlX3Nob3BhcGkiLCJzaXRlX3dvcmtzaG9wYXBpIiwieWV3dWFwaSIsIm9mZmxpbmVfYWNjZXNzIl0sImFtciI6WyJUZWNobmljaWFuIl19.Vr3uFvmEO5PrGrRuDAvPz06kEiMTwm9bRpZJO0D4hLAMAO82iprgurKgny6aH4sFiQDxNahKTERhgF3nFsK17kSVWS6yCrm6iRSZjx3B08gOjVB0CpJ3BHTzqRDR7FUyZI4netggGxMgB3YONfeembX37rIBW7wiPckwIw0eQxhLGfYor9d_Zs5J4bJ-mDfFFb1Y2zYfQe70Or0hevbKisRQ6P6GtEMo5u7YwbkUtSeAsBY2P4LH6g8weM7OJs1I3HcN9OInoDv3UEsIdba3W1jy1OcU36UMXzB7140otB3kZm9bDwyAadNlic6wznpTj3xbXhgfMz6aGeXwSyv1sw',\n",
" 'authtype': 'oidc',\n",
" 'origin': 'https://shop.tuhu.cn',\n",
" 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0'\n",
" }\n",
" timestamp = time.time()\n",
"\n",
" # 请求体payload\n",
" payload = json.dumps({\n",
" 'apiVersion': '1.0.0',\n",
" 'channel': 'S-SITE',\n",
" 'deviceId': '05c6720e-ca19-4d7a-908c-4d60d20b7059',\n",
" 'getVirtualMobile': True,\n",
" 'shopId': 100727,\n",
" # 'sign': '08f13530413f8147ce35eea795b9a32d016dbdb3ba2b5b6b6333fd891dd15471',\n",
" 'timestamp': timestamp,\n",
" 'userId': userId,\n",
" })\n",
"\n",
" response = requests.post(url, headers=headers, data=payload)\n",
"\n",
" # print(response.text)\n",
" phone = response.json().get('data', {}).get('phone', '')\n",
" all_data.append({'userId': userId, 'phone': phone})\n",
" time.sleep(1)\n",
"pd.DataFrame(all_data).to_excel('D:\\Idea Project\\F6+宜搭+其它(1)\\new\\文件输出\\途虎客户手机号数据.xlsx',\n",
" index=False)\n"
],
"id": "6770e798736031d4",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"<>:44: SyntaxWarning: invalid escape sequence '\\I'\n",
"<>:44: SyntaxWarning: invalid escape sequence '\\I'\n",
"C:\\Users\\Administrator.DESKTOP-7IC2USJ\\AppData\\Local\\Temp\\ipykernel_6332\\1673590231.py:44: SyntaxWarning: invalid escape sequence '\\I'\n",
" pd.DataFrame(all_data).to_excel('D:\\Idea Project\\F6+宜搭+其它(1)\\new\\文件输出\\途虎客户手机号数据.xlsx',\n",
" 1%| | 52/5862 [00:59<1:51:23, 1.15s/it]\n",
"C:\\Users\\Administrator.DESKTOP-7IC2USJ\\AppData\\Local\\Temp\\ipykernel_6332\\1673590231.py:44: SyntaxWarning: invalid escape sequence '\\I'\n",
" pd.DataFrame(all_data).to_excel('D:\\Idea Project\\F6+宜搭+其它(1)\\new\\文件输出\\途虎客户手机号数据.xlsx',\n"
]
},
{
"ename": "JSONDecodeError",
"evalue": "Expecting value: line 1 column 1 (char 0)",
"output_type": "error",
"traceback": [
"\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
"\u001B[1;31mJSONDecodeError\u001B[0m Traceback (most recent call last)",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\requests\\models.py:974\u001B[0m, in \u001B[0;36mResponse.json\u001B[1;34m(self, **kwargs)\u001B[0m\n\u001B[0;32m 973\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m--> 974\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m complexjson\u001B[38;5;241m.\u001B[39mloads(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mtext, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n\u001B[0;32m 975\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m JSONDecodeError \u001B[38;5;28;01mas\u001B[39;00m e:\n\u001B[0;32m 976\u001B[0m \u001B[38;5;66;03m# Catch JSON-related errors and raise as requests.JSONDecodeError\u001B[39;00m\n\u001B[0;32m 977\u001B[0m \u001B[38;5;66;03m# This aliases json.JSONDecodeError and simplejson.JSONDecodeError\u001B[39;00m\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\json\\__init__.py:346\u001B[0m, in \u001B[0;36mloads\u001B[1;34m(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)\u001B[0m\n\u001B[0;32m 343\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m (\u001B[38;5;28mcls\u001B[39m \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;129;01mand\u001B[39;00m object_hook \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;129;01mand\u001B[39;00m\n\u001B[0;32m 344\u001B[0m parse_int \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;129;01mand\u001B[39;00m parse_float \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;129;01mand\u001B[39;00m\n\u001B[0;32m 345\u001B[0m parse_constant \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;129;01mand\u001B[39;00m object_pairs_hook \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;129;01mand\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m kw):\n\u001B[1;32m--> 346\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m _default_decoder\u001B[38;5;241m.\u001B[39mdecode(s)\n\u001B[0;32m 347\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mcls\u001B[39m \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\json\\decoder.py:337\u001B[0m, in \u001B[0;36mJSONDecoder.decode\u001B[1;34m(self, s, _w)\u001B[0m\n\u001B[0;32m 333\u001B[0m \u001B[38;5;250m\u001B[39m\u001B[38;5;124;03m\"\"\"Return the Python representation of ``s`` (a ``str`` instance\u001B[39;00m\n\u001B[0;32m 334\u001B[0m \u001B[38;5;124;03mcontaining a JSON document).\u001B[39;00m\n\u001B[0;32m 335\u001B[0m \n\u001B[0;32m 336\u001B[0m \u001B[38;5;124;03m\"\"\"\u001B[39;00m\n\u001B[1;32m--> 337\u001B[0m obj, end \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mraw_decode(s, idx\u001B[38;5;241m=\u001B[39m_w(s, \u001B[38;5;241m0\u001B[39m)\u001B[38;5;241m.\u001B[39mend())\n\u001B[0;32m 338\u001B[0m end \u001B[38;5;241m=\u001B[39m _w(s, end)\u001B[38;5;241m.\u001B[39mend()\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\json\\decoder.py:355\u001B[0m, in \u001B[0;36mJSONDecoder.raw_decode\u001B[1;34m(self, s, idx)\u001B[0m\n\u001B[0;32m 354\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mStopIteration\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m err:\n\u001B[1;32m--> 355\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m JSONDecodeError(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mExpecting value\u001B[39m\u001B[38;5;124m\"\u001B[39m, s, err\u001B[38;5;241m.\u001B[39mvalue) \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[0;32m 356\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m obj, end\n",
"\u001B[1;31mJSONDecodeError\u001B[0m: Expecting value: line 1 column 1 (char 0)",
"\nDuring handling of the above exception, another exception occurred:\n",
"\u001B[1;31mJSONDecodeError\u001B[0m Traceback (most recent call last)",
"Cell \u001B[1;32mIn[3], line 41\u001B[0m\n\u001B[0;32m 38\u001B[0m response \u001B[38;5;241m=\u001B[39m requests\u001B[38;5;241m.\u001B[39mpost(url, headers\u001B[38;5;241m=\u001B[39mheaders, data\u001B[38;5;241m=\u001B[39mpayload)\n\u001B[0;32m 40\u001B[0m \u001B[38;5;66;03m# print(response.text)\u001B[39;00m\n\u001B[1;32m---> 41\u001B[0m phone \u001B[38;5;241m=\u001B[39m response\u001B[38;5;241m.\u001B[39mjson()\u001B[38;5;241m.\u001B[39mget(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mdata\u001B[39m\u001B[38;5;124m'\u001B[39m, {})\u001B[38;5;241m.\u001B[39mget(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mphone\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124m'\u001B[39m)\n\u001B[0;32m 42\u001B[0m all_data\u001B[38;5;241m.\u001B[39mappend({\u001B[38;5;124m'\u001B[39m\u001B[38;5;124muserId\u001B[39m\u001B[38;5;124m'\u001B[39m: userId, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mphone\u001B[39m\u001B[38;5;124m'\u001B[39m: phone})\n\u001B[0;32m 43\u001B[0m time\u001B[38;5;241m.\u001B[39msleep(\u001B[38;5;241m1\u001B[39m)\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\requests\\models.py:978\u001B[0m, in \u001B[0;36mResponse.json\u001B[1;34m(self, **kwargs)\u001B[0m\n\u001B[0;32m 974\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m complexjson\u001B[38;5;241m.\u001B[39mloads(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mtext, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n\u001B[0;32m 975\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m JSONDecodeError \u001B[38;5;28;01mas\u001B[39;00m e:\n\u001B[0;32m 976\u001B[0m \u001B[38;5;66;03m# Catch JSON-related errors and raise as requests.JSONDecodeError\u001B[39;00m\n\u001B[0;32m 977\u001B[0m \u001B[38;5;66;03m# This aliases json.JSONDecodeError and simplejson.JSONDecodeError\u001B[39;00m\n\u001B[1;32m--> 978\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m RequestsJSONDecodeError(e\u001B[38;5;241m.\u001B[39mmsg, e\u001B[38;5;241m.\u001B[39mdoc, e\u001B[38;5;241m.\u001B[39mpos)\n",
"\u001B[1;31mJSONDecodeError\u001B[0m: Expecting value: line 1 column 1 (char 0)"
]
}
],
"execution_count": 3
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"历史维修记录\n",
"\n",
"该代码执行时间较长,authorization存在过期时间。"
],
"id": "a92c8f3e0b9717e1"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-02-06T10:03:44.740983Z",
"start_time": "2025-02-06T09:33:06.407413Z"
}
},
"cell_type": "code",
"source": [
"import requests\n",
"import json\n",
"import pandas as pd\n",
"from tqdm import tqdm\n",
"import re\n",
"\n",
"df = pd.DataFrame()\n",
"\n",
"for i in tqdm(range(360, 431)):\n",
" url = 'https://shop-gateway.tuhu.cn/mkt-shop-order-read/order-list-query/order-list'\n",
"\n",
" headers = {\n",
" 'apiVersion': '1.0.0',\n",
" 'channel': 'S-SITE',\n",
" 'deviceId': '05c6720e-ca19-4d7a-908c-4d60d20b7059',\n",
" 'Content-Type': 'application/json;charset=UTF-8',\n",
" 'authorization': 'Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImhHeXFFYi0tZUFFYTExa2lhZGc4ZXBpSGU0VSIsInR5cCI6IkpXVCIsIng1dCI6ImhHeXFFYi0tZUFFYTExa2lhZGc4ZXBpSGU0VSJ9.eyJuYmYiOjE3Mzg4MzQzNTAsImV4cCI6MTczODgzNzk1MCwiaXNzIjoiaHR0cHM6Ly9hY2Nlc3MudHVodS5jbiIsImF1ZCI6WyJodHRwczovL2FjY2Vzcy50dWh1LmNuL3Jlc291cmNlcyIsInNpdGVfcyIsInNpdGVfc2FwaSIsInNpdGVfc2hvcGFwaSIsInNpdGVfd29ya3Nob3BhcGkiLCJ5ZXd1YXBpIl0sImNsaWVudF9pZCI6InNob3AudHVodS5jbiIsInN1YiI6IjA4ZGEyN2ZlNjQyYzQ5YmU4MGUxYzUwMjhlMzc3ZTkyIiwiYXV0aF90aW1lIjoxNzM4NzQyMzMzLCJpZHAiOiJUZWNobmljaWFuIiwibmFtZSI6IuWImOmTgeWGmyIsImlkIjo1NDIxNzgsInBob25lX251bWJlciI6IjEzMDE1MDYzOTk5IiwiYWNjb3VudF9sZXZlbCI6MTAsInNjb3BlIjpbIm9wZW5pZCIsIm5hbWUiLCJzaXRlX3MiLCJzaXRlX3NhcGkiLCJzaXRlX3Nob3BhcGkiLCJzaXRlX3dvcmtzaG9wYXBpIiwieWV3dWFwaSIsIm9mZmxpbmVfYWNjZXNzIl0sImFtciI6WyJUZWNobmljaWFuIl19.X_3dGwdaI2Puq5jWwaGR7PPV3bLm2FCNynde_-6LKXvTXHyyctOfi5uD2BMqjvKrXPd7Mp99QtGOaM9a4J0GlWCwqezd9j-oL8cs1UZQlaiBuqVn9ngGY7OrmIzFpWxttHsjlyWUBlce5LGxDb1wvQjs5ZHFj8EduGIXFW8UYf8La7wnJIIkiZtA0iXHLnHR7Pu4y01hi4MZT8ALxoJ3mkqmvIg2IEejfWimLwPGR0zy9y0GcgxSsUzHeLwYikhy4h6C0x50Ow8_mZJBpTl09-sF_RIqwnPN9FuwwyDUQbOajdQCq9tt5JS87HU2fFPiV9Hx3O-Z7WRxg_BBYvCRHw',\n",
" #需要经常更换\n",
" 'authtype': 'oidc',\n",
" 'origin': 'https://shop.tuhu.cn',\n",
" 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0'\n",
" }\n",
"\n",
" json = {\"apiVersion\": \"1.0.0\", \"channel\": \"S-SITE\", \"deviceId\": \"05c6720e-ca19-4d7a-908c-4d60d20b7059\",\n",
" \"businessType\": 14, \"shopId\": 100727, \"generalOrderExtendRequest\": {\"pid\": \"\", \"productName\": \"\"},\n",
" \"productName\": \"\", \"pid\": \"\", \"deliveryType\": \"\", \"deliveryStatus\": \"\", \"containCarPro\": \"\", \"orderNo\": \"\",\n",
" \"carPlate\": \"\", \"orderChannel\": \"\", \"installType\": \"\", \"payMethod\": \"\", \"userTel\": \"\", \"orderStatus\": \"\",\n",
" \"payStatus\": \"\", \"installStatus\": \"\", \"orderType\": \"\", \"refNo\": \"\", \"relationRec\": 0, \"money\": \"\",\n",
" \"page\": i, \"size\": 20}\n",
"\n",
" response = requests.post(url, headers=headers, json=json)\n",
" data = response.json()\n",
" # print(data)\n",
" # break\n",
" order_list = data.get('data', {}).get('results', [])\n",
" for order in order_list:\n",
" order_no = order.get('orderBase', '').get('orderNo', '')\n",
" # print(order_no)\n",
" userId = order.get('orderUsers', {}).get('userId', '')\n",
" # print(userId)\n",
"\n",
" match = re.search(r'TH(\\d+)', order_no)\n",
" if match:\n",
" order_no = match.group(1)\n",
" else:\n",
" order_no = order_no\n",
" detail_url = f'https://shop-gateway.tuhu.cn/cl-bff-shop-sale/s-site/order/get-order-detail'\n",
"\n",
" detail_json = {\"apiVersion\": \"1.0.0\", \"channel\": \"S-SITE\", \"deviceId\": userId,\n",
" \"orderId\": order_no}\n",
" detail_response = requests.post(detail_url, headers=headers, json=detail_json)\n",
" detail_data = detail_response.json()\n",
" # print(detail_data)\n",
"\n",
" order_base_info = detail_data.get('data', {}).get('orderBaseInfo', {})\n",
" payment_info = detail_data.get('data', {}).get('paymentInfo', {})\n",
" commodity_items = detail_data.get('data', {}).get('productList', {}).get('commodityItem', [])\n",
" service_items = detail_data.get('data', {}).get('productList', {}).get('serviceItem', [])\n",
" records = []\n",
"\n",
" for commodity in commodity_items:\n",
" record = {**order_base_info, **payment_info, **{f'commodity_{k}': v for k, v in commodity.items()}}\n",
" records.append(record)\n",
"\n",
" # 遍历serviceItem中的每一个服务项\n",
" for service in service_items:\n",
" record = {**order_base_info, **payment_info, **{f'service_{k}': v for k, v in service.items()}}\n",
" records.append(record)\n",
"\n",
" df = pd.concat([df, pd.DataFrame(records)], ignore_index=True)\n",
" # print(df)\n",
"\n",
" time.sleep(0.5)\n",
"df.to_excel(fr'D:\\Idea Project\\F6+宜搭+其它(1)\\new\\文件输出\\途虎养车历史维修记录3.xlsx', index=False)\n"
],
"id": "a7838974e7ec5a95",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 71/71 [30:32<00:00, 25.81s/it]\n"
]
}
],
"execution_count": 51
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-02-06T09:26:30.353552Z",
"start_time": "2025-02-06T09:26:20.857691Z"
}
},
"cell_type": "code",
"source": "df.to_excel(fr'D:\\Idea Project\\F6+宜搭+其它(1)\\new\\文件输出\\途虎养车历史维修记录3.xlsx', index=False)",
"id": "e66bbf0fbc7d3f5",
"outputs": [],
"execution_count": 49
},
{
"metadata": {},
"cell_type": "markdown",
"source": "供应商信息",
"id": "b756d9d508be366b"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-02-07T02:53:41.872890Z",
"start_time": "2025-02-07T02:51:25.758324Z"
}
},
"cell_type": "code",
"source": [
"import requests\n",
"import pandas as pd\n",
"import os\n",
"from urllib.parse import urlparse\n",
"import openpyxl\n",
"from openpyxl.utils import get_column_letter\n",
"from tqdm import tqdm\n",
"\n",
"df = pd.DataFrame()\n",
"all_keys = set()\n",
"df['手机号'] = ''\n",
"df[\"营业执照\"] = ''\n",
"df[\"门头照片\"] =''\n",
"df[\"营业执照链接\"] = ''\n",
"df[\"门头照片链接\"] = ''\n",
"\n",
"\n",
"# 创建一个文件夹来存放下载的图片(假设与Excel文件在同一目录)\n",
"base_folder = r'D:\\Idea Project\\F6+宜搭+其它(1)\\new\\文件输出\\途虎养车供应商信息' # Excel文件所在的目录\n",
"download_folder = os.path.join(base_folder, 'downloaded_images')\n",
"if not os.path.exists(download_folder):\n",
" os.makedirs(download_folder)\n",
"\n",
"def download_image(img_url, folder_path):\n",
" \"\"\"下载图片并保存到指定文件夹\"\"\"\n",
" try:\n",
" # 检查是否为有效URL\n",
" if not img_url.startswith(('http://', 'https://')):\n",
" # print(f\"Invalid URL: {img_url}\")\n",
" return None\n",
"\n",
" response = requests.get(img_url)\n",
" if response.status_code == 200:\n",
" # 提取文件名\n",
" parsed_url = urlparse(img_url)\n",
" file_name = os.path.basename(parsed_url.path)\n",
" if not file_name:\n",
" file_name = 'image.jpg' # 默认文件名\n",
"\n",
" # 构建保存路径\n",
" save_path = os.path.join(folder_path, file_name)\n",
"\n",
" with open(save_path, 'wb') as handler:\n",
" handler.write(response.content)\n",
" return save_path\n",
" else:\n",
" print(f\"Failed to download image from {img_url}, status code: {response.status_code}\")\n",
" return None\n",
" except Exception as e:\n",
" print(f\"Error downloading image from {img_url}: {str(e)}\")\n",
" return None\n",
"\n",
"def parse_pics_string(pics_str):\n",
" \"\"\"将包含多个图片链接的字符串解析为URL列表\"\"\"\n",
" if isinstance(pics_str, str):\n",
" # 假设图片链接是以逗号分隔的字符串\n",
" pics_list = [url.strip() for url in pics_str.split(',')]\n",
" else:\n",
" pics_list = []\n",
" return pics_list\n",
"\n",
"def process_pics_column(pics_str, folder_path):\n",
" \"\"\"处理每行的图片链接字符串,下载图片并存储其路径\"\"\"\n",
" pics_list = parse_pics_string(pics_str)\n",
" return [download_image(pic, folder_path) for pic in pics_list]\n",
"\n",
"def create_relative_hyperlink(path):\n",
" \"\"\"创建相对路径的超链接\"\"\"\n",
" relative_path = os.path.relpath(path, start=base_folder).replace(os.sep, '/')\n",
" return f'=HYPERLINK(\"{relative_path}\", \"Open Image\")'\n",
"\n",
"for i in tqdm(range(1, 9), desc='Processing rows'):\n",
" url = 'https://shop-gateway.tuhu.cn/shop-purchase/shop/supplier/search-suppliers-v1'\n",
" \n",
" headers = {\n",
" 'apiVersion': '1.0.0',\n",
" 'channel': 'S-SITE',\n",
" 'deviceId': '05c6720e-ca19-4d7a-908c-4d60d20b7059',\n",
" 'Content-Type': 'application/json;charset=UTF-8',\n",
" 'authorization': 'Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImhHeXFFYi0tZUFFYTExa2lhZGc4ZXBpSGU0VSIsInR5cCI6IkpXVCIsIng1dCI6ImhHeXFFYi0tZUFFYTExa2lhZGc4ZXBpSGU0VSJ9.eyJuYmYiOjE3Mzg4OTM5NTcsImV4cCI6MTczODg5NzU1NywiaXNzIjoiaHR0cHM6Ly9hY2Nlc3MudHVodS5jbiIsImF1ZCI6WyJodHRwczovL2FjY2Vzcy50dWh1LmNuL3Jlc291cmNlcyIsInNpdGVfcyIsInNpdGVfc2FwaSIsInNpdGVfc2hvcGFwaSIsInNpdGVfd29ya3Nob3BhcGkiLCJ5ZXd1YXBpIl0sImNsaWVudF9pZCI6InNob3AudHVodS5jbiIsInN1YiI6IjA4ZGEyN2ZlNjQyYzQ5YmU4MGUxYzUwMjhlMzc3ZTkyIiwiYXV0aF90aW1lIjoxNzM4NzQyMzMzLCJpZHAiOiJUZWNobmljaWFuIiwibmFtZSI6IuWImOmTgeWGmyIsImlkIjo1NDIxNzgsInBob25lX251bWJlciI6IjEzMDE1MDYzOTk5IiwiYWNjb3VudF9sZXZlbCI6MTAsInNjb3BlIjpbIm9wZW5pZCIsIm5hbWUiLCJzaXRlX3MiLCJzaXRlX3NhcGkiLCJzaXRlX3Nob3BhcGkiLCJzaXRlX3dvcmtzaG9wYXBpIiwieWV3dWFwaSIsIm9mZmxpbmVfYWNjZXNzIl0sImFtciI6WyJUZWNobmljaWFuIl19.XQdMNGP5qeU3B4A-1LClQ9ApsWAEC20KGYbwNbXsC8vcjNOJjxQEj7b659Ns3ncDEyGASQseJCkApq1VdzJ_lTffDubmXj2KJmXn4sWbkWRnWiOM-RDCuw4Nhl8FpiTnl-PnugAHtb7q4WJ2GJgHTn97129KZOa5KcO5vUuMSmykorIPcwPY3KIW-EB72LPuQkyhFRxGe19-FNXH3YUHzp5PN_ijrscL4_sMTr8YzV9PAPBg9L_DbFRaPP_xTyDDX08RueUVaBB73uVWZxQPwpqFP72DrhdOe291QVdKgxYtFrJK_JELM3RUBbooOV_VcVwecw6IE01u7omqXR6_pg',\n",
" #需要经常更换\n",
" 'authtype': 'oidc',\n",
" 'origin': 'https://shop.tuhu.cn',\n",
" 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0'\n",
" }\n",
" vendor_json = {\"apiVersion\": \"1.0.0\", \"channel\": \"S-SITE\", \"deviceId\": \"05c6720e-ca19-4d7a-908c-4d60d20b7059\",\n",
" \"companyName\": \"\", \"status\": -1, \"pageNum\": i, \"pageSize\": 10, \"checked\": \"null\"}\n",
" \n",
" response = requests.post(url, headers=headers, json=vendor_json)\n",
" data = response.json().get('data', {})\n",
" data_list = data.get('list', [])\n",
" # print(data_list)\n",
" for item in data_list:\n",
" # company_name = item.get('companyName', '')\n",
" # supplier_address = item.get('supplierAddress', '')\n",
" mobile = item.get('mobile', '')\n",
" pk_id = item.get('pkId', '')\n",
" \n",
" # 请求的URL\n",
" url = \"https://shop-gateway.tuhu.cn/shop-purchase/purchase/common/encrypt-data\"\n",
" \n",
" # 请求的查询参数\n",
" params = {\n",
" 'apiVersion': '1.0.0',\n",
" 'channel': 'S-SITE',\n",
" 'deviceId': '05c6720e-ca19-4d7a-908c-4d60d20b7059',\n",
" 'encryptData': mobile\n",
" }\n",
" \n",
" # 请求头\n",
" headers = {\n",
" 'accept': 'application/json, text/plain, */*',\n",
" 'authorization': 'Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImhHeXFFYi0tZUFFYTExa2lhZGc4ZXBpSGU0VSIsInR5cCI6IkpXVCIsIng1dCI6ImhHeXFFYi0tZUFFYTExa2lhZGc4ZXBpSGU0VSJ9.eyJuYmYiOjE3Mzg4OTM5NTcsImV4cCI6MTczODg5NzU1NywiaXNzIjoiaHR0cHM6Ly9hY2Nlc3MudHVodS5jbiIsImF1ZCI6WyJodHRwczovL2FjY2Vzcy50dWh1LmNuL3Jlc291cmNlcyIsInNpdGVfcyIsInNpdGVfc2FwaSIsInNpdGVfc2hvcGFwaSIsInNpdGVfd29ya3Nob3BhcGkiLCJ5ZXd1YXBpIl0sImNsaWVudF9pZCI6InNob3AudHVodS5jbiIsInN1YiI6IjA4ZGEyN2ZlNjQyYzQ5YmU4MGUxYzUwMjhlMzc3ZTkyIiwiYXV0aF90aW1lIjoxNzM4NzQyMzMzLCJpZHAiOiJUZWNobmljaWFuIiwibmFtZSI6IuWImOmTgeWGmyIsImlkIjo1NDIxNzgsInBob25lX251bWJlciI6IjEzMDE1MDYzOTk5IiwiYWNjb3VudF9sZXZlbCI6MTAsInNjb3BlIjpbIm9wZW5pZCIsIm5hbWUiLCJzaXRlX3MiLCJzaXRlX3NhcGkiLCJzaXRlX3Nob3BhcGkiLCJzaXRlX3dvcmtzaG9wYXBpIiwieWV3dWFwaSIsIm9mZmxpbmVfYWNjZXNzIl0sImFtciI6WyJUZWNobmljaWFuIl19.XQdMNGP5qeU3B4A-1LClQ9ApsWAEC20KGYbwNbXsC8vcjNOJjxQEj7b659Ns3ncDEyGASQseJCkApq1VdzJ_lTffDubmXj2KJmXn4sWbkWRnWiOM-RDCuw4Nhl8FpiTnl-PnugAHtb7q4WJ2GJgHTn97129KZOa5KcO5vUuMSmykorIPcwPY3KIW-EB72LPuQkyhFRxGe19-FNXH3YUHzp5PN_ijrscL4_sMTr8YzV9PAPBg9L_DbFRaPP_xTyDDX08RueUVaBB73uVWZxQPwpqFP72DrhdOe291QVdKgxYtFrJK_JELM3RUBbooOV_VcVwecw6IE01u7omqXR6_pg',\n",
" # 请替换为您的实际访问令牌\n",
" 'authtype': 'oidc',\n",
" 'channel': 'S-SITE',\n",
" 'deviceid': '05c6720e-ca19-4d7a-908c-4d60d20b7059',\n",
" 'origin': 'https://shop.tuhu.cn',\n",
" 'referer': 'https://shop.tuhu.cn/',\n",
" 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0'\n",
" }\n",
" # 发送GET请求\n",
" phone_response = requests.get(url=url, headers=headers, params=params)\n",
" phone = phone_response.json().get('data', {})\n",
" time.sleep(0.5)\n",
" \n",
" detail_url = f'https://shop-gateway.tuhu.cn/shop-purchase/shop/supplier/get-shop-supplier-info'\n",
" params = {\n",
" 'apiVersion': '1.0.0',\n",
" 'channel': 'S-SITE',\n",
" 'deviceId': '05c6720e-ca19-4d7a-908c-4d60d20b7059',\n",
" 'pkId': pk_id\n",
" }\n",
" detail_response = requests.get(url=detail_url, headers=headers, params=params)\n",
" details = detail_response.json().get('data', {})\n",
" # 收集所有出现过的键\n",
" all_keys.update(details.keys())\n",
" \n",
" # 创建临时DataFrame\n",
" df_temp = pd.DataFrame([details])\n",
" df_temp['手机号'] = phone\n",
" \n",
" # 确保每个details字典都包含所有可能的键\n",
" for key in all_keys:\n",
" if key not in df_temp.columns:\n",
" df_temp[key] = None # 或者使用其他合适的默认值,如空字符串 ''\n",
" \n",
" # 将临时DataFrame合并到最终的DataFrame中\n",
" df = pd.concat([df, df_temp], ignore_index=True)\n",
" \n",
" time.sleep(0.5)\n",
"\n",
"df[\"营业执照\"] = df['pics'].apply(lambda x: process_pics_column(x, download_folder))\n",
"df[\"门头照片\"] = df['frontDoorPhoto'].apply(lambda x: process_pics_column(x, download_folder))\n",
"# 将图片路径转换为相对路径的超链接\n",
"df[\"营业执照链接\"] = df[\"营业执照\"].apply(lambda x: create_relative_hyperlink(x[0]) if x and x[0] else '')\n",
"df[\"门头照片链接\"] = df[\"门头照片\"].apply(lambda x: create_relative_hyperlink(x[0]) if x and x[0] else '')\n",
"output_excel_path = os.path.join(base_folder, '途虎养车供应商信息.xlsx')\n",
"df.to_excel(output_excel_path, index=False)\n",
"# 使用openpyxl调整Excel文件以确保超链接正确显示\n",
"wb = openpyxl.load_workbook(output_excel_path)\n",
"ws = wb.active\n",
"# 设置列宽以适应超链接文本\n",
"for col in ws.columns:\n",
" max_length = 0\n",
" column = get_column_letter(col[0].column) # Get the column name\n",
" for cell in col:\n",
" try: # Necessary to avoid error on empty cells\n",
" if len(str(cell.value)) > max_length:\n",
" max_length = len(str(cell.value))\n",
" except:\n",
" pass\n",
" adjusted_width = (max_length + 2)\n",
" ws.column_dimensions[column].width = adjusted_width\n",
"\n",
"# 保存修改后的Excel文件\n",
"wb.save(output_excel_path)"
],
"id": "e97d8dbfdab19982",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Processing rows: 100%|██████████| 8/8 [01:34<00:00, 11.75s/it]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Failed to download image from https://img1.tuhu.org/tech/pic/-mn6qAeSHiWPKul3bJF_cA_w1706_h1280.jpeg;https://img1.tuhu.org/tech/pic/WZvnzMOto4XdUUc0PJQs_Q_w1706_h1280.jpeg, status code: 404\n",
"Failed to download image from https://img4.tuhu.org/tech/pic/QFYtszYdD26Wq7JU7hR25w_w1920_h862.jpeg;https://img4.tuhu.org/tech/pic/mL5yS0puYtk-BXZT2MKHDA_w1920_h862.jpeg, status code: 404\n",
"Failed to download image from https://img3.tuhu.org/tech/pic/DoHsyVV5zmNq-TJM9cTbtA_w1600_h719.jpeg;https://img3.tuhu.org/tech/pic/vfwBuEyxmjiFYrirZUQpng_w1600_h719.jpeg, status code: 404\n",
"Failed to download image from https://img3.tuhu.org//hpDZDhPYMUXCMZGtXK9x9A_w1000_h322.jpeg;, status code: 404\n",
"Failed to download image from https://img1.tuhu.org//39/5efe/6b08685657b1c626b159042103_w166_h220.jpg;, status code: 404\n",
"Failed to download image from https://img3.tuhu.org//yewu/tuhu_shop/SupplierPics/4a9f/9e55/48da7df3ecb2e827c8c82024_w523_h767.png;, status code: 404\n"
]
}
],
"execution_count": 87
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-02-07T02:14:48.367003Z",
"start_time": "2025-02-07T02:14:48.361914Z"
}
},
"cell_type": "code",
"source": "output_excel_path = os.path.join(base_folder, '途虎养车供应商信息.xlsx')",
"id": "2a5dc57468ebc69a",
"outputs": [],
"execution_count": 78
},
{
"metadata": {},
"cell_type": "markdown",
"source": "途虎历史维修记录创建时间",
"id": "9f57b24905bb9541"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-02-19T09:28:31.025839Z",
"start_time": "2025-02-19T09:28:25.992131Z"
}
},
"cell_type": "code",
"source": [
"import requests\n",
"import json\n",
"import pandas as pd\n",
"from tqdm import tqdm\n",
"import re\n",
"\n",
"df = pd.DataFrame()\n",
"\n",
"for i in tqdm(range(1, 431)):\n",
" url = 'https://shop-gateway.tuhu.cn/mkt-shop-order-read/order-list-query/order-list'\n",
"\n",
" headers = {\n",
" 'apiVersion': '1.0.0',\n",
" 'channel': 'S-SITE',\n",
" 'deviceId': '05c6720e-ca19-4d7a-908c-4d60d20b7059',\n",
" 'Content-Type': 'application/json;charset=UTF-8',\n",
" 'authorization': 'Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImhHeXFFYi0tZUFFYTExa2lhZGc4ZXBpSGU0VSIsInR5cCI6IkpXVCIsIng1dCI6ImhHeXFFYi0tZUFFYTExa2lhZGc4ZXBpSGU0VSJ9.eyJuYmYiOjE3Mzk5NTU0MzQsImV4cCI6MTczOTk1OTAzNCwiaXNzIjoiaHR0cHM6Ly9hY2Nlc3MudHVodS5jbiIsImF1ZCI6WyJodHRwczovL2FjY2Vzcy50dWh1LmNuL3Jlc291cmNlcyIsInNpdGVfcyIsInNpdGVfc2FwaSIsInNpdGVfc2hvcGFwaSIsInNpdGVfd29ya3Nob3BhcGkiLCJ5ZXd1YXBpIl0sImNsaWVudF9pZCI6InNob3AudHVodS5jbiIsInN1YiI6IjA4ZGEyN2ZlNjQyYzQ5YmU4MGUxYzUwMjhlMzc3ZTkyIiwiYXV0aF90aW1lIjoxNzM5OTU1NDM0LCJpZHAiOiJUZWNobmljaWFuIiwibmFtZSI6IuWImOmTgeWGmyIsImlkIjo1NDIxNzgsInBob25lX251bWJlciI6IjEzMDE1MDYzOTk5IiwiYWNjb3VudF9sZXZlbCI6MTAsInNjb3BlIjpbIm9wZW5pZCIsIm5hbWUiLCJzaXRlX3MiLCJzaXRlX3NhcGkiLCJzaXRlX3Nob3BhcGkiLCJzaXRlX3dvcmtzaG9wYXBpIiwieWV3dWFwaSIsIm9mZmxpbmVfYWNjZXNzIl0sImFtciI6WyJUZWNobmljaWFuIl19.kLvdR8MgbfAOk02PRoXS7ldBiBdb3XYm5VCCt8y0IkslaRWGF60q6xO5rCyz0Dht6jJAM_7W12SYZfurWq3WQVSddGHviyxRO7AN4nyll6fJmIfjb2gSE9NE5zU2fFFv7oK2rTGlO6HLZhWLPu4lgBIjF_86RCbEkRZYO_4FQoGO_MlCZ-9wfEMlfneLnnwDb9vbz9iyS7gtFPCOrlmYzs6zDfJ4HtyJWiu1q6kGHaIl9-ouyJHpTIuAuYFDPv4wHsWEf8Lkdb4RpnEGcFjjlpsQ2--kgXbppF0QD_2_ZMDzuBii6AYzeh0zXWhgYlDJC3Rm6JFUbZk0cjOWKjKRIA',\n",
" #需要经常更换\n",
" 'authtype': 'oidc',\n",
" 'origin': 'https://shop.tuhu.cn',\n",
" 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0'\n",
" }\n",
"\n",
" json = {\"apiVersion\": \"1.0.0\", \"channel\": \"S-SITE\", \"deviceId\": \"05c6720e-ca19-4d7a-908c-4d60d20b7059\",\n",
" \"businessType\": 14, \"shopId\": 100727, \"generalOrderExtendRequest\": {\"pid\": \"\", \"productName\": \"\"},\n",
" \"productName\": \"\", \"pid\": \"\", \"deliveryType\": \"\", \"deliveryStatus\": \"\", \"containCarPro\": \"\", \"orderNo\": \"\",\n",
" \"carPlate\": \"\", \"orderChannel\": \"\", \"installType\": \"\", \"payMethod\": \"\", \"userTel\": \"\", \"orderStatus\": \"\",\n",
" \"payStatus\": \"\", \"installStatus\": \"\", \"orderType\": \"\", \"refNo\": \"\", \"relationRec\": 0, \"money\": \"\",\n",
" \"page\": i, \"size\": 20}\n",
"\n",
" response = requests.post(url, headers=headers, json=json)\n",
" data = response.json()\n",
" # print(data)\n",
" # break\n",
" order_list = data.get('data', {}).get('results', [])\n",
" for order in order_list:\n",
" order_no = order.get('orderBase', '').get('orderNo', '')\n",
" # print(order_no)\n",
" userId = order.get('orderUsers', {}).get('userId', '')\n",
" orderDatetime = order.get('orderBase', {}).get('orderDatetime', '')\n",
" # print(userId)\n",
"\n",
" match = re.search(r'TH(\\d+)', order_no)\n",
" if match:\n",
" order_no = match.group(1)\n",
" else:\n",
" order_no = order_no\n",
" detail_url = f'https://shop-gateway.tuhu.cn/cl-bff-shop-sale/s-site/order/get-order-detail'\n",
"\n",
" detail_json = {\"apiVersion\": \"1.0.0\", \"channel\": \"S-SITE\", \"deviceId\": userId,\n",
" \"orderId\": order_no}\n",
" detail_response = requests.post(detail_url, headers=headers, json=detail_json)\n",
" detail_data = detail_response.json()\n",
" # print(detail_data)\n",
"\n",
" order_base_info = detail_data.get('data', {}).get('orderBaseInfo', {})\n",
" payment_info = detail_data.get('data', {}).get('paymentInfo', {})\n",
" commodity_items = detail_data.get('data', {}).get('productList', {}).get('commodityItem', [])\n",
" service_items = detail_data.get('data', {}).get('productList', {}).get('serviceItem', [])\n",
" order_base_info[\"orderDatetime\"] = orderDatetime\n",
" records = []\n",
"\n",
" for commodity in commodity_items:\n",
" record = {**order_base_info, **payment_info, **{f'commodity_{k}': v for k, v in commodity.items()}}\n",
" records.append(record)\n",
"\n",
" # 遍历serviceItem中的每一个服务项\n",
" for service in service_items:\n",
" record = {**order_base_info, **payment_info, **{f'service_{k}': v for k, v in service.items()}}\n",
" records.append(record)\n",
" \n",
" df = pd.concat([df, pd.DataFrame(records)], ignore_index=True)\n",
" \n",
" \n",
" time.sleep(0.5)\n",
"df.to_excel(fr'D:\\Idea Project\\F6+宜搭+其它(1)\\new\\文件输出\\途虎养车历史维修记录3.xlsx', index=False)\n"
],
"id": "f69a9e6f0d7787e2",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
" 0%| | 0/430 [00:00<?, ?it/s]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" orderId orderNo status remark orderChannel \\\n",
"0 892839564 TH892839564 7Canceled 售后拆单,来自订单:828036703 8手机 \n",
"\n",
" orderType extraInfo receiveId statusValue \\\n",
"0 1普通 {'orderTags': ['后日达'], 'currency': 'CNY'} None 订单已取消 \n",
"\n",
" plateNumber ... service_isStar service_purchaseOrderIdList \\\n",
"0 蒙B986NS ... False [] \n",
"\n",
" service_wcPurchaseOrderIdList service_mdwcNum service_thphNum \\\n",
"0 [] 0 0 \n",
"\n",
" service_showValveTip service_purchaseStatusValue service_cargoOwner \\\n",
"0 False 已采购 None \n",
"\n",
" service_stock service_stockStatus \n",
"0 可用 1 \n",
"\n",
"[1 rows x 62 columns]\n",
" orderId orderNo status remark orderChannel \\\n",
"0 892839564 TH892839564 7Canceled 售后拆单,来自订单:828036703 8手机 \n",
"1 892879382 TH892879382 2Shipped p拼多多 \n",
"2 892879382 TH892879382 2Shipped p拼多多 \n",
"3 892879382 TH892879382 2Shipped p拼多多 \n",
"\n",
" orderType extraInfo receiveId statusValue \\\n",
"0 1普通 {'orderTags': ['后日达'], 'currency': 'CNY'} None 订单已取消 \n",
"1 1普通 {'orderTags': [], 'currency': 'CNY'} None 已发货 \n",
"2 1普通 {'orderTags': [], 'currency': 'CNY'} None 已发货 \n",
"3 1普通 {'orderTags': [], 'currency': 'CNY'} None 已发货 \n",
"\n",
" plateNumber ... commodity_isStar commodity_purchaseOrderIdList \\\n",
"0 蒙B986NS ... NaN NaN \n",
"1 NaN ... False [] \n",
"2 NaN ... False [] \n",
"3 NaN ... NaN NaN \n",
"\n",
" commodity_wcPurchaseOrderIdList commodity_mdwcNum commodity_thphNum \\\n",
"0 NaN NaN NaN \n",
"1 [] 0.0 2.0 \n",
"2 [] 0.0 2.0 \n",
"3 NaN NaN NaN \n",
"\n",
" commodity_showValveTip commodity_purchaseStatusValue commodity_cargoOwner \\\n",
"0 NaN NaN NaN \n",
"1 False 已采购 途虎:2\\n \n",
"2 False 已采购 途虎:2\\n \n",
"3 NaN NaN NaN \n",
"\n",
" commodity_stock commodity_stockStatus \n",
"0 NaN NaN \n",
"1 可用 1.0 \n",
"2 可用 1.0 \n",
"3 NaN NaN \n",
"\n",
"[4 rows x 83 columns]\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
" 0%| | 0/430 [00:04<?, ?it/s]\n"
]
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
"\u001B[1;31mKeyboardInterrupt\u001B[0m Traceback (most recent call last)",
"Cell \u001B[1;32mIn[11], line 52\u001B[0m\n\u001B[0;32m 48\u001B[0m detail_url \u001B[38;5;241m=\u001B[39m \u001B[38;5;124mf\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mhttps://shop-gateway.tuhu.cn/cl-bff-shop-sale/s-site/order/get-order-detail\u001B[39m\u001B[38;5;124m'\u001B[39m\n\u001B[0;32m 50\u001B[0m detail_json \u001B[38;5;241m=\u001B[39m {\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mapiVersion\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m1.0.0\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mchannel\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mS-SITE\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mdeviceId\u001B[39m\u001B[38;5;124m\"\u001B[39m: userId,\n\u001B[0;32m 51\u001B[0m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124morderId\u001B[39m\u001B[38;5;124m\"\u001B[39m: order_no}\n\u001B[1;32m---> 52\u001B[0m detail_response \u001B[38;5;241m=\u001B[39m requests\u001B[38;5;241m.\u001B[39mpost(detail_url, headers\u001B[38;5;241m=\u001B[39mheaders, json\u001B[38;5;241m=\u001B[39mdetail_json)\n\u001B[0;32m 53\u001B[0m detail_data \u001B[38;5;241m=\u001B[39m detail_response\u001B[38;5;241m.\u001B[39mjson()\n\u001B[0;32m 54\u001B[0m \u001B[38;5;66;03m# print(detail_data)\u001B[39;00m\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\requests\\api.py:115\u001B[0m, in \u001B[0;36mpost\u001B[1;34m(url, data, json, **kwargs)\u001B[0m\n\u001B[0;32m 103\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mpost\u001B[39m(url, data\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mNone\u001B[39;00m, json\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mNone\u001B[39;00m, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs):\n\u001B[0;32m 104\u001B[0m \u001B[38;5;250m \u001B[39m\u001B[38;5;124mr\u001B[39m\u001B[38;5;124;03m\"\"\"Sends a POST request.\u001B[39;00m\n\u001B[0;32m 105\u001B[0m \n\u001B[0;32m 106\u001B[0m \u001B[38;5;124;03m :param url: URL for the new :class:`Request` object.\u001B[39;00m\n\u001B[1;32m (...)\u001B[0m\n\u001B[0;32m 112\u001B[0m \u001B[38;5;124;03m :rtype: requests.Response\u001B[39;00m\n\u001B[0;32m 113\u001B[0m \u001B[38;5;124;03m \"\"\"\u001B[39;00m\n\u001B[1;32m--> 115\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m request(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mpost\u001B[39m\u001B[38;5;124m\"\u001B[39m, url, data\u001B[38;5;241m=\u001B[39mdata, json\u001B[38;5;241m=\u001B[39mjson, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\requests\\api.py:59\u001B[0m, in \u001B[0;36mrequest\u001B[1;34m(method, url, **kwargs)\u001B[0m\n\u001B[0;32m 55\u001B[0m \u001B[38;5;66;03m# By using the 'with' statement we are sure the session is closed, thus we\u001B[39;00m\n\u001B[0;32m 56\u001B[0m \u001B[38;5;66;03m# avoid leaving sockets open which can trigger a ResourceWarning in some\u001B[39;00m\n\u001B[0;32m 57\u001B[0m \u001B[38;5;66;03m# cases, and look like a memory leak in others.\u001B[39;00m\n\u001B[0;32m 58\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m sessions\u001B[38;5;241m.\u001B[39mSession() \u001B[38;5;28;01mas\u001B[39;00m session:\n\u001B[1;32m---> 59\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m session\u001B[38;5;241m.\u001B[39mrequest(method\u001B[38;5;241m=\u001B[39mmethod, url\u001B[38;5;241m=\u001B[39murl, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\requests\\sessions.py:589\u001B[0m, in \u001B[0;36mSession.request\u001B[1;34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001B[0m\n\u001B[0;32m 584\u001B[0m send_kwargs \u001B[38;5;241m=\u001B[39m {\n\u001B[0;32m 585\u001B[0m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mtimeout\u001B[39m\u001B[38;5;124m\"\u001B[39m: timeout,\n\u001B[0;32m 586\u001B[0m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mallow_redirects\u001B[39m\u001B[38;5;124m\"\u001B[39m: allow_redirects,\n\u001B[0;32m 587\u001B[0m }\n\u001B[0;32m 588\u001B[0m send_kwargs\u001B[38;5;241m.\u001B[39mupdate(settings)\n\u001B[1;32m--> 589\u001B[0m resp \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39msend(prep, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39msend_kwargs)\n\u001B[0;32m 591\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m resp\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\requests\\sessions.py:703\u001B[0m, in \u001B[0;36mSession.send\u001B[1;34m(self, request, **kwargs)\u001B[0m\n\u001B[0;32m 700\u001B[0m start \u001B[38;5;241m=\u001B[39m preferred_clock()\n\u001B[0;32m 702\u001B[0m \u001B[38;5;66;03m# Send the request\u001B[39;00m\n\u001B[1;32m--> 703\u001B[0m r \u001B[38;5;241m=\u001B[39m adapter\u001B[38;5;241m.\u001B[39msend(request, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n\u001B[0;32m 705\u001B[0m \u001B[38;5;66;03m# Total elapsed time of the request (approximately)\u001B[39;00m\n\u001B[0;32m 706\u001B[0m elapsed \u001B[38;5;241m=\u001B[39m preferred_clock() \u001B[38;5;241m-\u001B[39m start\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\requests\\adapters.py:589\u001B[0m, in \u001B[0;36mHTTPAdapter.send\u001B[1;34m(self, request, stream, timeout, verify, cert, proxies)\u001B[0m\n\u001B[0;32m 586\u001B[0m timeout \u001B[38;5;241m=\u001B[39m TimeoutSauce(connect\u001B[38;5;241m=\u001B[39mtimeout, read\u001B[38;5;241m=\u001B[39mtimeout)\n\u001B[0;32m 588\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m--> 589\u001B[0m resp \u001B[38;5;241m=\u001B[39m conn\u001B[38;5;241m.\u001B[39murlopen(\n\u001B[0;32m 590\u001B[0m method\u001B[38;5;241m=\u001B[39mrequest\u001B[38;5;241m.\u001B[39mmethod,\n\u001B[0;32m 591\u001B[0m url\u001B[38;5;241m=\u001B[39murl,\n\u001B[0;32m 592\u001B[0m body\u001B[38;5;241m=\u001B[39mrequest\u001B[38;5;241m.\u001B[39mbody,\n\u001B[0;32m 593\u001B[0m headers\u001B[38;5;241m=\u001B[39mrequest\u001B[38;5;241m.\u001B[39mheaders,\n\u001B[0;32m 594\u001B[0m redirect\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mFalse\u001B[39;00m,\n\u001B[0;32m 595\u001B[0m assert_same_host\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mFalse\u001B[39;00m,\n\u001B[0;32m 596\u001B[0m preload_content\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mFalse\u001B[39;00m,\n\u001B[0;32m 597\u001B[0m decode_content\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mFalse\u001B[39;00m,\n\u001B[0;32m 598\u001B[0m retries\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mmax_retries,\n\u001B[0;32m 599\u001B[0m timeout\u001B[38;5;241m=\u001B[39mtimeout,\n\u001B[0;32m 600\u001B[0m chunked\u001B[38;5;241m=\u001B[39mchunked,\n\u001B[0;32m 601\u001B[0m )\n\u001B[0;32m 603\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m (ProtocolError, \u001B[38;5;167;01mOSError\u001B[39;00m) \u001B[38;5;28;01mas\u001B[39;00m err:\n\u001B[0;32m 604\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mConnectionError\u001B[39;00m(err, request\u001B[38;5;241m=\u001B[39mrequest)\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\urllib3\\connectionpool.py:789\u001B[0m, in \u001B[0;36mHTTPConnectionPool.urlopen\u001B[1;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)\u001B[0m\n\u001B[0;32m 786\u001B[0m response_conn \u001B[38;5;241m=\u001B[39m conn \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m release_conn \u001B[38;5;28;01melse\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[0;32m 788\u001B[0m \u001B[38;5;66;03m# Make the request on the HTTPConnection object\u001B[39;00m\n\u001B[1;32m--> 789\u001B[0m response \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_make_request(\n\u001B[0;32m 790\u001B[0m conn,\n\u001B[0;32m 791\u001B[0m method,\n\u001B[0;32m 792\u001B[0m url,\n\u001B[0;32m 793\u001B[0m timeout\u001B[38;5;241m=\u001B[39mtimeout_obj,\n\u001B[0;32m 794\u001B[0m body\u001B[38;5;241m=\u001B[39mbody,\n\u001B[0;32m 795\u001B[0m headers\u001B[38;5;241m=\u001B[39mheaders,\n\u001B[0;32m 796\u001B[0m chunked\u001B[38;5;241m=\u001B[39mchunked,\n\u001B[0;32m 797\u001B[0m retries\u001B[38;5;241m=\u001B[39mretries,\n\u001B[0;32m 798\u001B[0m response_conn\u001B[38;5;241m=\u001B[39mresponse_conn,\n\u001B[0;32m 799\u001B[0m preload_content\u001B[38;5;241m=\u001B[39mpreload_content,\n\u001B[0;32m 800\u001B[0m decode_content\u001B[38;5;241m=\u001B[39mdecode_content,\n\u001B[0;32m 801\u001B[0m \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mresponse_kw,\n\u001B[0;32m 802\u001B[0m )\n\u001B[0;32m 804\u001B[0m \u001B[38;5;66;03m# Everything went great!\u001B[39;00m\n\u001B[0;32m 805\u001B[0m clean_exit \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mTrue\u001B[39;00m\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\urllib3\\connectionpool.py:536\u001B[0m, in \u001B[0;36mHTTPConnectionPool._make_request\u001B[1;34m(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)\u001B[0m\n\u001B[0;32m 534\u001B[0m \u001B[38;5;66;03m# Receive the response from the server\u001B[39;00m\n\u001B[0;32m 535\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m--> 536\u001B[0m response \u001B[38;5;241m=\u001B[39m conn\u001B[38;5;241m.\u001B[39mgetresponse()\n\u001B[0;32m 537\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m (BaseSSLError, \u001B[38;5;167;01mOSError\u001B[39;00m) \u001B[38;5;28;01mas\u001B[39;00m e:\n\u001B[0;32m 538\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_raise_timeout(err\u001B[38;5;241m=\u001B[39me, url\u001B[38;5;241m=\u001B[39murl, timeout_value\u001B[38;5;241m=\u001B[39mread_timeout)\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\urllib3\\connection.py:464\u001B[0m, in \u001B[0;36mHTTPConnection.getresponse\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m 461\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mresponse\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m HTTPResponse\n\u001B[0;32m 463\u001B[0m \u001B[38;5;66;03m# Get the response from http.client.HTTPConnection\u001B[39;00m\n\u001B[1;32m--> 464\u001B[0m httplib_response \u001B[38;5;241m=\u001B[39m \u001B[38;5;28msuper\u001B[39m()\u001B[38;5;241m.\u001B[39mgetresponse()\n\u001B[0;32m 466\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[0;32m 467\u001B[0m assert_header_parsing(httplib_response\u001B[38;5;241m.\u001B[39mmsg)\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\http\\client.py:1428\u001B[0m, in \u001B[0;36mHTTPConnection.getresponse\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m 1426\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[0;32m 1427\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m-> 1428\u001B[0m response\u001B[38;5;241m.\u001B[39mbegin()\n\u001B[0;32m 1429\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mConnectionError\u001B[39;00m:\n\u001B[0;32m 1430\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mclose()\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\http\\client.py:331\u001B[0m, in \u001B[0;36mHTTPResponse.begin\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m 329\u001B[0m \u001B[38;5;66;03m# read until we get a non-100 response\u001B[39;00m\n\u001B[0;32m 330\u001B[0m \u001B[38;5;28;01mwhile\u001B[39;00m \u001B[38;5;28;01mTrue\u001B[39;00m:\n\u001B[1;32m--> 331\u001B[0m version, status, reason \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_read_status()\n\u001B[0;32m 332\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m status \u001B[38;5;241m!=\u001B[39m CONTINUE:\n\u001B[0;32m 333\u001B[0m \u001B[38;5;28;01mbreak\u001B[39;00m\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\http\\client.py:292\u001B[0m, in \u001B[0;36mHTTPResponse._read_status\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m 291\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21m_read_status\u001B[39m(\u001B[38;5;28mself\u001B[39m):\n\u001B[1;32m--> 292\u001B[0m line \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mstr\u001B[39m(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mfp\u001B[38;5;241m.\u001B[39mreadline(_MAXLINE \u001B[38;5;241m+\u001B[39m \u001B[38;5;241m1\u001B[39m), \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124miso-8859-1\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n\u001B[0;32m 293\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mlen\u001B[39m(line) \u001B[38;5;241m>\u001B[39m _MAXLINE:\n\u001B[0;32m 294\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m LineTooLong(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mstatus line\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\socket.py:708\u001B[0m, in \u001B[0;36mSocketIO.readinto\u001B[1;34m(self, b)\u001B[0m\n\u001B[0;32m 706\u001B[0m \u001B[38;5;28;01mwhile\u001B[39;00m \u001B[38;5;28;01mTrue\u001B[39;00m:\n\u001B[0;32m 707\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m--> 708\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_sock\u001B[38;5;241m.\u001B[39mrecv_into(b)\n\u001B[0;32m 709\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m timeout:\n\u001B[0;32m 710\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_timeout_occurred \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mTrue\u001B[39;00m\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\ssl.py:1252\u001B[0m, in \u001B[0;36mSSLSocket.recv_into\u001B[1;34m(self, buffer, nbytes, flags)\u001B[0m\n\u001B[0;32m 1248\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m flags \u001B[38;5;241m!=\u001B[39m \u001B[38;5;241m0\u001B[39m:\n\u001B[0;32m 1249\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\n\u001B[0;32m 1250\u001B[0m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mnon-zero flags not allowed in calls to recv_into() on \u001B[39m\u001B[38;5;132;01m%s\u001B[39;00m\u001B[38;5;124m\"\u001B[39m \u001B[38;5;241m%\u001B[39m\n\u001B[0;32m 1251\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m\u001B[38;5;18m__class__\u001B[39m)\n\u001B[1;32m-> 1252\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mread(nbytes, buffer)\n\u001B[0;32m 1253\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[0;32m 1254\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28msuper\u001B[39m()\u001B[38;5;241m.\u001B[39mrecv_into(buffer, nbytes, flags)\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\ssl.py:1104\u001B[0m, in \u001B[0;36mSSLSocket.read\u001B[1;34m(self, len, buffer)\u001B[0m\n\u001B[0;32m 1102\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[0;32m 1103\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m buffer \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[1;32m-> 1104\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_sslobj\u001B[38;5;241m.\u001B[39mread(\u001B[38;5;28mlen\u001B[39m, buffer)\n\u001B[0;32m 1105\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[0;32m 1106\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_sslobj\u001B[38;5;241m.\u001B[39mread(\u001B[38;5;28mlen\u001B[39m)\n",
"\u001B[1;31mKeyboardInterrupt\u001B[0m: "
]
}
],
"execution_count": 11
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-02-19T10:02:47.931067Z",
"start_time": "2025-02-19T10:02:47.742360Z"
}
},
"cell_type": "code",
"source": [
"import requests\n",
"import json\n",
"import pandas as pd\n",
"from tqdm import tqdm\n",
"import re\n",
"import time\n",
"\n",
"df = pd.DataFrame()\n",
"\n",
"for i in tqdm(range(1,100)):\n",
" url = 'https://shop-gateway.tuhu.cn/mkt-shop-order-read/order-list-query/order-list'\n",
"\n",
" headers = {\n",
" 'apiVersion': '1.0.0',\n",
" 'channel': 'S-SITE',\n",
" 'deviceId': '05c6720e-ca19-4d7a-908c-4d60d20b7059',\n",
" 'Content-Type': 'application/json;charset=UTF-8',\n",
" 'authorization': 'Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImhHeXFFYi0tZUFFYTExa2lhZGc4ZXBpSGU0VSIsInR5cCI6IkpXVCIsIng1dCI6ImhHeXFFYi0tZUFFYTExa2lhZGc4ZXBpSGU0VSJ9.eyJuYmYiOjE3Mzk5NTU0MzQsImV4cCI6MTczOTk1OTAzNCwiaXNzIjoiaHR0cHM6Ly9hY2Nlc3MudHVodS5jbiIsImF1ZCI6WyJodHRwczovL2FjY2Vzcy50dWh1LmNuL3Jlc291cmNlcyIsInNpdGVfcyIsInNpdGVfc2FwaSIsInNpdGVfc2hvcGFwaSIsInNpdGVfd29ya3Nob3BhcGkiLCJ5ZXd1YXBpIl0sImNsaWVudF9pZCI6InNob3AudHVodS5jbiIsInN1YiI6IjA4ZGEyN2ZlNjQyYzQ5YmU4MGUxYzUwMjhlMzc3ZTkyIiwiYXV0aF90aW1lIjoxNzM5OTU1NDM0LCJpZHAiOiJUZWNobmljaWFuIiwibmFtZSI6IuWImOmTgeWGmyIsImlkIjo1NDIxNzgsInBob25lX251bWJlciI6IjEzMDE1MDYzOTk5IiwiYWNjb3VudF9sZXZlbCI6MTAsInNjb3BlIjpbIm9wZW5pZCIsIm5hbWUiLCJzaXRlX3MiLCJzaXRlX3NhcGkiLCJzaXRlX3Nob3BhcGkiLCJzaXRlX3dvcmtzaG9wYXBpIiwieWV3dWFwaSIsIm9mZmxpbmVfYWNjZXNzIl0sImFtciI6WyJUZWNobmljaWFuIl19.kLvdR8MgbfAOk02PRoXS7ldBiBdb3XYm5VCCt8y0IkslaRWGF60q6xO5rCyz0Dht6jJAM_7W12SYZfurWq3WQVSddGHviyxRO7AN4nyll6fJmIfjb2gSE9NE5zU2fFFv7oK2rTGlO6HLZhWLPu4lgBIjF_86RCbEkRZYO_4FQoGO_MlCZ-9wfEMlfneLnnwDb9vbz9iyS7gtFPCOrlmYzs6zDfJ4HtyJWiu1q6kGHaIl9-ouyJHpTIuAuYFDPv4wHsWEf8Lkdb4RpnEGcFjjlpsQ2--kgXbppF0QD_2_ZMDzuBii6AYzeh0zXWhgYlDJC3Rm6JFUbZk0cjOWKjKRIA',\n",
" #需要经常更换\n",
" 'authtype': 'oidc',\n",
" 'origin': 'https://shop.tuhu.cn',\n",
" 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0'\n",
" }\n",
"\n",
" json = {\"apiVersion\": \"1.0.0\", \"channel\": \"S-SITE\", \"deviceId\": \"05c6720e-ca19-4d7a-908c-4d60d20b7059\",\n",
" \"businessType\": 14, \"shopId\": 100727, \"generalOrderExtendRequest\": {\"pid\": \"\", \"productName\": \"\"},\n",
" \"productName\": \"\", \"pid\": \"\", \"deliveryType\": \"\", \"deliveryStatus\": \"\", \"containCarPro\": \"\", \"orderNo\": \"\",\n",
" \"carPlate\": \"\", \"orderChannel\": \"\", \"installType\": \"\", \"payMethod\": \"\", \"userTel\": \"\", \"orderStatus\": \"\",\n",
" \"payStatus\": \"\", \"installStatus\": \"\", \"orderType\": \"\", \"refNo\": \"\", \"relationRec\": 0, \"money\": \"\",\n",
" \"page\": i, \"size\": 20}\n",
"\n",
" response = requests.post(url, headers=headers, json=json)\n",
" data = response.json()\n",
" # print(data)\n",
" # break\n",
" order_list = data.get('data', {}).get('results', [])\n",
" for order in order_list:\n",
" order_no = order.get('orderBase', '').get('orderNo', '')\n",
" # print(order_no)\n",
" userId = order.get('orderUsers', {}).get('userId', '')\n",
" orderDatetime = order.get('orderBase', {}).get('orderDatetime', '')\n",
" sumMoney = order.get('orderBase', {}).get('sumMoney', '')\n",
" # print(userId)\n",
"\n",
" # match = re.search(r'TH(\\d+)', order_no)\n",
" # if match:\n",
" # order_no = match.group(1)\n",
" # else:\n",
" # order_no = order_no\n",
" # detail_url = f'https://shop-gateway.tuhu.cn/cl-bff-shop-sale/s-site/order/get-order-detail'\n",
" # \n",
" # detail_json = {\"apiVersion\": \"1.0.0\", \"channel\": \"S-SITE\", \"deviceId\": userId,\n",
" # \"orderId\": order_no}\n",
" # detail_response = requests.post(detail_url, headers=headers, json=detail_json)\n",
" # detail_data = detail_response.json()\n",
" # # print(detail_data)\n",
" # \n",
" # order_base_info = detail_data.get('data', {}).get('orderBaseInfo', {})\n",
" # payment_info = detail_data.get('data', {}).get('paymentInfo', {})\n",
" # commodity_items = detail_data.get('data', {}).get('productList', {}).get('commodityItem', [])\n",
" # service_items = detail_data.get('data', {}).get('productList', {}).get('serviceItem', [])\n",
" # \n",
" # \n",
" # for commodity in commodity_items:\n",
" # record = {**order_base_info, **payment_info, **{f'commodity_{k}': v for k, v in commodity.items()}}\n",
" # records.append(record)\n",
" # \n",
" # # 遍历serviceItem中的每一个服务项\n",
" # for service in service_items:\n",
" # record = {**order_base_info, **payment_info, **{f'service_{k}': v for k, v in service.items()}}\n",
" # records.append(record)\n",
" records = []\n",
" \n",
" records.append({'order_no':order_no,'userId': userId,'orderDatetime':orderDatetime,\"sumMoney\":sumMoney})\n",
" # headers = ['order_no','userId','orderDatetime']\n",
" # records.columns = headers\n",
" # df = pd.DataFrame(records)\n",
" df = pd.concat([df, pd.DataFrame(records)], ignore_index=True)\n",
" # print(df)\n",
"\n",
" # time.sleep(0.5)\n",
"df.to_excel(fr'D:\\Idea Project\\F6+宜搭+其它(1)\\new\\文件输出\\途虎养车历史维修记录创建时间11.xlsx', index=False)\n"
],
"id": "93f4b865c7ea5e40",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
" 0%| | 0/99 [00:00<?, ?it/s]\n"
]
},
{
"ename": "JSONDecodeError",
"evalue": "Expecting value: line 1 column 1 (char 0)",
"output_type": "error",
"traceback": [
"\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
"\u001B[1;31mJSONDecodeError\u001B[0m Traceback (most recent call last)",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\requests\\models.py:974\u001B[0m, in \u001B[0;36mResponse.json\u001B[1;34m(self, **kwargs)\u001B[0m\n\u001B[0;32m 973\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m--> 974\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m complexjson\u001B[38;5;241m.\u001B[39mloads(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mtext, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n\u001B[0;32m 975\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m JSONDecodeError \u001B[38;5;28;01mas\u001B[39;00m e:\n\u001B[0;32m 976\u001B[0m \u001B[38;5;66;03m# Catch JSON-related errors and raise as requests.JSONDecodeError\u001B[39;00m\n\u001B[0;32m 977\u001B[0m \u001B[38;5;66;03m# This aliases json.JSONDecodeError and simplejson.JSONDecodeError\u001B[39;00m\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\json\\__init__.py:346\u001B[0m, in \u001B[0;36mloads\u001B[1;34m(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)\u001B[0m\n\u001B[0;32m 343\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m (\u001B[38;5;28mcls\u001B[39m \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;129;01mand\u001B[39;00m object_hook \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;129;01mand\u001B[39;00m\n\u001B[0;32m 344\u001B[0m parse_int \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;129;01mand\u001B[39;00m parse_float \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;129;01mand\u001B[39;00m\n\u001B[0;32m 345\u001B[0m parse_constant \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;129;01mand\u001B[39;00m object_pairs_hook \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;129;01mand\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m kw):\n\u001B[1;32m--> 346\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m _default_decoder\u001B[38;5;241m.\u001B[39mdecode(s)\n\u001B[0;32m 347\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mcls\u001B[39m \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\json\\decoder.py:337\u001B[0m, in \u001B[0;36mJSONDecoder.decode\u001B[1;34m(self, s, _w)\u001B[0m\n\u001B[0;32m 333\u001B[0m \u001B[38;5;250m\u001B[39m\u001B[38;5;124;03m\"\"\"Return the Python representation of ``s`` (a ``str`` instance\u001B[39;00m\n\u001B[0;32m 334\u001B[0m \u001B[38;5;124;03mcontaining a JSON document).\u001B[39;00m\n\u001B[0;32m 335\u001B[0m \n\u001B[0;32m 336\u001B[0m \u001B[38;5;124;03m\"\"\"\u001B[39;00m\n\u001B[1;32m--> 337\u001B[0m obj, end \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mraw_decode(s, idx\u001B[38;5;241m=\u001B[39m_w(s, \u001B[38;5;241m0\u001B[39m)\u001B[38;5;241m.\u001B[39mend())\n\u001B[0;32m 338\u001B[0m end \u001B[38;5;241m=\u001B[39m _w(s, end)\u001B[38;5;241m.\u001B[39mend()\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\json\\decoder.py:355\u001B[0m, in \u001B[0;36mJSONDecoder.raw_decode\u001B[1;34m(self, s, idx)\u001B[0m\n\u001B[0;32m 354\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mStopIteration\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m err:\n\u001B[1;32m--> 355\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m JSONDecodeError(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mExpecting value\u001B[39m\u001B[38;5;124m\"\u001B[39m, s, err\u001B[38;5;241m.\u001B[39mvalue) \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[0;32m 356\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m obj, end\n",
"\u001B[1;31mJSONDecodeError\u001B[0m: Expecting value: line 1 column 1 (char 0)",
"\nDuring handling of the above exception, another exception occurred:\n",
"\u001B[1;31mJSONDecodeError\u001B[0m Traceback (most recent call last)",
"Cell \u001B[1;32mIn[7], line 33\u001B[0m\n\u001B[0;32m 25\u001B[0m json \u001B[38;5;241m=\u001B[39m {\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mapiVersion\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m1.0.0\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mchannel\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mS-SITE\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mdeviceId\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m05c6720e-ca19-4d7a-908c-4d60d20b7059\u001B[39m\u001B[38;5;124m\"\u001B[39m,\n\u001B[0;32m 26\u001B[0m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mbusinessType\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;241m14\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mshopId\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;241m100727\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mgeneralOrderExtendRequest\u001B[39m\u001B[38;5;124m\"\u001B[39m: {\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mpid\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mproductName\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m},\n\u001B[0;32m 27\u001B[0m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mproductName\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mpid\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mdeliveryType\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mdeliveryStatus\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mcontainCarPro\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124morderNo\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m,\n\u001B[0;32m 28\u001B[0m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mcarPlate\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124morderChannel\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124minstallType\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mpayMethod\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124muserTel\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124morderStatus\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m,\n\u001B[0;32m 29\u001B[0m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mpayStatus\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124minstallStatus\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124morderType\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mrefNo\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mrelationRec\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;241m0\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mmoney\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m\"\u001B[39m,\n\u001B[0;32m 30\u001B[0m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mpage\u001B[39m\u001B[38;5;124m\"\u001B[39m: i, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124msize\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;241m20\u001B[39m}\n\u001B[0;32m 32\u001B[0m response \u001B[38;5;241m=\u001B[39m requests\u001B[38;5;241m.\u001B[39mpost(url, headers\u001B[38;5;241m=\u001B[39mheaders, json\u001B[38;5;241m=\u001B[39mjson)\n\u001B[1;32m---> 33\u001B[0m data \u001B[38;5;241m=\u001B[39m response\u001B[38;5;241m.\u001B[39mjson()\n\u001B[0;32m 34\u001B[0m \u001B[38;5;66;03m# print(data)\u001B[39;00m\n\u001B[0;32m 35\u001B[0m \u001B[38;5;66;03m# break\u001B[39;00m\n\u001B[0;32m 36\u001B[0m order_list \u001B[38;5;241m=\u001B[39m data\u001B[38;5;241m.\u001B[39mget(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mdata\u001B[39m\u001B[38;5;124m'\u001B[39m, {})\u001B[38;5;241m.\u001B[39mget(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mresults\u001B[39m\u001B[38;5;124m'\u001B[39m, [])\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\requests\\models.py:978\u001B[0m, in \u001B[0;36mResponse.json\u001B[1;34m(self, **kwargs)\u001B[0m\n\u001B[0;32m 974\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m complexjson\u001B[38;5;241m.\u001B[39mloads(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mtext, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n\u001B[0;32m 975\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m JSONDecodeError \u001B[38;5;28;01mas\u001B[39;00m e:\n\u001B[0;32m 976\u001B[0m \u001B[38;5;66;03m# Catch JSON-related errors and raise as requests.JSONDecodeError\u001B[39;00m\n\u001B[0;32m 977\u001B[0m \u001B[38;5;66;03m# This aliases json.JSONDecodeError and simplejson.JSONDecodeError\u001B[39;00m\n\u001B[1;32m--> 978\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m RequestsJSONDecodeError(e\u001B[38;5;241m.\u001B[39mmsg, e\u001B[38;5;241m.\u001B[39mdoc, e\u001B[38;5;241m.\u001B[39mpos)\n",
"\u001B[1;31mJSONDecodeError\u001B[0m: Expecting value: line 1 column 1 (char 0)"
]
}
],
"execution_count": 7
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}