Python自动化查询DELL服务器信息:从SN号到型号、出厂及保修状态的实战解析

张开发
2026/6/9 9:59:12 15 分钟阅读
Python自动化查询DELL服务器信息:从SN号到型号、出厂及保修状态的实战解析
1. 为什么需要自动化查询DELL服务器信息作为IT运维人员我经常需要管理几十台甚至上百台DELL服务器。每次手动登录官网查询服务器型号、出厂日期和保修状态不仅效率低下还容易出错。特别是当领导突然要一份完整的服务器资产报告时加班加点查数据简直是噩梦。记得去年公司做资产盘点我花了整整三天时间手动查询200多台服务器的信息。复制粘贴到手抽筋不说最后还发现有几台服务器的数据搞混了。从那以后我就下定决心要找到自动化的解决方案。Python脚本完美解决了这个问题。通过编写一个简单的爬虫程序现在只需要把服务器SN号列表导入几分钟就能生成完整的报告。这个脚本我已经用了两年多帮团队节省了数百小时的工作时间。下面我就把这个实战经验分享给大家。2. 准备工作与环境配置2.1 基础环境要求在开始编写脚本前我们需要准备好开发环境。我推荐使用Python 3.6或以上版本因为这个脚本用到了requests和re等库的新特性。如果你还在用Python 2.x现在是时候升级了。安装必要的依赖库非常简单pip install requestsrequests库是我们与DELL官网交互的核心工具它比Python自带的urllib更友好、更强大。我实测过使用requests发送HTTP请求的代码量能减少30%以上。2.2 创建SN号清单文件脚本需要读取一个包含所有服务器SN号的文本文件。按照我的习惯我会在D盘根目录创建sn.txtABC1234 XYZ5678 DEF9012每行一个SN号不需要任何分隔符或引号。如果你习惯用其他目录稍后可以在脚本中修改文件路径。3. 核心代码实现解析3.1 获取服务器基本信息页面首先我们需要通过SN号获取服务器的基本信息页面。DELL提供了一个专门的URL格式base_url https://www.dell.com/support/home/cn/zh/cnbsd1/product-support/servicetag/完整的请求URL就是base_url加上SN号。比如SN是ABC1234那么访问的地址就是https://www.dell.com/support/home/cn/zh/cnbsd1/product-support/servicetag/ABC1234这里我封装了一个Get_Page函数来处理HTTP请求def Get_Page(url): try: response requests.get(url) if response.status_code 200: return response.text return None except RequestException: return None这个函数做了基本的错误处理避免因为网络问题导致脚本崩溃。在实际使用中我发现加上超时设置会更稳妥response requests.get(url, timeout10)3.2 解析服务器型号信息从返回的HTML中提取服务器型号需要一点正则表达式技巧。DELL的页面结构比较固定型号通常出现在特定的h1标签中p2 re.compile(h1 classmb-3 mb-lg-1 text-center text-lg-left position-relative word-break(.*)/h1)这个正则表达式会匹配包含服务器型号的h1标签。我测试过各种型号的DELL服务器从PowerEdge R740到R940这个模式都能正确匹配。3.3 获取保修详情信息获取保修信息稍微复杂一些需要先提取一个服务代码然后用POST请求获取详细信息。关键代码如下info_url https://www.dell.com/support/components/dashboard/cn/zh/cnbsd1/Warranty/GetWarrantyDetails r1 requests.post(info_url, data{serviceTag: s_code})返回的HTML中包含出厂日期和保修到期日但需要仔细解析。我遇到过几种不同的日期格式所以正则表达式要写得灵活一些p_date re.compile(td(\d) (\d)月 (\d)/td) p_in_date re.compile(tdb(.*)(\d{2}) (\d)月 (\d)/b/td)4. 高级功能与优化技巧4.1 多线程加速查询当需要查询的服务器数量较多时单线程方式会很慢。我改进了脚本使用ThreadPoolExecutor实现多线程查询from concurrent.futures import ThreadPoolExecutor import threading pool ThreadPoolExecutor(10) # 10个线程并发在我的测试中查询100台服务器的信息单线程需要约15分钟而10个线程并发只需要不到2分钟。不过要注意线程数不是越多越好我建议控制在5-15之间避免被DELL的服务器限流。4.2 错误处理与重试机制网络请求难免会遇到各种问题。我增强了错误处理逻辑包括请求超时自动重试无效SN号跳过并记录解析失败时保留原始数据def safe_get(url, max_retry3): for i in range(max_retry): try: response requests.get(url, timeout10) if response.status_code 200: return response.text except Exception as e: print(f请求失败第{i1}次重试: {str(e)}) time.sleep(1) return None4.3 结果输出与格式美化脚本默认生成一个制表符分隔的文本文件但我更推荐输出为CSV格式方便用Excel打开import csv with open(server_info.csv, w, newline, encodingutf-8) as f: writer csv.writer(f) writer.writerow([SN号, 型号, 出厂日期, 保修到期]) writer.writerow([sn, model, in_date, out_date])对于大量数据还可以考虑使用pandas库进行更复杂的数据分析和可视化。5. 实际应用中的注意事项5.1 遵守网站爬取规则虽然这个脚本非常有用但使用时要注意不要设置过高的并发请求频率避免在高峰时段运行脚本可以考虑添加随机延迟time.sleep(random.uniform(0.5, 2)) # 随机延迟0.5-2秒5.2 处理特殊型号服务器某些特殊型号的DELL服务器如存储设备的页面结构可能不同。我遇到过以下几种特殊情况型号信息不在h1标签中保修信息使用不同的日期格式需要登录才能查看详细信息针对这些情况可以添加额外的解析逻辑或者手动处理少数特殊设备。5.3 定期维护脚本DELL的网站结构可能会更新所以建议每季度检查一次脚本是否仍然有效保存历史版本的脚本以便回滚在关键位置添加日志记录import logging logging.basicConfig(filenamedell_query.log, levellogging.INFO)6. 完整代码示例与使用说明6.1 单线程版本完整代码import requests import re import time from requests.exceptions import RequestException base_url https://www.dell.com/support/home/cn/zh/cnbsd1/product-support/servicetag/ def Get_Page(url): try: response requests.get(url, timeout10) if response.status_code 200: return response.text return None except RequestException: return None def Get_Info(s_code, sn): url_params {serviceTag: s_code} info_url https://www.dell.com/support/components/dashboard/cn/zh/cnbsd1/Warranty/GetWarrantyDetails r1 requests.post(info_url, dataurl_params, timeout10) h1 r1.text p_date re.compile(td(\d) (\d)月 (\d)/td) p_in_date re.compile(tdb(.*)(\d{2}) (\d)月 (\d)/b/td) date2 error if h1: c h1.split(\n) for i in c: if tdNBD in i: n c.index(i) date2 p_date.findall(c[n2]) elif f{sn}/b/td in i: n c.index(i) date1 p_in_date.findall(c[n1]) if date2 error: for i in c: if tdPOW in i: n c.index(i) date2 p_date.findall(c[n2]) elif td4 in i: n c.index(i) date2 p_date.findall(c[n2]) if date2 error: date2 [(error, error, error)] in_date f{date1[0][3]}-{date1[0][2]}-{date1[0][1]} out_date f{date2[0][2]}-{date2[0][1]}-{date2[0][0]} return in_date, out_date class DELLINFO: staticmethod def Get_Dellinfo(sn): html1 Get_Page(base_url sn) if html1: p1 re.compile(servicetag/(.*)/overview) p2 re.compile(h1 classmb-3 mb-lg-1 text-center text-lg-left position-relative word-break(.*)/h1) r1 p1.findall(html1) r2 p2.findall(html1) if r1 and len(r1) 1: date Get_Info(r1[0], sn) if r2 and len(r2) 1: server_mode r2[0] return server_mode, date return None, (None, None) if __name__ __main__: with open(D:/sn.txt, r, encodingutf-8) as f: for i in f: sn i.strip() info DELLINFO.Get_Dellinfo(sn) if info[0] and info[1][0] and info[1][1]: server_mode info[0] server_in_date info[1][0] server_out_date info[1][1] info_detail f{sn}\t{server_mode}\t{server_in_date}\t{server_out_date}\n print(info_detail) with open(D:/snlist.txt, a, encodingutf-8) as ff: ff.write(info_detail)6.2 使用步骤说明将需要查询的SN号保存到D:/sn.txt每行一个运行脚本等待执行完成结果会自动保存到D:/snlist.txt可以用Excel打开结果文件使用数据-分列功能按制表符分隔对于不熟悉Python的同事我通常会帮他们把脚本打包成exe文件这样他们双击就能运行。使用pyinstaller可以轻松实现pyinstaller -F dell_server_query.py7. 常见问题解决方案7.1 查询返回空结果如果某些服务器的查询结果为空可能是以下原因SN号输入错误字母O和数字0容易混淆服务器太老已不在DELL数据库中网络问题导致请求失败建议先手动在DELL官网验证这些SN号是否有效。7.2 日期格式不正确有时返回的日期格式可能不符合预期特别是在不同地区的DELL网站上。可以修改正则表达式来适应# 适配更多日期格式 p_date re.compile(td(\d)[-/](\d)[-/](\d)/td)7.3 请求被限制如果短时间内发送太多请求可能会被DELL服务器暂时限制。解决方法降低并发线程数增加请求间隔时间使用代理IP需谨慎我在实际使用中发现保持每秒2-3个请求的速度通常不会被限制。8. 脚本的扩展应用这个基础脚本可以根据实际需求进行各种扩展。比如与CMDB系统集成自动更新资产信息添加邮件通知功能在保修到期前提醒生成可视化报表展示服务器年龄分布与监控系统对接标记即将过保的设备最近我就扩展了一个新功能自动检查哪些服务器的保修将在3个月内到期每周一发邮件报告给运维团队。这个小小的改进让我们避免了多次因疏忽导致的过保服务中断。

更多文章