{ "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 \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 \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 }