思路:根據請求url返回的html進行處理,獲取對應的信息
相關url
1、自助查詢
https://www.dell.com/support/home/cn/zh/cnbsd1/
2、指定sn號查詢(GET請求)
https://www.dell.com/support/home/cn/zh/cnbsd1/product-support/servicetag/ 加上sn號
3、服務器詳情頁面(POST請求,需要提交"serviceTag"值,可從第二個url返回的html中獲取)
https://www.dell.com/support/components/dashboard/cn/zh/cnbsd1/Warranty/GetWarrantyDetails
用法
D:盤根目錄創建txt文檔,名爲sn.txt;存入svn清單,執行後會生成snlist文件,包含sn-型號-出廠-過保日期
其他自定義目錄可自行修改
import requests,re,time
from requests.exceptions import RequestException
base_url='https://www.dell.com/support/home/cn/zh/cnbsd1/product-support/servicetag/'
def Get_Page(url): #根據sn號獲取返回頁面
try:
response = requests.get(url)
if response.status_code == 200:
return response.text
return None
except RequestException:
return None
def Get_Info(s_code): #根據返回碼,獲取信息
url_params = {"serviceTag":s_code}
info_url='https://www.dell.com/support/components/dashboard/cn/zh/cnbsd1/Warranty/GetWarrantyDetails'
r1=requests.post(info_url,data=url_params)
h1=r1.text
p_date=re.compile("<td>(\d+) (\d+)月 (\d+)</td>")
p_in_date=re.compile('<td><b>(.*)(\d{2}) (\d+)月 (\d+)</b></td>')
date2='error'
if h1:
c=h1.split("\n")
for i in c:
if '<td>NBD' in i: #檢測下一個工作日服務(優先級以上門服務器日期爲準)
n=c.index(i)
# date1=p_date.findall(c[n+1])
date2=p_date.findall(c[n+2])
elif '%s</b></td>'%sn in i:
n = c.index(i)
date1=p_in_date.findall(c[n+1])
# print(date1)
if date2=='error': #因爲服務器型號不用,包含的服務不同,所以下面做了較多的判斷
for i in c:
if '<td>POW' in i: #檢查部件保修服務
n = c.index(i)
date2 = p_date.findall(c[n + 2])
elif '<td>4' in i: #檢查24小時上門
n = c.index(i)
date2 = p_date.findall(c[n + 2])
if date2=='error':
date2=[('error','error','error')] #返回錯誤數據
in_date = ((date1[0][3] + '-' + date1[0][2] + '-' + date1[0][1])) # 格式化日期
out_date = ((date2[0][2] + '-' + date2[0][1] + '-' + date2[0][0]))
else:
in_date = ((date1[0][3] + '-' + date1[0][2] + '-' + date1[0][1])) # 格式化日期
out_date = ((date2[0][2] + '-' + date2[0][1] + '-' + date2[0][0]))
return in_date,out_date
class DELLINFO():
def __init__(self,sn):
self.sn=sn
def Get_Dellinfo(sn): # 主程序
html1 = Get_Page(base_url + sn)
if html1:
p1 = re.compile('servicetag/(.*)/overview"')
p2 = re.compile('<h1 class="mb-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])
if r2 and len(r2) == 1:
server_mode = r2[0]
return server_mode, date
with open('D:\sn.txt','r',encoding='utf-8') as f:
for i in f:
sn=i.strip()
info=DELLINFO.Get_Dellinfo(sn)
if len(info)==2:
server_mode=info[0]
server_in_date=info[1][0]
server_out_date=info[1][1]
info_detail=sn+'\t'+server_mode+'\t'+server_in_date+'\t'+server_out_date+'\n'
print(server_mode)
print(server_in_date)
print(server_out_date)
with open('D:snlist.txt','a',encoding='utf-8') as ff:
ff.write(info_detail)
多線程版本
import requests,re,time
from requests.exceptions import RequestException
from concurrent.futures import ThreadPoolExecutor
import threading
base_url='https://www.dell.com/support/home/cn/zh/cnbsd1/product-support/servicetag/'
def Get_Page(url): #根據sn號獲取返回頁面
try:
response = requests.get(url)
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,data=url_params)
h1=r1.text
p_date=re.compile("<td>(\d+) (\d+)月 (\d+)</td>")
p_in_date=re.compile('<td><b>(.*)(\d{2}) (\d+)月 (\d+)</b></td>')
date2='error'
if h1:
c=h1.split("\n")
for i in c:
if '<td>NBD' in i: #檢測下一個工作日服務(優先級以上門服務器日期爲準)
n=c.index(i)
# date1=p_date.findall(c[n+1])
date2=p_date.findall(c[n+2])
elif '%s</b></td>'%sn in i:
n = c.index(i)
date1=p_in_date.findall(c[n+1])
# print(date1)
if date2=='error': #因爲服務器型號不用,包含的服務不同,所以下面做了較多的判斷
for i in c:
if '<td>POW' in i: #檢查部件保修服務
n = c.index(i)
date2 = p_date.findall(c[n + 2])
elif '<td>4' in i: #檢查24小時上門
n = c.index(i)
date2 = p_date.findall(c[n + 2])
if date2=='error':
date2=[('error','error','error')] #返回錯誤數據
in_date = ((date1[0][3] + '-' + date1[0][2] + '-' + date1[0][1])) # 格式化日期
out_date = ((date2[0][2] + '-' + date2[0][1] + '-' + date2[0][0]))
else:
in_date = ((date1[0][3] + '-' + date1[0][2] + '-' + date1[0][1])) # 格式化日期
out_date = ((date2[0][2] + '-' + date2[0][1] + '-' + date2[0][0]))
return in_date,out_date
def write_data(server_mode,date,sn):
server_mode = server_mode
server_in_date = date[0]
server_out_date = date[1]
info_detail = sn + '\t' + server_mode + '\t' + server_in_date + '\t' + server_out_date + '\n'
print(server_mode)
print(server_in_date)
print(server_out_date)
with open('D:snlist.txt', 'a', encoding='utf-8') as ff:
ff.write(info_detail)
class DELLINFO():
def __init__(self,sn):
self.sn=sn
def Get_Dellinfo(sn): # 主程序
html1 = Get_Page(base_url + sn)
if html1:
p1 = re.compile('servicetag/(.*)/overview"')
p2 = re.compile('<h1 class="mb-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]
write_data(server_mode,date,sn)
if __name__=='__main__':
t_list = []
sn_list=[]
pool=ThreadPoolExecutor(10)
# freeze_support()
with open('D:\sn.txt','r',encoding='utf-8') as f:
for i in f.readlines():
sn_list.append(i.strip())
t = threading.Thread(target=DELLINFO.Get_Dellinfo, args=(i.strip(),))
t_list.append(t)
t.start()
for t in t_list:
t.join()