Files
F6--/张阳脚本/竞品系统数据导出/优米系统导出.ipynb
T
2026-01-30 11:28:35 +08:00

170 lines
15 KiB
Plaintext

{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "## 会员卡明细导出",
"id": "1b14f94c5e74163b"
},
{
"cell_type": "code",
"id": "initial_id",
"metadata": {
"collapsed": true,
"ExecuteTime": {
"end_time": "2025-05-14T06:45:24.475273Z",
"start_time": "2025-05-14T06:44:16.062351Z"
}
},
"source": [
"import requests\n",
"from tqdm import tqdm\n",
"import pandas as pd\n",
"import time\n",
"\n",
"\n",
"url = f\"https://www.aibiyme.com/base-admin/memberCard/selectUserCardList\"\n",
"\n",
"headers = {\n",
" 'Accept': '*/*',\n",
" 'Accept-Encoding': 'gzip, deflate, br, zstd',\n",
" 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',\n",
" 'Connection': 'keep-alive',\n",
" 'Content-Length': '21', # 根据实际情况调整Content-Length\n",
" 'Content-Type': 'application/x-www-form-urlencoded',\n",
" 'Cookie': 'sid=e8ca5702-f938-437e-a37b-368088cdaff4',\n",
" 'Host': 'www.aibiyme.com',\n",
" 'Origin': 'https://www.aibiyme.com',\n",
" 'Referer': 'https://www.aibiyme.com/web-admin/erp/procurement.html',\n",
" 'Sec-Ch-Ua': '\"Chromium\";v=\"136\", \"Microsoft Edge\";v=\"136\", \"Not.A/Brand\";v=\"99\"',\n",
" 'Sec-Ch-Ua-Mobile': '?0',\n",
" 'Sec-Ch-Ua-Platform': '\"Windows\"',\n",
" 'Sec-Fetch-Dest': 'empty',\n",
" 'Sec-Fetch-Mode': 'cors',\n",
" 'Sec-Fetch-Site': 'same-origin',\n",
" 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0',\n",
" 'X-Requested-With': 'XMLHttpRequest'\n",
"}\n",
"all_data = []\n",
"\n",
"data = \"pageSize=10&pageNum=1\"\n",
"\n",
"# 获取总记录数\n",
"f_res = requests.post(url, data=data, headers=headers)\n",
"f_res.raise_for_status() # 检查请求是否成功\n",
"total = f_res.json().get(\"total\", 0)\n",
"print(total)\n",
"\n",
"for i in tqdm(range(1, total + 1)):\n",
" data = f\"pageSize=10&pageNum={i}\"\n",
" \n",
" res = requests.post(url, data=data, headers=headers)\n",
" res.raise_for_status()\n",
"\n",
" data_list = res.json().get(\"obj\", {}).get(\"pageData\", [])\n",
"\n",
" for item in data_list:\n",
" pk = item.get(\"pk\")\n",
" pk = int(pk)\n",
" if pk:\n",
" # 获取详细信息\n",
" pk_data = f\"cardPk={pk}\"\n",
" \n",
" detail_url = \"https://www.aibiyme.com/base-admin/memberCard/getCardInfoByPk\"\n",
" pk_res = requests.post(detail_url, data=pk_data, headers=headers)\n",
" pk_res.raise_for_status()\n",
"\n",
" detail_data = pk_res.json().get(\"obj\", {})\n",
" item.update(detail_data)\n",
"\n",
" # 处理卡片明细\n",
" card_details = detail_data.get(\"cardItemList\", [])\n",
" for card_detail in card_details:\n",
" item_copy = item.copy() # 创建副本避免修改原始数据\n",
" item_copy.update(card_detail)\n",
" all_data.append(item_copy)\n",
"\n",
"# 保存数据\n",
"if all_data:\n",
" pd.DataFrame(all_data).to_csv(\"./new/文件输出/会员卡明细.csv\", index=False)\n",
"else:\n",
" print(\"没有获取到任何数据\")\n"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"22\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 22/22 [01:06<00:00, 3.04s/it]\n"
]
},
{
"ename": "OSError",
"evalue": "Cannot save file into a non-existent directory: 'new\\文件输出'",
"output_type": "error",
"traceback": [
"\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
"\u001B[1;31mOSError\u001B[0m Traceback (most recent call last)",
"Cell \u001B[1;32mIn[34], line 70\u001B[0m\n\u001B[0;32m 68\u001B[0m \u001B[38;5;66;03m# 保存数据\u001B[39;00m\n\u001B[0;32m 69\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m all_data:\n\u001B[1;32m---> 70\u001B[0m pd\u001B[38;5;241m.\u001B[39mDataFrame(all_data)\u001B[38;5;241m.\u001B[39mto_csv(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m./new/文件输出/会员卡明细.csv\u001B[39m\u001B[38;5;124m\"\u001B[39m, index\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mFalse\u001B[39;00m)\n\u001B[0;32m 71\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[0;32m 72\u001B[0m \u001B[38;5;28mprint\u001B[39m(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m没有获取到任何数据\u001B[39m\u001B[38;5;124m\"\u001B[39m)\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:3967\u001B[0m, in \u001B[0;36mNDFrame.to_csv\u001B[1;34m(self, path_or_buf, sep, na_rep, float_format, columns, header, index, index_label, mode, encoding, compression, quoting, quotechar, lineterminator, chunksize, date_format, doublequote, escapechar, decimal, errors, storage_options)\u001B[0m\n\u001B[0;32m 3956\u001B[0m df \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(\u001B[38;5;28mself\u001B[39m, ABCDataFrame) \u001B[38;5;28;01melse\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mto_frame()\n\u001B[0;32m 3958\u001B[0m formatter \u001B[38;5;241m=\u001B[39m DataFrameFormatter(\n\u001B[0;32m 3959\u001B[0m frame\u001B[38;5;241m=\u001B[39mdf,\n\u001B[0;32m 3960\u001B[0m header\u001B[38;5;241m=\u001B[39mheader,\n\u001B[1;32m (...)\u001B[0m\n\u001B[0;32m 3964\u001B[0m decimal\u001B[38;5;241m=\u001B[39mdecimal,\n\u001B[0;32m 3965\u001B[0m )\n\u001B[1;32m-> 3967\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m DataFrameRenderer(formatter)\u001B[38;5;241m.\u001B[39mto_csv(\n\u001B[0;32m 3968\u001B[0m path_or_buf,\n\u001B[0;32m 3969\u001B[0m lineterminator\u001B[38;5;241m=\u001B[39mlineterminator,\n\u001B[0;32m 3970\u001B[0m sep\u001B[38;5;241m=\u001B[39msep,\n\u001B[0;32m 3971\u001B[0m encoding\u001B[38;5;241m=\u001B[39mencoding,\n\u001B[0;32m 3972\u001B[0m errors\u001B[38;5;241m=\u001B[39merrors,\n\u001B[0;32m 3973\u001B[0m compression\u001B[38;5;241m=\u001B[39mcompression,\n\u001B[0;32m 3974\u001B[0m quoting\u001B[38;5;241m=\u001B[39mquoting,\n\u001B[0;32m 3975\u001B[0m columns\u001B[38;5;241m=\u001B[39mcolumns,\n\u001B[0;32m 3976\u001B[0m index_label\u001B[38;5;241m=\u001B[39mindex_label,\n\u001B[0;32m 3977\u001B[0m mode\u001B[38;5;241m=\u001B[39mmode,\n\u001B[0;32m 3978\u001B[0m chunksize\u001B[38;5;241m=\u001B[39mchunksize,\n\u001B[0;32m 3979\u001B[0m quotechar\u001B[38;5;241m=\u001B[39mquotechar,\n\u001B[0;32m 3980\u001B[0m date_format\u001B[38;5;241m=\u001B[39mdate_format,\n\u001B[0;32m 3981\u001B[0m doublequote\u001B[38;5;241m=\u001B[39mdoublequote,\n\u001B[0;32m 3982\u001B[0m escapechar\u001B[38;5;241m=\u001B[39mescapechar,\n\u001B[0;32m 3983\u001B[0m storage_options\u001B[38;5;241m=\u001B[39mstorage_options,\n\u001B[0;32m 3984\u001B[0m )\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\pandas\\io\\formats\\format.py:1014\u001B[0m, in \u001B[0;36mDataFrameRenderer.to_csv\u001B[1;34m(self, path_or_buf, encoding, sep, columns, index_label, mode, compression, quoting, quotechar, lineterminator, chunksize, date_format, doublequote, escapechar, errors, storage_options)\u001B[0m\n\u001B[0;32m 993\u001B[0m created_buffer \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mFalse\u001B[39;00m\n\u001B[0;32m 995\u001B[0m csv_formatter \u001B[38;5;241m=\u001B[39m CSVFormatter(\n\u001B[0;32m 996\u001B[0m path_or_buf\u001B[38;5;241m=\u001B[39mpath_or_buf,\n\u001B[0;32m 997\u001B[0m lineterminator\u001B[38;5;241m=\u001B[39mlineterminator,\n\u001B[1;32m (...)\u001B[0m\n\u001B[0;32m 1012\u001B[0m formatter\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mfmt,\n\u001B[0;32m 1013\u001B[0m )\n\u001B[1;32m-> 1014\u001B[0m csv_formatter\u001B[38;5;241m.\u001B[39msave()\n\u001B[0;32m 1016\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m created_buffer:\n\u001B[0;32m 1017\u001B[0m \u001B[38;5;28;01massert\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(path_or_buf, StringIO)\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\pandas\\io\\formats\\csvs.py:251\u001B[0m, in \u001B[0;36mCSVFormatter.save\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m 247\u001B[0m \u001B[38;5;250m\u001B[39m\u001B[38;5;124;03m\"\"\"\u001B[39;00m\n\u001B[0;32m 248\u001B[0m \u001B[38;5;124;03mCreate the writer & save.\u001B[39;00m\n\u001B[0;32m 249\u001B[0m \u001B[38;5;124;03m\"\"\"\u001B[39;00m\n\u001B[0;32m 250\u001B[0m \u001B[38;5;66;03m# apply compression and byte/text conversion\u001B[39;00m\n\u001B[1;32m--> 251\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m get_handle(\n\u001B[0;32m 252\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mfilepath_or_buffer,\n\u001B[0;32m 253\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mmode,\n\u001B[0;32m 254\u001B[0m encoding\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mencoding,\n\u001B[0;32m 255\u001B[0m errors\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39merrors,\n\u001B[0;32m 256\u001B[0m compression\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mcompression,\n\u001B[0;32m 257\u001B[0m storage_options\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mstorage_options,\n\u001B[0;32m 258\u001B[0m ) \u001B[38;5;28;01mas\u001B[39;00m handles:\n\u001B[0;32m 259\u001B[0m \u001B[38;5;66;03m# Note: self.encoding is irrelevant here\u001B[39;00m\n\u001B[0;32m 260\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mwriter \u001B[38;5;241m=\u001B[39m csvlib\u001B[38;5;241m.\u001B[39mwriter(\n\u001B[0;32m 261\u001B[0m handles\u001B[38;5;241m.\u001B[39mhandle,\n\u001B[0;32m 262\u001B[0m lineterminator\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mlineterminator,\n\u001B[1;32m (...)\u001B[0m\n\u001B[0;32m 267\u001B[0m quotechar\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mquotechar,\n\u001B[0;32m 268\u001B[0m )\n\u001B[0;32m 270\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_save()\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: 'new\\文件输出'"
]
}
],
"execution_count": 34
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-05-14T06:47:28.647625Z",
"start_time": "2025-05-14T06:47:28.625811Z"
}
},
"cell_type": "code",
"source": [
"# 保存数据\n",
"if all_data:\n",
" pd.DataFrame(all_data).to_csv(r\"D:\\Idea Project\\F6+宜搭+其它(1)\\new\\文件输出\\会员卡明细.csv\", index=False)\n",
"else:\n",
" print(\"没有获取到任何数据\")"
],
"id": "584f989c494205d5",
"outputs": [],
"execution_count": 40
}
],
"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
}