孤立問題
利用test_learn孤立出問題. 典型場景是一大段程序執(zhí)行當中發(fā)現(xiàn)正則表達式匹配出錯,此時最好是大原先的字符串復(fù)制出來,然后放在test_learn中,用不同的正則表達式調(diào)試,調(diào)試成功了就可以用了.
循環(huán)內(nèi)的問題
典型場景是循環(huán)了1000次,然后里面地745次執(zhí)行會出問題. 如果此時設(shè)置斷點的話,需要運行很久才才能發(fā)現(xiàn)問題. 可以采用加入判斷語句的技巧來定位問題.參考下面的代碼:
for i in range(1000):
do_something(i) # i=745會報錯
for i in range(1000):
if i == 745:
print(1) # 斷點設(shè)置在這里
do_something(i)
網(wǎng)絡(luò)環(huán)境中出現(xiàn)的問題
典型場景:網(wǎng)絡(luò)環(huán)境中出現(xiàn)中斷等問題,導(dǎo)致爬蟲程序卡斷,報錯.print的記錄不夠詳細.對這個情況應(yīng)該記錄最好要記錄詳細的日志,然后根據(jù)日志來查詢問題. 記錄日志采用.frm數(shù)據(jù)格式.其中把內(nèi)容都保存下來,出現(xiàn)問題后打開查看其中的問題在哪里. 參考下面的案例:
for url_i in url_list:
res = requests.get(headers=headers, url=url_i, timeout = 5) # 時不時會出問題
for url_i in url_list:
begin_time = time.time()
request_id += 1
save_log(datetime.now(), {'headers': headers, 'url': url_i, 'reqeust_id ':reqeust_id }) #出問題這里會有日志記錄.
requests.get(headers=headers, url=url_i, timeout = 5)
save_log(datetime.now(), {'request_id ':request_id , 'time_cost': time.time()-begin_time, 'res': res}) # 這里有返回結(jié)果記錄
# 另外寫讀取日志文件的函數(shù)
def read_log():
log_frm = pd.read_pickle(log_file_path)
problem_request_list = []
for i in log_frm.index:
# 這里可以改寫為自己需要其他檢查規(guī)則
if time_cost in log_frm.loc[i,'detail'].keys() and log_frm.loc[i,'detail']['time_cost '] > 100
problem_request_list.append( log_frm.loc[i,'detail']['request_id'])
io_state.write(problem_request_list )
網(wǎng)絡(luò)方面會發(fā)現(xiàn)很多預(yù)料之外的問題,因此原則上要建立詳盡的日志系統(tǒng).方便以后排查問題.