Files
F6--/张阳脚本/F6汽车系统/材料条码.ipynb
T
2026-04-09 10:19:09 +08:00

645 lines
33 KiB
Plaintext

{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "材料条码",
"id": "8c2170413e567816"
},
{
"cell_type": "code",
"id": "initial_id",
"metadata": {
"collapsed": true,
"ExecuteTime": {
"end_time": "2026-02-04T02:44:16.921927300Z",
"start_time": "2026-02-04T01:49:57.940495Z"
}
},
"source": [
"import requests\n",
"import logging\n",
"import traceback\n",
"import requests\n",
"import time\n",
"from typing import Dict, Any\n",
"from tqdm import tqdm\n",
"import pandas as pd\n",
"import os\n",
"\n",
"cookies = {\n",
" 'f6-ids-goodsSESSIONID': 'b013763e-f0ee-4175-bc42-bc3045c56f81',\n",
" 'erpLanguage': 'zh-CN',\n",
" 'tmall': 'false',\n",
" 'prodOrg': '10545724654284683060',\n",
" 'unp': '10907434497537082431',\n",
" '_up': '-NillNN-qyBEJ--t3vnSknvoOFt2zfaJs8kB2nw6WeBdXvPFpJjQjaZJ9Q3d-WrAAGgt60MgQHajHWBHMKKxj0CuWypi1JgKCFP1EPEk-HbqE_Adrokr3wcJ-vVRv-ZNHu3M-GTZ15i2EXSsquRSjOgdkF7BOhBurEj9nBrn9JjPSwY.',\n",
" 'sensorsdata2015jssdkcross': '%7B%22distinct_id%22%3A%2210907434497537082431%22%2C%22first_id%22%3A%2219b6df76a22f46-04a98afdd2a11d8-4c657b58-1327104-19b6df76a2312c7%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22%24device_id%22%3A%2219b6df76a22f46-04a98afdd2a11d8-4c657b58-1327104-19b6df76a2312c7%22%7D',\n",
"}\n",
"\n",
"headers = {\n",
" 'accept': 'application/json, text/plain, */*',\n",
" 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',\n",
" 'content-type': 'application/json;charset=UTF-8',\n",
" 'origin': 'https://ids-goods.f6car.cn',\n",
" 'priority': 'u=1, i',\n",
" 'referer': 'https://ids-goods.f6car.cn/f6-ids-goods/view/material.html',\n",
" 'sec-ch-ua': '\"Chromium\";v=\"146\", \"Not-A.Brand\";v=\"24\", \"Microsoft Edge\";v=\"146\"',\n",
" 'sec-ch-ua-mobile': '?0',\n",
" 'sec-ch-ua-platform': '\"Windows\"',\n",
" 'sec-fetch-dest': 'empty',\n",
" 'sec-fetch-mode': 'cors',\n",
" 'sec-fetch-site': 'same-origin',\n",
" 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36 Edg/146.0.0.0',\n",
" # 'cookie': 'f6-ids-goodsSESSIONID=b013763e-f0ee-4175-bc42-bc3045c56f81; erpLanguage=zh-CN; tmall=false; prodOrg=10545724654284683060; unp=10907434497537082431; _up=-NillNN-qyBEJ--t3vnSknvoOFt2zfaJs8kB2nw6WeBdXvPFpJjQjaZJ9Q3d-WrAAGgt60MgQHajHWBHMKKxj0CuWypi1JgKCFP1EPEk-HbqE_Adrokr3wcJ-vVRv-ZNHu3M-GTZ15i2EXSsquRSjOgdkF7BOhBurEj9nBrn9JjPSwY.; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2210907434497537082431%22%2C%22first_id%22%3A%2219b6df76a22f46-04a98afdd2a11d8-4c657b58-1327104-19b6df76a2312c7%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22%24device_id%22%3A%2219b6df76a22f46-04a98afdd2a11d8-4c657b58-1327104-19b6df76a2312c7%22%7D',\n",
"}\n",
"org_id = '10545724654284683060'\n",
"# 第一步:获取所有材料列表(分页)\n",
"json_data = {\n",
" 'keyWord': '',\n",
" 'idOwnOrg': org_id,\n",
" 'currentPage': 1,\n",
" 'pageSize': 100,\n",
" 'name': '',\n",
" 'brand': '',\n",
" 'supplierCode': '',\n",
" 'customCode': '',\n",
" 'categoryName': '',\n",
" 'categoryId': '',\n",
" 'labelId': '',\n",
" 'labelName': '',\n",
" 'spec': '',\n",
" 'applyModel': '',\n",
" 'sellPurchaseStatuses': [2, 3, 4, 5],\n",
" 'customInvoiceCategory': 0,\n",
" 'getThirdPlatformCode': 0,\n",
"}\n",
"\n",
"\n",
"def safe_str(val):\n",
" \"\"\"将值转为字符串,NaN 返回空字符串\"\"\"\n",
" if pd.isna(val):\n",
" return \"\"\n",
" return str(val).strip()\n",
"\n",
"\n",
"def should_update(new_val):\n",
" \"\"\"判断是否应该用 new_val 更新:非 NaN 且非空字符串\"\"\"\n",
" return not (pd.isna(new_val) or (isinstance(new_val, str) and new_val.strip() == \"\"))\n",
"\n",
"\n",
"try:\n",
" df = pd.read_excel(fr\"C:\\Users\\hp_z66\\Desktop\\钉钉文件\\一号车库材料信息需添加条码(宗川涵).xls\",\n",
" engine='xlrd', sheet_name=0)\n",
" all_materials_list = []\n",
" for index, row in tqdm(df.iterrows(), desc=\"获取材料列表\"):\n",
" json_data['currentPage'] = 1\n",
" json_data['keyWord'] = row[\"规格\"]\n",
" try:\n",
" resp = requests.post(\n",
" 'https://ids-goods.f6car.com/f6-ids-goods/part/getExactPartStockInfo',\n",
" cookies=cookies,\n",
" json=json_data,\n",
" )\n",
" time.sleep(1)\n",
" resp.raise_for_status()\n",
" records = resp.json().get(\"data\", {}).get(\"records\", [])\n",
" all_materials_list.extend(records)\n",
" except requests.exceptions.RequestException as e:\n",
" print(\n",
" f\"获取第{page}页材料列表失败: {str(e)}, 响应状态码: {getattr(e.response, 'status_code', 'N/A')}\")\n",
" raise\n",
" print(f\"材料列表获取完成,总计: {len(all_materials_list)}条\")\n",
"except requests.exceptions.RequestException as e:\n",
" print(f\"获取材料列表失败: {str(e)}, 堆栈信息: {traceback.format_exc()}\")\n",
" raise\n",
"\n",
"df = pd.read_excel(fr\"C:\\Users\\hp_z66\\Desktop\\钉钉文件\\一号车库材料信息需添加条码(宗川涵).xls\", engine='xlrd',\n",
" sheet_name=0)\n",
"# 第二步:构建 update_map(只存原始值,不预处理)\n",
"update_map = {}\n",
"skipped_count = 0\n",
"for _, row in df.iterrows():\n",
" orig_code = row.iloc[0] # 原材料编码\n",
" if pd.isna(orig_code) or str(orig_code).strip() == \"\":\n",
" skipped_count += 1\n",
" continue\n",
" orig_code = str(orig_code).strip()\n",
" update_map[orig_code] = {\n",
" \"材料条码\": row.iloc[1],\n",
" }\n",
"print(f\"待更新材料数: {len(update_map)},跳过空编码行: {skipped_count}\")\n",
"\n",
"# 第三步:遍历材料,按需更新\n",
"results = []\n",
"consecutive_failures = 0 # 连续失败计数器\n",
"MAX_CONSECUTIVE_FAILURES = 100 # 最大连续失败次数\n",
"success_count = 0\n",
"failure_count = 0\n",
"skip_count = 0\n",
"\n",
"for item in tqdm(all_materials_list, desc=\"处理材料更新\", total=len(all_materials_list)):\n",
" custom_code = item.get(\"customCode\")\n",
" if not custom_code or str(custom_code) not in update_map:\n",
" continue\n",
"\n",
" part_id = item.get(\"partId\")\n",
" if not part_id:\n",
" error_msg = '缺少 partId'\n",
" results.append({'材料编码': custom_code, '状态': error_msg})\n",
" failure_count += 1\n",
" consecutive_failures += 1\n",
" print(f\"材料编码 {custom_code} 跳过/失败: {error_msg}\")\n",
" if consecutive_failures >= MAX_CONSECUTIVE_FAILURES:\n",
" results.append({'材料编码': '系统保护', '状态': '连续100次失败已终止'})\n",
" print(f\"连续失败{MAX_CONSECUTIVE_FAILURES}次,已中止任务执行\")\n",
" break\n",
" continue\n",
"\n",
" try:\n",
" # 获取材料明细\n",
" params = {\n",
" 'partId': part_id,\n",
" 'customInvoiceCategory': '0',\n",
" 'getThirdPlatformCode': '0',\n",
" }\n",
" materials_response = requests.get(\n",
" 'https://ids-goods.f6car.com/f6-ids-goods/part/getPartInfo',\n",
" params=params,\n",
" cookies=cookies,\n",
" )\n",
" time.sleep(1)\n",
" if materials_response.status_code != 200:\n",
" error_msg = f'获取明细失败: {materials_response.status_code}'\n",
" results.append({'材料编码': custom_code, '状态': error_msg})\n",
" failure_count += 1\n",
" consecutive_failures += 1\n",
" print(f\"材料编码 {custom_code} {error_msg}, 响应内容: {materials_response.text[:200]}\")\n",
" if consecutive_failures >= MAX_CONSECUTIVE_FAILURES:\n",
" results.append({'材料编码': '系统保护', '状态': '连续100次失败已终止'})\n",
" print(f\"连续失败{MAX_CONSECUTIVE_FAILURES}次,已中止任务执行\")\n",
" break\n",
" continue\n",
"\n",
" detail = materials_response.json().get(\"data\")\n",
" if not detail:\n",
" error_msg = '明细为空'\n",
" results.append({'材料编码': custom_code, '状态': error_msg})\n",
" failure_count += 1\n",
" consecutive_failures += 1\n",
" print(f\"材料编码 {custom_code} {error_msg}, 响应JSON: {materials_response.json()}\")\n",
" if consecutive_failures >= MAX_CONSECUTIVE_FAILURES:\n",
" results.append({'材料编码': '系统保护', '状态': '连续100次失败已终止'})\n",
" print(f\"连续失败{MAX_CONSECUTIVE_FAILURES}次,已中止任务执行\")\n",
" break\n",
" continue\n",
"\n",
" updates = update_map[str(custom_code)]\n",
" import time\n",
"\n",
" # 获取当前时间戳(秒),乘以1000转为毫秒,并取整\n",
" timestamp_ms = int(time.time() * 1000)\n",
"\n",
" # 安全更新字段:仅当 Excel 提供有效值时才覆盖\n",
" if should_update(updates[\"材料条码\"]):\n",
" detail[\"partBarCodeVos\"] = [\n",
" {\n",
" 'barCode': safe_str(updates[\"材料条码\"]),\n",
" 'barId': None,\n",
" 'createTime': timestamp_ms,\n",
" 'creator': '15865484595890778191',\n",
" 'groupId': None,\n",
" 'infoId': '14582097883364187448',\n",
" 'isDel': 0,\n",
" 'modifier': '15865484595890778191',\n",
" 'modifyTime': timestamp_ms,\n",
" },\n",
" ]\n",
" # 修复价格格式和数组(必须!)\n",
" for f in [\"purchasePrice\", \"sellPrice\"]:\n",
" val = detail.get(f)\n",
" if isinstance(val, (int, float)):\n",
" detail[f] = f\"{val:.2f}\"\n",
" if detail.get(\"partBarCodeVos\") is None:\n",
" detail[\"partBarCodeVos\"] = []\n",
"\n",
" # 提交更新\n",
" update_resp = requests.post(\n",
" 'https://ids-goods.f6car.com/f6-ids-goods/part/updateAreaPartBasicInfo',\n",
" cookies=cookies,\n",
" json=detail\n",
" )\n",
" time.sleep(2)\n",
"\n",
" if update_resp.status_code == 200 and update_resp.json().get(\"code\") == 200:\n",
" results.append({'材料编码': custom_code, '状态': '修改成功'})\n",
" success_count += 1\n",
" consecutive_failures = 0 # 成功时重置计数器\n",
" else:\n",
" msg = update_resp.json().get(\"message\", \"未知错误\")\n",
" error_msg = f'修改失败: {msg}'\n",
" results.append({'材料编码': custom_code, '状态': error_msg})\n",
" failure_count += 1\n",
" consecutive_failures += 1\n",
" print(f\"材料编码 {custom_code} {error_msg}, 响应数据: {update_resp.json()}\")\n",
"\n",
" except requests.exceptions.RequestException as e:\n",
" error_msg = f'请求异常: {str(e)}'\n",
" results.append({'材料编码': custom_code, '状态': error_msg})\n",
" failure_count += 1\n",
" consecutive_failures += 1\n",
" print(f\"材料编码 {custom_code} {error_msg}, 堆栈信息: {traceback.format_exc()}\")\n",
" except Exception as e:\n",
" error_msg = f'内部错误: {str(e)}'\n",
" results.append({'材料编码': custom_code, '状态': error_msg})\n",
" failure_count += 1\n",
" consecutive_failures += 1\n",
" print(f\"材料编码 {custom_code} {error_msg}, 堆栈信息: {traceback.format_exc()}\")\n",
" # 检查连续失败次数\n",
" if consecutive_failures >= MAX_CONSECUTIVE_FAILURES:\n",
" results.append({'材料编码': '系统保护', '状态': '连续100次失败已终止'})\n",
" print(f\"连续失败{MAX_CONSECUTIVE_FAILURES}次,已中止任务执行\")\n",
" break\n",
"\n",
"# 统计汇总(总行数 / 待处理 / 成功 / 失败 / 跳过)\n",
"total_rows = len(df)\n",
"to_process = len(update_map)\n",
"# results 里可能包含 “缺少 partId” 等失败信息;这里跳过数按空编码行计数即可\n",
"skip_count = skipped_count\n",
"summary = {\n",
" \"总行数\": total_rows,\n",
" \"待处理\": to_process,\n",
" \"成功\": success_count,\n",
" \"失败\": failure_count,\n",
" \"跳过\": skip_count,\n",
"}\n",
"results.insert(0, {\"汇总\": summary})\n",
"print(f\"材料修改汇总: {summary}\")"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"材料列表页数: 10\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"获取材料列表: 100%|██████████| 10/10 [00:15<00:00, 1.55s/it]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"材料列表获取完成,总计: 922条\n",
"待更新材料数: 813,跳过空编码行: 0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"处理材料更新: 39%|███▉ | 360/922 [16:41<39:48, 4.25s/it]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"材料编码 CL0000564 请求异常: ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None)), 堆栈信息: Traceback (most recent call last):\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connectionpool.py\", line 773, in urlopen\n",
" self._prepare_proxy(conn)\n",
" ~~~~~~~~~~~~~~~~~~~^^^^^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connectionpool.py\", line 1042, in _prepare_proxy\n",
" conn.connect()\n",
" ~~~~~~~~~~~~^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connection.py\", line 796, in connect\n",
" sock_and_verified = _ssl_wrap_socket_and_match_hostname(\n",
" sock=sock,\n",
" ...<14 lines>...\n",
" assert_fingerprint=self.assert_fingerprint,\n",
" )\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connection.py\", line 975, in _ssl_wrap_socket_and_match_hostname\n",
" ssl_sock = ssl_wrap_socket(\n",
" sock=sock,\n",
" ...<8 lines>...\n",
" tls_in_tls=tls_in_tls,\n",
" )\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\util\\ssl_.py\", line 483, in ssl_wrap_socket\n",
" ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\util\\ssl_.py\", line 527, in _ssl_wrap_socket_impl\n",
" return ssl_context.wrap_socket(sock, server_hostname=server_hostname)\n",
" ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\ssl.py\", line 455, in wrap_socket\n",
" return self.sslsocket_class._create(\n",
" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n",
" sock=sock,\n",
" ^^^^^^^^^^\n",
" ...<5 lines>...\n",
" session=session\n",
" ^^^^^^^^^^^^^^^\n",
" )\n",
" ^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\ssl.py\", line 1076, in _create\n",
" self.do_handshake()\n",
" ~~~~~~~~~~~~~~~~~^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\ssl.py\", line 1372, in do_handshake\n",
" self._sslobj.do_handshake()\n",
" ~~~~~~~~~~~~~~~~~~~~~~~~~^^\n",
"ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。\n",
"\n",
"During handling of the above exception, another exception occurred:\n",
"\n",
"Traceback (most recent call last):\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\requests\\adapters.py\", line 644, in send\n",
" resp = conn.urlopen(\n",
" method=request.method,\n",
" ...<9 lines>...\n",
" chunked=chunked,\n",
" )\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connectionpool.py\", line 841, in urlopen\n",
" retries = retries.increment(\n",
" method, url, error=new_e, _pool=self, _stacktrace=sys.exc_info()[2]\n",
" )\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\util\\retry.py\", line 474, in increment\n",
" raise reraise(type(error), error, _stacktrace)\n",
" ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\util\\util.py\", line 38, in reraise\n",
" raise value.with_traceback(tb)\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connectionpool.py\", line 773, in urlopen\n",
" self._prepare_proxy(conn)\n",
" ~~~~~~~~~~~~~~~~~~~^^^^^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connectionpool.py\", line 1042, in _prepare_proxy\n",
" conn.connect()\n",
" ~~~~~~~~~~~~^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connection.py\", line 796, in connect\n",
" sock_and_verified = _ssl_wrap_socket_and_match_hostname(\n",
" sock=sock,\n",
" ...<14 lines>...\n",
" assert_fingerprint=self.assert_fingerprint,\n",
" )\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connection.py\", line 975, in _ssl_wrap_socket_and_match_hostname\n",
" ssl_sock = ssl_wrap_socket(\n",
" sock=sock,\n",
" ...<8 lines>...\n",
" tls_in_tls=tls_in_tls,\n",
" )\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\util\\ssl_.py\", line 483, in ssl_wrap_socket\n",
" ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\util\\ssl_.py\", line 527, in _ssl_wrap_socket_impl\n",
" return ssl_context.wrap_socket(sock, server_hostname=server_hostname)\n",
" ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\ssl.py\", line 455, in wrap_socket\n",
" return self.sslsocket_class._create(\n",
" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n",
" sock=sock,\n",
" ^^^^^^^^^^\n",
" ...<5 lines>...\n",
" session=session\n",
" ^^^^^^^^^^^^^^^\n",
" )\n",
" ^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\ssl.py\", line 1076, in _create\n",
" self.do_handshake()\n",
" ~~~~~~~~~~~~~~~~~^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\ssl.py\", line 1372, in do_handshake\n",
" self._sslobj.do_handshake()\n",
" ~~~~~~~~~~~~~~~~~~~~~~~~~^^\n",
"urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None))\n",
"\n",
"During handling of the above exception, another exception occurred:\n",
"\n",
"Traceback (most recent call last):\n",
" File \"C:\\Users\\hp_z66\\AppData\\Local\\Temp\\ipykernel_105196\\2551472138.py\", line 155, in <module>\n",
" materials_response = requests.get(\n",
" 'https://ids-goods.f6car.com/f6-ids-goods/part/getPartInfo',\n",
" params=params,\n",
" cookies=cookies,\n",
" )\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\requests\\api.py\", line 73, in get\n",
" return request(\"get\", url, params=params, **kwargs)\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\requests\\api.py\", line 59, in request\n",
" return session.request(method=method, url=url, **kwargs)\n",
" ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\requests\\sessions.py\", line 589, in request\n",
" resp = self.send(prep, **send_kwargs)\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\requests\\sessions.py\", line 703, in send\n",
" r = adapter.send(request, **kwargs)\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\requests\\adapters.py\", line 659, in send\n",
" raise ConnectionError(err, request=request)\n",
"requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None))\n",
"\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"处理材料更新: 53%|█████▎ | 486/922 [25:00<31:25, 4.32s/it]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"材料编码 CL0000457 请求异常: ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None)), 堆栈信息: Traceback (most recent call last):\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connectionpool.py\", line 773, in urlopen\n",
" self._prepare_proxy(conn)\n",
" ~~~~~~~~~~~~~~~~~~~^^^^^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connectionpool.py\", line 1042, in _prepare_proxy\n",
" conn.connect()\n",
" ~~~~~~~~~~~~^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connection.py\", line 796, in connect\n",
" sock_and_verified = _ssl_wrap_socket_and_match_hostname(\n",
" sock=sock,\n",
" ...<14 lines>...\n",
" assert_fingerprint=self.assert_fingerprint,\n",
" )\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connection.py\", line 975, in _ssl_wrap_socket_and_match_hostname\n",
" ssl_sock = ssl_wrap_socket(\n",
" sock=sock,\n",
" ...<8 lines>...\n",
" tls_in_tls=tls_in_tls,\n",
" )\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\util\\ssl_.py\", line 483, in ssl_wrap_socket\n",
" ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\util\\ssl_.py\", line 527, in _ssl_wrap_socket_impl\n",
" return ssl_context.wrap_socket(sock, server_hostname=server_hostname)\n",
" ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\ssl.py\", line 455, in wrap_socket\n",
" return self.sslsocket_class._create(\n",
" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n",
" sock=sock,\n",
" ^^^^^^^^^^\n",
" ...<5 lines>...\n",
" session=session\n",
" ^^^^^^^^^^^^^^^\n",
" )\n",
" ^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\ssl.py\", line 1076, in _create\n",
" self.do_handshake()\n",
" ~~~~~~~~~~~~~~~~~^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\ssl.py\", line 1372, in do_handshake\n",
" self._sslobj.do_handshake()\n",
" ~~~~~~~~~~~~~~~~~~~~~~~~~^^\n",
"ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。\n",
"\n",
"During handling of the above exception, another exception occurred:\n",
"\n",
"Traceback (most recent call last):\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\requests\\adapters.py\", line 644, in send\n",
" resp = conn.urlopen(\n",
" method=request.method,\n",
" ...<9 lines>...\n",
" chunked=chunked,\n",
" )\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connectionpool.py\", line 841, in urlopen\n",
" retries = retries.increment(\n",
" method, url, error=new_e, _pool=self, _stacktrace=sys.exc_info()[2]\n",
" )\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\util\\retry.py\", line 474, in increment\n",
" raise reraise(type(error), error, _stacktrace)\n",
" ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\util\\util.py\", line 38, in reraise\n",
" raise value.with_traceback(tb)\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connectionpool.py\", line 773, in urlopen\n",
" self._prepare_proxy(conn)\n",
" ~~~~~~~~~~~~~~~~~~~^^^^^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connectionpool.py\", line 1042, in _prepare_proxy\n",
" conn.connect()\n",
" ~~~~~~~~~~~~^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connection.py\", line 796, in connect\n",
" sock_and_verified = _ssl_wrap_socket_and_match_hostname(\n",
" sock=sock,\n",
" ...<14 lines>...\n",
" assert_fingerprint=self.assert_fingerprint,\n",
" )\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\connection.py\", line 975, in _ssl_wrap_socket_and_match_hostname\n",
" ssl_sock = ssl_wrap_socket(\n",
" sock=sock,\n",
" ...<8 lines>...\n",
" tls_in_tls=tls_in_tls,\n",
" )\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\util\\ssl_.py\", line 483, in ssl_wrap_socket\n",
" ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\urllib3\\util\\ssl_.py\", line 527, in _ssl_wrap_socket_impl\n",
" return ssl_context.wrap_socket(sock, server_hostname=server_hostname)\n",
" ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\ssl.py\", line 455, in wrap_socket\n",
" return self.sslsocket_class._create(\n",
" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n",
" sock=sock,\n",
" ^^^^^^^^^^\n",
" ...<5 lines>...\n",
" session=session\n",
" ^^^^^^^^^^^^^^^\n",
" )\n",
" ^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\ssl.py\", line 1076, in _create\n",
" self.do_handshake()\n",
" ~~~~~~~~~~~~~~~~~^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\ssl.py\", line 1372, in do_handshake\n",
" self._sslobj.do_handshake()\n",
" ~~~~~~~~~~~~~~~~~~~~~~~~~^^\n",
"urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None))\n",
"\n",
"During handling of the above exception, another exception occurred:\n",
"\n",
"Traceback (most recent call last):\n",
" File \"C:\\Users\\hp_z66\\AppData\\Local\\Temp\\ipykernel_105196\\2551472138.py\", line 155, in <module>\n",
" materials_response = requests.get(\n",
" 'https://ids-goods.f6car.com/f6-ids-goods/part/getPartInfo',\n",
" params=params,\n",
" cookies=cookies,\n",
" )\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\requests\\api.py\", line 73, in get\n",
" return request(\"get\", url, params=params, **kwargs)\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\requests\\api.py\", line 59, in request\n",
" return session.request(method=method, url=url, **kwargs)\n",
" ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\requests\\sessions.py\", line 589, in request\n",
" resp = self.send(prep, **send_kwargs)\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\requests\\sessions.py\", line 703, in send\n",
" r = adapter.send(request, **kwargs)\n",
" File \"D:\\Program Files\\anaconda3\\envs\\F6+宜搭+其它\\Lib\\site-packages\\requests\\adapters.py\", line 659, in send\n",
" raise ConnectionError(err, request=request)\n",
"requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None))\n",
"\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"处理材料更新: 100%|██████████| 922/922 [54:02<00:00, 3.52s/it]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"材料修改汇总: {'总行数': 813, '待处理': 813, '成功': 811, '失败': 2, '跳过': 0}\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"execution_count": 4
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-02-03T07:29:11.795586Z",
"start_time": "2026-02-03T07:29:11.747501600Z"
}
},
"cell_type": "code",
"source": "",
"id": "b5c78eb02e2607ec",
"outputs": [
{
"data": {
"text/plain": [
"{'code': 400, 'message': '材料名称不能为空!'}"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 4
}
],
"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
}