{ "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 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..decorate..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 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 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 }