孤立问题
利用test_learn孤立出问题. 典型场景是一大段程序执行当中发现正则表达式匹配出错,此时最好是大原先的字符串复制出来,然后放在test_learn中,用不同的正则表达式调试,调试成功了就可以用了.
循环内的问题
典型场景是循环了1000次,然后里面地745次执行会出问题. 如果此时设置断点的话,需要运行很久才才能发现问题. 可以采用加入判断语句的技巧来定位问题.参考下面的代码:
for i in range(1000):
do_something(i) # i=745会报错
for i in range(1000):
if i == 745:
print(1) # 断点设置在这里
do_something(i)
网络环境中出现的问题
典型场景:网络环境中出现中断等问题,导致爬虫程序卡断,报错.print的记录不够详细.对这个情况应该记录最好要记录详细的日志,然后根据日志来查询问题. 记录日志采用.frm数据格式.其中把内容都保存下来,出现问题后打开查看其中的问题在哪里. 参考下面的案例:
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}) # 这里有返回结果记录
# 另外写读取日志文件的函数
def read_log():
log_frm = pd.read_pickle(log_file_path)
problem_request_list = []
for i in log_frm.index:
# 这里可以改写为自己需要其他检查规则
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 )
网络方面会发现很多预料之外的问题,因此原则上要建立详尽的日志系统.方便以后排查问题.