Files
F6--/其它系统脚本/大正人信息管理系统.ipynb
2026-01-30 11:28:35 +08:00

1259 lines
56 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 不同的门店修改 'departmentID' 荷载参数"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.卡列表"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"登录成功!\n",
"page:1 page:2 page:3 page:4 page:5 page:6 page:7 page:8 page:9 page:10 page:11 page:12 page:13 page:14 page:15 page:16 page:17 page:18 page:19 page:20 page:21 page:22 page:23 page:24 page:25 page:26 page:27 page:28 page:29 page:30 page:31 page:32 page:33 page:34 page:35 page:36 page:37 page:38 page:39 page:40 page:41 page:42 page:43 page:44 page:45 page:46 page:47 page:48 page:49 page:50 page:51 page:52 page:53 page:54 page:55 page:56 page:57 page:58 page:59 page:60 page:61 page:62 page:63 page:64 page:65 page:66 page:67 page:68 page:69 page:70 page:71 page:72 page:73 page:74 page:75 page:76 page:77 page:78 page:79 page:80 page:81 page:82 page:83 page:84 page:85 page:86 page:87 page:88 page:89 page:90 page:91 page:92 page:93 page:94 page:95 page:96 page:97 page:98 page:99 page:100 page:101 page:102 page:103 page:104 page:105 page:106 page:107 page:108 page:109 page:110 page:111 page:112 page:113 page:114 page:115 page:116 page:117 page:118 page:119 page:120 page:121 page:122 page:123 page:124 page:125 page:126 page:127 page:128 page:129 page:130 page:131 page:132 page:133 page:134 page:135 page:136 page:137 page:138 page:139 page:140 page:141 page:142 page:143 page:144 page:145 page:146 page:147 page:148 page:149 page:150 page:151 page:152 page:153 page:154 page:155 page:156 page:157 page:158 page:159 page:160 page:161 page:162 page:163 page:164 page:165 page:166 page:167 page:168 page:169 page:170 page:171 page:172 page:173 page:174 page:175 page:176 page:177 page:178 page:179 page:180 page:181 page:182 page:183 page:184 page:185 page:186 page:187 page:188 page:189 page:190 page:191 page:192 page:193 page:194 page:195 page:196 page:197 page:198 page:199 page:200 "
]
}
],
"source": [
"import requests\n",
"import pandas as pd\n",
"import time\n",
"from selenium import webdriver\n",
"from selenium.webdriver.common.keys import Keys\n",
"from selenium.webdriver.support import expected_conditions as EC\n",
"from selenium.webdriver.common.by import By\n",
"from selenium.webdriver.support.wait import WebDriverWait\n",
"import numpy as np\n",
"from urllib.parse import unquote\n",
"\n",
"\n",
"def get_cookie_dict():\n",
" \"\"\" 使用selenium 获取最新的cookie \"\"\"\n",
"\n",
" options = webdriver.ChromeOptions()\n",
" options.add_argument('headless')\n",
"\n",
" name = '徐红艳'\n",
" password = '19850605'\n",
"\n",
" driver = webdriver.Chrome(executable_path=r\"C:\\Users\\admin\\Desktop\\Python脚本\\chromedriver.exe\", options=options)\n",
" # driver = webdriver.Chrome(options=options) # 不显示浏览器窗口\n",
" driver.maximize_window() # 最大化浏览器窗口\n",
" # 打开网页 进行登录\n",
" driver.get('http://cd.dazhengren.com:9006/')\n",
"\n",
" # 在输入框中输入账号和密码\n",
" username = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//input[@id=\"uname\"]')))\n",
" pwd = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//input[@id=\"upass\"]')))\n",
" enter = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//button[@type=\"submit\"]')))\n",
"\n",
" username.clear()\n",
" username.send_keys(name)\n",
" pwd.clear()\n",
" pwd.send_keys(password)\n",
" enter.click()\n",
" time.sleep(1)\n",
" print('登录成功!')\n",
" cookies_list = driver.get_cookies()\n",
"\n",
" new_cookies_list = [] # 只包含 name 和 value key 的cookie\n",
" for cookie in cookies_list:\n",
" new_cookies_list.append([cookie.get('name'), unquote(cookie.get('value'))])\n",
"\n",
" # 将cookies 组合成字符串 name=value形式\n",
" new_cookies_list = [f\"{item[0]}={item[-1]}\" for item in new_cookies_list]\n",
" new_cookies_list = [item.encode('utf-8').decode('latin-1') for item in new_cookies_list if len(item)>256]\n",
" cookies = '; '.join(new_cookies_list)\n",
" cookies = {item.split('=')[0]: item.split('=')[1] for item in cookies.split('; ')}\n",
"\n",
" return cookies\n",
"\n",
"\n",
"# 获取列表页API\n",
"list_api = \"http://cd.dazhengren.com:9006/FMS/CardListByType\"\n",
"\n",
"# cookies = 'dzrEmployeeNameCookie=徐红艳; dzrkbs=8E97058EFB55D58541760AD7011841E0C7CA617D19FA579ADB6DF0D7F5516970448E2F5064B914801F7600CB3FB4C931BCADC22247FD8E19675E15A65CC3DA1FEB46B4ED8CDB8112DE6EEC530BE4EAE48D2A6DB92044C650B9E8C03DDF123D26314FC66F1E183901B113FF20115B17E4B3E7000D38A829A0ED8265700FE16C5AA5631EA8B5AD5B877B3B764846F7AC9B36ADF09627788FB83F00276CA3B26BF3C2B1E68E679622442464ACCA21D9785594B830CDEE205131D5A6382B3284F326B0B5FD3A8477DBA136364BCB1625D9045B5FAD5437CE95EB03B8546B34114D00CC1FC2125945D1E037D7D44ABB2C48188DB2427E2CA94236B63E5878EF99C701EB1E2223B95C6D6F87A0EC85A610E720'\n",
"# cookies = cookies.encode('utf-8').decode('latin-1')\n",
"# cookies={item.split('=')[0]:item.split('=')[1] for item in cookies.split('; ')}\n",
"\n",
"cookies = get_cookie_dict()\n",
" \n",
"# 秦皇岛黄河大道店 departmentID: 73 1\n",
"# 秦皇岛站前店 departmentID: 72 1\n",
"# 霸州店 departmentID: 2247 1\n",
"\n",
"# 秦皇岛友谊路店,departmentID: 2238 1\n",
"# 秦皇岛西港路店, departmentID: 74 1\n",
"# 秦皇岛和平店, departmentID: 2252 1\n",
"# 秦皇岛高速口店, departmentID: 2254 1\n",
"# 秦皇岛海滨路店, departmentID: 2239 1\n",
"# 廊坊胜芳店 departmentID: 2229 1\n",
"\n",
"TOTALPAGES = 200\n",
"departmentID = 72\n",
"result_data = []\n",
"\n",
"for page in range(1, TOTALPAGES+1):\n",
" # time.sleep(random.randint(1,5))\n",
" try:\n",
" print(f'page:{page}', end=' ')\n",
"\n",
" list_api_payload = {\n",
" 'typeid': 0,\n",
" 'start': None,\n",
" 'end': None,\n",
" 'CardNum': None,\n",
" 'departmentID': departmentID,\n",
" 'ipage': page\n",
" }\n",
"\n",
" headers = {\n",
" 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36 Edg/98.0.1108.50',\n",
" 'Referer': 'http://cd.dazhengren.com: 9006/FMS/GetCardListByType'\n",
" }\n",
"\n",
" while True:\n",
" try:\n",
" list_res = requests.post(list_api, data=list_api_payload, cookies=cookies)\n",
" list_data = list_res.json().get('jsdata')\n",
" break\n",
" except:\n",
" cookies = get_cookie_dict()\n",
" print(cookies)\n",
" continue\n",
"\n",
" for row in list_data:\n",
" data = {\n",
" '卡类型': row.get('MemberCardTypeName'),\n",
" '卡号': row.get('CardNum'),\n",
" '客户名称': row.get('CustomerName'),\n",
" '车牌号码': row.get('CarNum'),\n",
" '开卡时间': row.get('InsertDate'),\n",
" '开卡店面': row.get('DepartmentName'),\n",
" '状态': row.get('ostate'),\n",
" '售卡金额': row.get('skPrice'),\n",
" '开卡金额': row.get('Price'),\n",
" '余额': row.get('balance'),\n",
" '备注': row.get('remarks'),\n",
" }\n",
"\n",
" result_data.append(data)\n",
" except Exception as e:\n",
" print(e)\n",
" print('出错了', end=' ')\n",
" break\n",
"\n",
" # break\n",
"\n",
"df_list = pd.DataFrame(result_data)\n",
"df_list.head()\n",
"df_list.to_excel(r'C:\\Users\\admin\\Desktop\\1111111111111秦皇岛站前店路店,,.xlsx')\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"df_list.to_excel(r'C:\\Users\\admin\\Desktop\\品牌零件号查询云材料1111111111.xlsx')"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['售出', '在库'], dtype=object)"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_list['状态'].unique()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"非售出笔数:63\n",
"售出笔数:257\n",
"总笔数:320\n"
]
}
],
"source": [
"print(f\"非售出笔数:{df_list.loc[df_list['状态']!='售出',:].shape[0]}\\n售出笔数:{df_list.loc[df_list['状态']=='售出',:].shape[0]}\\n总笔数:{df_list.shape[0]}\")\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"售卡金额:124990,开卡金额:0,余额:0\n"
]
}
],
"source": [
"df_saleOut = df_list.loc[df_list['状态']=='售出',:] # 售出的卡\n",
"print(f\"售卡金额:{df_saleOut['售卡金额'].sum()},开卡金额:{df_saleOut['开卡金额'].sum()},余额:{df_list['余额'].sum()}\")\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"df_list.to_excel('卡列表_廊坊胜芳店.xlsx',index=False)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2.工单历史 -- 接口(postman 生成)"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>施工单编号</th>\n",
" <th>服务门店</th>\n",
" <th>客户名称</th>\n",
" <th>联系电话</th>\n",
" <th>车牌号</th>\n",
" <th>保养时间</th>\n",
" <th>实收金额</th>\n",
" <th>车型</th>\n",
" <th>配件</th>\n",
" <th>服务</th>\n",
" <th>行驶里程</th>\n",
" <th>下次保养</th>\n",
" <th>派工单查看</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>419</th>\n",
" <td>SGDXC201806020849400963</td>\n",
" <td>霸州店</td>\n",
" <td>测试号</td>\n",
" <td>13103128888</td>\n",
" <td>冀FFFFFH</td>\n",
" <td>2018-06-02 08:47:56</td>\n",
" <td>0.0</td>\n",
" <td>别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版</td>\n",
" <td></td>\n",
" <td>洗车;</td>\n",
" <td>0.0</td>\n",
" <td>15000</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>420</th>\n",
" <td>SGDXC201806020849090157</td>\n",
" <td>霸州店</td>\n",
" <td>测试号</td>\n",
" <td>13103128888</td>\n",
" <td>冀FFFFFH</td>\n",
" <td>2018-06-02 08:47:24</td>\n",
" <td>0.0</td>\n",
" <td>别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版</td>\n",
" <td></td>\n",
" <td>洗车;</td>\n",
" <td>0.0</td>\n",
" <td>15000</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>421</th>\n",
" <td>SGDXC201806020848352735</td>\n",
" <td>霸州店</td>\n",
" <td>测试号</td>\n",
" <td>13103128888</td>\n",
" <td>冀FFFFFH</td>\n",
" <td>2018-06-02 08:46:50</td>\n",
" <td>0.0</td>\n",
" <td>别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版</td>\n",
" <td></td>\n",
" <td>洗车;</td>\n",
" <td>0.0</td>\n",
" <td>15000</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>422</th>\n",
" <td>SGDXC201806020847002869</td>\n",
" <td>霸州店</td>\n",
" <td>测试号</td>\n",
" <td>13103128888</td>\n",
" <td>冀FFFFFH</td>\n",
" <td>2018-06-02 08:45:15</td>\n",
" <td>0.0</td>\n",
" <td>别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版</td>\n",
" <td></td>\n",
" <td>洗车;</td>\n",
" <td>0.0</td>\n",
" <td>15000</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>423</th>\n",
" <td>SGDXC201806020845021548</td>\n",
" <td>霸州店</td>\n",
" <td>测试号</td>\n",
" <td>13103128888</td>\n",
" <td>冀FFFFFH</td>\n",
" <td>2018-06-02 08:43:17</td>\n",
" <td>0.0</td>\n",
" <td>别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版</td>\n",
" <td></td>\n",
" <td>洗车;</td>\n",
" <td>0.0</td>\n",
" <td>15000</td>\n",
" <td></td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 施工单编号 服务门店 客户名称 联系电话 车牌号 \\\n",
"419 SGDXC201806020849400963 霸州店 测试号 13103128888 冀FFFFFH \n",
"420 SGDXC201806020849090157 霸州店 测试号 13103128888 冀FFFFFH \n",
"421 SGDXC201806020848352735 霸州店 测试号 13103128888 冀FFFFFH \n",
"422 SGDXC201806020847002869 霸州店 测试号 13103128888 冀FFFFFH \n",
"423 SGDXC201806020845021548 霸州店 测试号 13103128888 冀FFFFFH \n",
"\n",
" 保养时间 实收金额 车型 配件 \\\n",
"419 2018-06-02 08:47:56 0.0 别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版 \n",
"420 2018-06-02 08:47:24 0.0 别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版 \n",
"421 2018-06-02 08:46:50 0.0 别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版 \n",
"422 2018-06-02 08:45:15 0.0 别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版 \n",
"423 2018-06-02 08:43:17 0.0 别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版 \n",
"\n",
" 服务 行驶里程 下次保养 派工单查看 \n",
"419 洗车; 0.0 15000 \n",
"420 洗车; 0.0 15000 \n",
"421 洗车; 0.0 15000 \n",
"422 洗车; 0.0 15000 \n",
"423 洗车; 0.0 15000 "
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import requests\n",
"import json\n",
"\n",
"url = \"http://cd.dazhengren.com:9006/CRM/WorkOrderList\"\n",
"\n",
"\n",
"headers = {\n",
" 'Cookie': 'dzrEmployeeNameCookie=%e5%be%90%e7%ba%a2%e8%89%b3; dzrkbs=4D1D9EB5DA9D7A1FF5BEF7000205FA1CCE44693DFB531C3C16B64397408255B9586738090A1B817E58673A5B7AA22DEA91E6DBF20F6659CF5220A2536D0549923C0BC8E02119B38BE8D5EC461806A0840F77042D395E5EDA7820B564BDE2B6A22A37F1C6F8A18349B80DC9DDB2DDC418246E5038ECA3824D633F624B68BA9C87A85D8687D1E1EE89247E46A6AD62649A8874AC960D92186C3AD24B559FB6E3C9ED823BB5ADD534BC113699FC2FE1B58187ECFC1D447A4B5502180C8273F04097598E509FF9C3B6EA100CF00144207066212320AE615EF0C1F7040A53D1AEC581997BAB0D90F331B78F93CA31933E97A58B6FBFBCF271A51CA8DC7AE91FC7B9F2FE9639EAAAFED3702CF21256AB00F95A',\n",
" 'Content-Type': 'application/x-www-form-urlencoded'\n",
"}\n",
"\n",
"result = []\n",
"\n",
"# PAGES = 2939\n",
"# DepartmentID = 73 # 秦皇岛黄河大道店\n",
"# PAGES = 3343\n",
"# DepartmentID = 72 # 秦皇岛站前店\n",
"\n",
"PAGES = 1522\n",
"DepartmentID = 2247 # 霸州店\n",
"\n",
"\n",
"for page in range(1494,PAGES+1):\n",
" # time.sleep(2)\n",
" payload = f'iCurrPage={page}&start=&end=&DepartmentID={DepartmentID}&CustomerPhone=&CommodityTypeID=&SeviceItemTypeID=&ServiceItemNum=&VisitType=1&settleType=0&CarNum=&WorkOrderNum=&Type=2'\n",
"\n",
" response = requests.request(\"POST\", url, headers=headers, data=payload)\n",
"\n",
" data = json.loads(response.json().get('jsdata'))\n",
" for item in data:\n",
" info = {\n",
" '施工单编号': item.get('WorkOrderNum'),\n",
" '服务门店': item.get('DepartmentName'),\n",
" '客户名称': item.get('CustomerName'),\n",
" '联系电话': item.get('CustomerPhone'),\n",
" '车牌号': item.get('CarNum'),\n",
" '保养时间': item.get('InsertDate'),\n",
" '实收金额': item.get('Actualreceivable'),\n",
" '车型': item.get('CarName'),\n",
" '配件': item.get('CommodityAll'),\n",
" '服务': item.get('ServiceItemAll'),\n",
" '行驶里程': item.get('Mileage'),\n",
" '下次保养': item.get('Mileageyj'),\n",
" '派工单查看': item.get('KeyPath'),\n",
" }\n",
"\n",
" result.append(info)\n",
"\n",
"\n",
" # break\n",
"\n",
"df_result = pd.DataFrame(result)\n",
"df_result.tail()\n"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1522, 424)"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"page,len(result)"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>施工单编号</th>\n",
" <th>服务门店</th>\n",
" <th>客户名称</th>\n",
" <th>联系电话</th>\n",
" <th>车牌号</th>\n",
" <th>保养时间</th>\n",
" <th>实收金额</th>\n",
" <th>车型</th>\n",
" <th>配件</th>\n",
" <th>服务</th>\n",
" <th>行驶里程</th>\n",
" <th>下次保养</th>\n",
" <th>派工单查看</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>SGD201806180954574117</td>\n",
" <td>霸州店</td>\n",
" <td>徐龙龙</td>\n",
" <td>13722629066</td>\n",
" <td>冀R182G6</td>\n",
" <td>2018-06-18 10:37:10</td>\n",
" <td>40.0</td>\n",
" <td>大众POLO 上市年份[2014年5月]生产年份[2015] 1.6 手自一体 舒适版</td>\n",
" <td>浩天机油滤清器HTJ-8004;</td>\n",
" <td></td>\n",
" <td>60746.0</td>\n",
" <td>65746</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>SGD201806180939158819</td>\n",
" <td>霸州店</td>\n",
" <td>先生</td>\n",
" <td>13932625626</td>\n",
" <td>冀RULL39</td>\n",
" <td>2018-06-18 09:37:44</td>\n",
" <td>0.0</td>\n",
" <td>大众朗逸 上市年份[2011年8月]生产年份[2012] 1.6 手动 品悠版</td>\n",
" <td></td>\n",
" <td>打蜡;镀膜;镀晶;</td>\n",
" <td>5000.0</td>\n",
" <td>4000</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>SGD201806180934044712</td>\n",
" <td>霸州店</td>\n",
" <td>杨</td>\n",
" <td>13784829111</td>\n",
" <td>冀RYC899</td>\n",
" <td>2018-06-18 09:37:36</td>\n",
" <td>0.0</td>\n",
" <td>别克凯越 上市年份[2005年11月]生产年份[2005] 1.6 手动 LX 基本版</td>\n",
" <td></td>\n",
" <td>打蜡;</td>\n",
" <td>141381.0</td>\n",
" <td>141381</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>SGD201806180929106029</td>\n",
" <td>霸州店</td>\n",
" <td>赵亚征</td>\n",
" <td>18630677774</td>\n",
" <td>冀RCA888</td>\n",
" <td>2018-06-18 09:37:36</td>\n",
" <td>110.0</td>\n",
" <td>丰田普拉多 上市年份[2007年1月]生产年份[2009] 4.0 手自一体 GX</td>\n",
" <td>嘉实多金嘉护10W40 4L SN;博世机油滤清器0986AF0060;博世空气滤清器098...</td>\n",
" <td>更换机油;更换机油滤芯;</td>\n",
" <td>52629.0</td>\n",
" <td>57629</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>SGD201806180926186948</td>\n",
" <td>霸州店</td>\n",
" <td>徐龙龙</td>\n",
" <td>13722629066</td>\n",
" <td>冀R182G6</td>\n",
" <td>2018-06-18 09:37:36</td>\n",
" <td>62.0</td>\n",
" <td>大众POLO 上市年份[2014年5月]生产年份[2015] 1.6 手自一体 舒适版</td>\n",
" <td>嘉实多金嘉护10W40 4L SN;博世机油滤清器0986AF0161;博世空气滤清器098...</td>\n",
" <td>更换机油;更换机油滤芯;</td>\n",
" <td>60746.0</td>\n",
" <td>65746</td>\n",
" <td></td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 施工单编号 服务门店 客户名称 联系电话 车牌号 保养时间 \\\n",
"0 SGD201806180954574117 霸州店 徐龙龙 13722629066 冀R182G6 2018-06-18 10:37:10 \n",
"1 SGD201806180939158819 霸州店 先生 13932625626 冀RULL39 2018-06-18 09:37:44 \n",
"2 SGD201806180934044712 霸州店 杨 13784829111 冀RYC899 2018-06-18 09:37:36 \n",
"3 SGD201806180929106029 霸州店 赵亚征 18630677774 冀RCA888 2018-06-18 09:37:36 \n",
"4 SGD201806180926186948 霸州店 徐龙龙 13722629066 冀R182G6 2018-06-18 09:37:36 \n",
"\n",
" 实收金额 车型 \\\n",
"0 40.0 大众POLO 上市年份[2014年5月]生产年份[2015] 1.6 手自一体 舒适版 \n",
"1 0.0 大众朗逸 上市年份[2011年8月]生产年份[2012] 1.6 手动 品悠版 \n",
"2 0.0 别克凯越 上市年份[2005年11月]生产年份[2005] 1.6 手动 LX 基本版 \n",
"3 110.0 丰田普拉多 上市年份[2007年1月]生产年份[2009] 4.0 手自一体 GX \n",
"4 62.0 大众POLO 上市年份[2014年5月]生产年份[2015] 1.6 手自一体 舒适版 \n",
"\n",
" 配件 服务 行驶里程 \\\n",
"0 浩天机油滤清器HTJ-8004; 60746.0 \n",
"1 打蜡;镀膜;镀晶; 5000.0 \n",
"2 打蜡; 141381.0 \n",
"3 嘉实多金嘉护10W40 4L SN;博世机油滤清器0986AF0060;博世空气滤清器098... 更换机油;更换机油滤芯; 52629.0 \n",
"4 嘉实多金嘉护10W40 4L SN;博世机油滤清器0986AF0161;博世空气滤清器098... 更换机油;更换机油滤芯; 60746.0 \n",
"\n",
" 下次保养 派工单查看 \n",
"0 65746 \n",
"1 4000 \n",
"2 141381 \n",
"3 57629 \n",
"4 65746 "
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_result = pd.DataFrame(result)\n",
"df_result.head()\n"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>施工单编号</th>\n",
" <th>服务门店</th>\n",
" <th>客户名称</th>\n",
" <th>联系电话</th>\n",
" <th>车牌号</th>\n",
" <th>保养时间</th>\n",
" <th>实收金额</th>\n",
" <th>车型</th>\n",
" <th>配件</th>\n",
" <th>服务</th>\n",
" <th>行驶里程</th>\n",
" <th>下次保养</th>\n",
" <th>派工单查看</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>419</th>\n",
" <td>SGDXC201806020849400963</td>\n",
" <td>霸州店</td>\n",
" <td>测试号</td>\n",
" <td>13103128888</td>\n",
" <td>冀FFFFFH</td>\n",
" <td>2018-06-02 08:47:56</td>\n",
" <td>0.0</td>\n",
" <td>别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版</td>\n",
" <td></td>\n",
" <td>洗车;</td>\n",
" <td>0.0</td>\n",
" <td>15000</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>420</th>\n",
" <td>SGDXC201806020849090157</td>\n",
" <td>霸州店</td>\n",
" <td>测试号</td>\n",
" <td>13103128888</td>\n",
" <td>冀FFFFFH</td>\n",
" <td>2018-06-02 08:47:24</td>\n",
" <td>0.0</td>\n",
" <td>别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版</td>\n",
" <td></td>\n",
" <td>洗车;</td>\n",
" <td>0.0</td>\n",
" <td>15000</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>421</th>\n",
" <td>SGDXC201806020848352735</td>\n",
" <td>霸州店</td>\n",
" <td>测试号</td>\n",
" <td>13103128888</td>\n",
" <td>冀FFFFFH</td>\n",
" <td>2018-06-02 08:46:50</td>\n",
" <td>0.0</td>\n",
" <td>别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版</td>\n",
" <td></td>\n",
" <td>洗车;</td>\n",
" <td>0.0</td>\n",
" <td>15000</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>422</th>\n",
" <td>SGDXC201806020847002869</td>\n",
" <td>霸州店</td>\n",
" <td>测试号</td>\n",
" <td>13103128888</td>\n",
" <td>冀FFFFFH</td>\n",
" <td>2018-06-02 08:45:15</td>\n",
" <td>0.0</td>\n",
" <td>别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版</td>\n",
" <td></td>\n",
" <td>洗车;</td>\n",
" <td>0.0</td>\n",
" <td>15000</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>423</th>\n",
" <td>SGDXC201806020845021548</td>\n",
" <td>霸州店</td>\n",
" <td>测试号</td>\n",
" <td>13103128888</td>\n",
" <td>冀FFFFFH</td>\n",
" <td>2018-06-02 08:43:17</td>\n",
" <td>0.0</td>\n",
" <td>别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版</td>\n",
" <td></td>\n",
" <td>洗车;</td>\n",
" <td>0.0</td>\n",
" <td>15000</td>\n",
" <td></td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 施工单编号 服务门店 客户名称 联系电话 车牌号 \\\n",
"419 SGDXC201806020849400963 霸州店 测试号 13103128888 冀FFFFFH \n",
"420 SGDXC201806020849090157 霸州店 测试号 13103128888 冀FFFFFH \n",
"421 SGDXC201806020848352735 霸州店 测试号 13103128888 冀FFFFFH \n",
"422 SGDXC201806020847002869 霸州店 测试号 13103128888 冀FFFFFH \n",
"423 SGDXC201806020845021548 霸州店 测试号 13103128888 冀FFFFFH \n",
"\n",
" 保养时间 实收金额 车型 配件 \\\n",
"419 2018-06-02 08:47:56 0.0 别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版 \n",
"420 2018-06-02 08:47:24 0.0 别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版 \n",
"421 2018-06-02 08:46:50 0.0 别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版 \n",
"422 2018-06-02 08:45:15 0.0 别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版 \n",
"423 2018-06-02 08:43:17 0.0 别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版 \n",
"\n",
" 服务 行驶里程 下次保养 派工单查看 \n",
"419 洗车; 0.0 15000 \n",
"420 洗车; 0.0 15000 \n",
"421 洗车; 0.0 15000 \n",
"422 洗车; 0.0 15000 \n",
"423 洗车; 0.0 15000 "
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_result.tail()"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [],
"source": [
"df_result.to_excel('工单历史_霸州店1494-1522.xlsx',index=False)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2.工单历史 -- selenium\n",
"+ 不稳定"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"进入iframe\n",
"进入iframe\n",
"进入iframe\n"
]
},
{
"ename": "StaleElementReferenceException",
"evalue": "Message: stale element reference: element is not attached to the page document\n (Session info: chrome=98.0.4758.102)\n",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mStaleElementReferenceException\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_16740/1479824237.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 80\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2150\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 81\u001b[0m \u001b[0mtime\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2.5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 82\u001b[1;33m \u001b[0mWebDriverWait\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdriver\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0muntil\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mEC\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0melement_to_be_clickable\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mBy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mXPATH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'//a[@class=\"laypage_next\"]'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mclick\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 83\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 84\u001b[0m \u001b[0mPAGES\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m2939\u001b[0m \u001b[1;33m-\u001b[0m \u001b[1;36m2151\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\miniconda3\\envs\\ff6\\lib\\site-packages\\selenium\\webdriver\\remote\\webelement.py\u001b[0m in \u001b[0;36mclick\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 78\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mclick\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 79\u001b[0m \u001b[1;34m\"\"\"Clicks the element.\"\"\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 80\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_execute\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mCommand\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mCLICK_ELEMENT\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 81\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 82\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0msubmit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\miniconda3\\envs\\ff6\\lib\\site-packages\\selenium\\webdriver\\remote\\webelement.py\u001b[0m in \u001b[0;36m_execute\u001b[1;34m(self, command, params)\u001b[0m\n\u001b[0;32m 631\u001b[0m \u001b[0mparams\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m{\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 632\u001b[0m \u001b[0mparams\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'id'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_id\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 633\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_parent\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcommand\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 634\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 635\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mfind_element\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mby\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mBy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mID\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\miniconda3\\envs\\ff6\\lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py\u001b[0m in \u001b[0;36mexecute\u001b[1;34m(self, driver_command, params)\u001b[0m\n\u001b[0;32m 319\u001b[0m \u001b[0mresponse\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcommand_executor\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdriver_command\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 320\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mresponse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 321\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0merror_handler\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcheck_response\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mresponse\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 322\u001b[0m response['value'] = self._unwrap_value(\n\u001b[0;32m 323\u001b[0m response.get('value', None))\n",
"\u001b[1;32m~\\miniconda3\\envs\\ff6\\lib\\site-packages\\selenium\\webdriver\\remote\\errorhandler.py\u001b[0m in \u001b[0;36mcheck_response\u001b[1;34m(self, response)\u001b[0m\n\u001b[0;32m 240\u001b[0m \u001b[0malert_text\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'alert'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'text'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 241\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mexception_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmessage\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mscreen\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstacktrace\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0malert_text\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 242\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mexception_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmessage\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mscreen\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstacktrace\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 243\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 244\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_value_or_default\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mobj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mStaleElementReferenceException\u001b[0m: Message: stale element reference: element is not attached to the page document\n (Session info: chrome=98.0.4758.102)\n"
]
}
],
"source": [
"import requests\n",
"import pandas as pd\n",
"import time\n",
"from selenium import webdriver\n",
"from selenium.webdriver.common.keys import Keys\n",
"from selenium.webdriver.support import expected_conditions as EC\n",
"from selenium.webdriver.common.by import By\n",
"from selenium.webdriver.support.wait import WebDriverWait\n",
"import numpy as np\n",
"from urllib.parse import unquote\n",
"from lxml import etree\n",
"\n",
"\n",
"options = webdriver.ChromeOptions()\n",
"# options.add_argument('headless')\n",
"\n",
"name = '徐红艳'\n",
"password = '19850605'\n",
"\n",
"driver = webdriver.Chrome(executable_path=r\"D:\\chromedriver\\chromedriver_98\\chromedriver.exe\", options=options)\n",
"driver.maximize_window() # 最大化浏览器窗口\n",
"# 打开网页 进行登录\n",
"driver.get('http://cd.dazhengren.com:9006/')\n",
"\n",
"# 在输入框中输入账号和密码\n",
"username = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//input[@id=\"uname\"]')))\n",
"pwd = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//input[@id=\"upass\"]')))\n",
"enter = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//button[@type=\"submit\"]')))\n",
"\n",
"username.clear()\n",
"username.send_keys(name)\n",
"pwd.clear()\n",
"pwd.send_keys(password)\n",
"enter.click()\n",
"\n",
"# 客户管理系统 ==> 工单查看_D ==》 服务门店\n",
"driver.find_element_by_xpath('/html/body/div[2]/div/div/div[3]/div[1]/div[1]').click()\n",
"WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div/div/div[3]/div[2]/p/a[3]'))).click()\n",
"\n",
"# 进入 iframe\n",
"time.sleep(0.5)\n",
"iframe = driver.find_element_by_xpath(r'//*[@id=\"tabs\"]/div[2]/div[2]/div/iframe')\n",
"time.sleep(1)\n",
"driver.switch_to.frame(iframe)\n",
"time.sleep(0.5)\n",
"\n",
"print('进入iframe')\n",
"\n",
"# 选择 服务门店\n",
"\n",
"driver.find_element_by_xpath('//*[@id=\"DeparmentName\"]').click()\n",
"\n",
"# 进入 弹窗 iframe\n",
"time.sleep(0.5)\n",
"iframe = driver.find_element_by_xpath(r'//*[@id=\"layui-layer-iframe2\"]')\n",
"time.sleep(1)\n",
"driver.switch_to.frame(iframe)\n",
"time.sleep(0.5)\n",
"print('进入iframe')\n",
"\n",
"WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id=\"1-19\"]/i'))).click()# 零售部\n",
"WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id=\"1-42\"]/i'))).click()# 秦皇岛区域\n",
"WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id=\"1-73_anchor\"]'))).click()# 黄河大道店\n",
"WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id=\"closeIframe\"]'))).click() # 确定\n",
"\n",
"# 返回主内容,并重新进入“查询按钮”所在的iframe \n",
"driver.switch_to.default_content()\n",
"time.sleep(0.5)\n",
"iframe = driver.find_element_by_xpath(r'//*[@id=\"tabs\"]/div[2]/div[2]/div/iframe')\n",
"time.sleep(1)\n",
"driver.switch_to.frame(iframe)\n",
"time.sleep(0.5)\n",
"\n",
"print('进入iframe')\n",
"\n",
"WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id=\"breadcrumbs\"]/div/div[1]/div[2]/div/p[11]/button[1]'))).click() # 查询\n",
"time.sleep(1)\n",
"\n",
"\n",
"for i in range(2150):\n",
" time.sleep(2.5)\n",
" WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//a[@class=\"laypage_next\"]'))).click()\n",
"\n",
"PAGES = 2939 - 2151\n",
"\n",
"result = []\n",
"\n",
"for page in range(PAGES-1):\n",
" time.sleep(3)\n",
"\n",
"# 读取表格\n",
"\n",
"\n",
" html = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id=\"MCTTable\"]/tbody[last()]'))).get_attribute('innerHTML')\n",
" HTML = etree.HTML(html)\n",
" for i in range(1,16):\n",
" data = {}\n",
"\n",
" data['序号'] = '' if len(HTML.xpath(f'//tr[{i}]/td[1]/text()')) == 0 else HTML.xpath(f'//tr[{i}]/td[1]/text()')[0]\n",
" data['施工单编号'] = '' if len(HTML.xpath(f'//tr[{i}]/td[2]/a[1]/text()')) == 0 else HTML.xpath(f'//tr[{i}]/td[2]/a[1]/text()')[0]\n",
" data['服务门店'] = '' if len(HTML.xpath(f'//tr[{i}]/td[3]/text()')) == 0 else HTML.xpath(f'//tr[{i}]/td[3]/text()')[0]\n",
" data['客户名称'] = '' if len(HTML.xpath(f'//tr[{i}]/td[4]/text()')) == 0 else HTML.xpath(f'//tr[{i}]/td[4]/text()')[0]\n",
" data['联系电话'] = '' if len(HTML.xpath(f'//tr[{i}]/td[5]/text()')) == 0 else HTML.xpath(f'//tr[{i}]/td[5]/text()')[0]\n",
" data['车牌号'] = '' if len(HTML.xpath(f'//tr[{i}]/td[6]/text()')) == 0 else HTML.xpath(f'//tr[{i}]/td[6]/text()')[0]\n",
" data['保养时间'] = '' if len(HTML.xpath(f'//tr[{i}]/td[7]/text()')) == 0 else HTML.xpath(f'//tr[{i}]/td[7]/text()')[0]\n",
" data['实收金额'] = '' if len(HTML.xpath(f'//tr[{i}]/td[8]/text()')) == 0 else HTML.xpath(f'//tr[{i}]/td[8]/text()')[0]\n",
" data['车型'] = '' if len(HTML.xpath(f'//tr[{i}]/td[9]/p[1]/text()')) == 0 else HTML.xpath(f'//tr[{i}]/td[9]/p[1]/text()')[0]\n",
" data['配件'] = '' if len(HTML.xpath(f'//tr[{i}]/td[10]/p[1]/text()')) == 0 else HTML.xpath(f'//tr[{i}]/td[10]/p[1]/text()')[0]\n",
" data['服务'] = '' if len(HTML.xpath(f'//tr[{i}]/td[11]/p[1]/text()')) == 0 else HTML.xpath(f'//tr[{i}]/td[11]/p[1]/text()')[0]\n",
" data['行驶里程'] = '' if len(HTML.xpath(f'//tr[{i}]/td[13]/text()')) == 0 else HTML.xpath(f'//tr[{i}]/td[13]/text()')[0]\n",
" data['下次保养'] = '' if len(HTML.xpath(f'//tr[{i}]/td[14]/text()')) == 0 else HTML.xpath(f'//tr[{i}]/td[14]/text()')[0]\n",
" data['派工单查看'] = '' if len(HTML.xpath(f'//tr[{i}]/td[15]/text()')) == 0 else HTML.xpath(f'//tr[{i}]/td[15]/text()')[0]\n",
"\n",
" result.append(data)\n",
"\n",
" # 进入下一页\n",
" WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//a[@class=\"laypage_next\"]'))).click()\n",
"\n",
" # if page == 2:\n",
" # break\n",
"\n",
"df = pd.DataFrame(result)\n",
"df\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"149"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"page"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>序号</th>\n",
" <th>施工单编号</th>\n",
" <th>服务门店</th>\n",
" <th>客户名称</th>\n",
" <th>联系电话</th>\n",
" <th>车牌号</th>\n",
" <th>保养时间</th>\n",
" <th>实收金额</th>\n",
" <th>车型</th>\n",
" <th>配件</th>\n",
" <th>服务</th>\n",
" <th>行驶里程</th>\n",
" <th>下次保养</th>\n",
" <th>派工单查看</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2230</th>\n",
" <td>11</td>\n",
" <td>SGD201903071247432412</td>\n",
" <td>秦皇岛黄河大道店</td>\n",
" <td>孙锦生</td>\n",
" <td>15699998007</td>\n",
" <td>冀CZH708</td>\n",
" <td>2019-03-07 13:48:15</td>\n",
" <td>320.00</td>\n",
" <td>日产骐达 上市年份[2014年11月]生产年份[2015] 1.6 无级 XL 智能型</td>\n",
" <td>力普拉斯LP-46B24L;</td>\n",
" <td></td>\n",
" <td>5000</td>\n",
" <td>10000</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>2231</th>\n",
" <td>12</td>\n",
" <td>SGD201903071245194188</td>\n",
" <td>秦皇岛黄河大道店</td>\n",
" <td>冯志刚</td>\n",
" <td>15903330933</td>\n",
" <td>冀CAW533</td>\n",
" <td>2019-03-07 13:48:15</td>\n",
" <td>450.00</td>\n",
" <td>福特</td>\n",
" <td>瓦尔塔70D26L 蓝线;</td>\n",
" <td></td>\n",
" <td>60000</td>\n",
" <td>65000</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>2232</th>\n",
" <td>13</td>\n",
" <td>SGDXC201903071241447810</td>\n",
" <td>秦皇岛黄河大道店</td>\n",
" <td>测试号</td>\n",
" <td>13103128888</td>\n",
" <td>冀FFFFFH</td>\n",
" <td>2019-03-07 12:41:18</td>\n",
" <td>0.00</td>\n",
" <td>别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版</td>\n",
" <td></td>\n",
" <td>洗车;</td>\n",
" <td>0</td>\n",
" <td>15000</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>2233</th>\n",
" <td>14</td>\n",
" <td>SGDXC201903071241024922</td>\n",
" <td>秦皇岛黄河大道店</td>\n",
" <td>测试号</td>\n",
" <td>13103128888</td>\n",
" <td>冀FFFFFH</td>\n",
" <td>2019-03-07 12:40:36</td>\n",
" <td>0.00</td>\n",
" <td>别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版</td>\n",
" <td></td>\n",
" <td>洗车;</td>\n",
" <td>0</td>\n",
" <td>15000</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>2234</th>\n",
" <td>15</td>\n",
" <td>SGDXC201903071229112159</td>\n",
" <td>秦皇岛黄河大道店</td>\n",
" <td>测试号</td>\n",
" <td>13103128888</td>\n",
" <td>冀FFFFFH</td>\n",
" <td>2019-03-07 12:28:45</td>\n",
" <td>0.00</td>\n",
" <td>别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版</td>\n",
" <td></td>\n",
" <td>洗车;</td>\n",
" <td>0</td>\n",
" <td>15000</td>\n",
" <td></td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 序号 施工单编号 服务门店 客户名称 联系电话 车牌号 \\\n",
"2230 11 SGD201903071247432412 秦皇岛黄河大道店 孙锦生 15699998007 冀CZH708 \n",
"2231 12 SGD201903071245194188 秦皇岛黄河大道店 冯志刚 15903330933 冀CAW533 \n",
"2232 13 SGDXC201903071241447810 秦皇岛黄河大道店 测试号 13103128888 冀FFFFFH \n",
"2233 14 SGDXC201903071241024922 秦皇岛黄河大道店 测试号 13103128888 冀FFFFFH \n",
"2234 15 SGDXC201903071229112159 秦皇岛黄河大道店 测试号 13103128888 冀FFFFFH \n",
"\n",
" 保养时间 实收金额 \\\n",
"2230 2019-03-07 13:48:15 320.00 \n",
"2231 2019-03-07 13:48:15 450.00 \n",
"2232 2019-03-07 12:41:18 0.00 \n",
"2233 2019-03-07 12:40:36 0.00 \n",
"2234 2019-03-07 12:28:45 0.00 \n",
"\n",
" 车型 配件 服务 行驶里程 \\\n",
"2230 日产骐达 上市年份[2014年11月]生产年份[2015] 1.6 无级 XL 智能型 力普拉斯LP-46B24L; 5000 \n",
"2231 福特 瓦尔塔70D26L 蓝线; 60000 \n",
"2232 别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版 洗车; 0 \n",
"2233 别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版 洗车; 0 \n",
"2234 别克凯越 上市年份[2013年2月]生产年份[2013] 1.5 手自一体 尊享版 洗车; 0 \n",
"\n",
" 下次保养 派工单查看 \n",
"2230 10000 \n",
"2231 65000 \n",
"2232 15000 \n",
"2233 15000 \n",
"2234 15000 "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1 = pd.DataFrame(result)\n",
"df1.tail()\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"i"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"df1.to_excel('服务历史_黄河大道_2150页.xlsx',index=False)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'dzrEmployeeNameCookie': 'å¾\\x90红è\\x89³',\n",
" 'dzrkbs': 'E06D24784B84D4100AB5F27CE4EE50501BC9FBBCCD14A0AB8C0C56CBA7BA8ED37A76609C63BA37D29E93B92D563051542C29FA896CEE4E72C0D0B07CB87F3D80B7B382E23E184DC3650C79B63831885CD0405881ACD3E82AD00D61FBD7EAEEB03910AC24D68BD2145A13250166C13A1A8BBFC04930DB59847FF9C93CCDBF6AE3A8252B2BF6BBB17C8576718201412A1E2D57E16CEFFF67145B7345A32691E9206906708BA4BF431DC686BE6493BB8773383085DBEB8C684C8D3CF8D6892829CAD6949884AB0B57920C99851FBF2F0710477487D481F13C9A8CAC2F23E2B0B016400C872B87ACBDFCD97049C5043E059294F12A4D7BD7F2587254E5CFBD454FA851388F56E35BBD7319176A1ECC31F6EE'}"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cookies"
]
}
],
"metadata": {
"interpreter": {
"hash": "99e7afef122cf2f9114b0eaddefb1424b0cee966ded125dd10e982e14f4055f4"
},
"kernelspec": {
"display_name": "Python 3.9.5 64-bit ('ff6': conda)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.4"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}