批量检测网站是否可访问,正常网站返回的http状态码是200,将不能访问的网站列表保存至本地txt文件
所用到的知识:
1. urllib库,用来访问网站,获取状态码;
2. try...expect语法,访问出错的时候可以获取出错原因以及出错http状态码;
3. set集合,因为提交的网站列表可能有重复,所以使用set保存出错网站列表可以直接自动去重;
4. 文件操作:文件读取,逐行append写入、一次性全部写入;
5. 基本的函数知识,直接调用函数,传入待检测的网站列表路径就可以了;
使用方法:
1. 复制代码,保存成.py文件;
2. 在同一目录下,新建文本文档:“域名表.txt”, 将待检测的网站按行放入,例如: baidu.com, 不需要http://www.
需进一步优化和学习的地方:
1. 怎么实现多线程;
2. 没有考虑保存中文到'异常域名.txt'文件;
以下是代码:
#!/usr/bin/env python # -*- coding:utf-8 -*- import urllib.request import urllib.error import time def get_error_domain(domain_list): # 将获取网站状态码以及输出异常域名的功能写成函数,调用的时候只需要将文件路径放进参数即可 error_list = set() # 预定义一个set集合,因为set集合是自动去重的,后面有用 url_list = open(domain_list, 'r') for line in url_list: if len(line.strip()): # 将空行去掉,满足非空行的行可以进入条件进行循环 line_no_blank = line.strip() url = "http://www."+ line_no_blank error_code = '' error_reason = '' try: # 使用try except语句避免因异常域名导致整个for大循环报错终止 start = time.clock() file = urllib.request.urlopen(url,timeout=15) elapsed = (time.clock() - start) # 获取访问时长 print("%s---->%s, 耗时%s" %(line_no_blank,file.getcode(),elapsed)) except urllib.error.URLError as e: # 异常域名会进入except,可以得到出错原因和出错http状态码 print("%s异常" % line_no_blank) if hasattr(e, "code"): print("错误状态码:%s" % e.code) error_code = str(e.code) if hasattr(e, "reason"): print("出错原因:%s" % e.reason) error_reason = str(e.reason) error_status = error_code + '\t'+error_reason error_list.add(line_no_blank+'\t'+error_status+"\n") # 将所有异常域名存入set集合,会自动去重 url_list.close() print("所有异常域名:") for line in error_list: # 循环打印 print(line) abnormal_list = open('异常域名.txt', 'w') # 如果之前有检测记录,则直接被覆盖 abnormal_list.writelines(error_list) # 将set的元素全部一次性写入 abnormal_list.close() # 关闭文件句柄 get_error_domain('域名表.txt') # 调用函数,传入需要检测的域名表文件名,一行一个,不需要加http://www., 例如: baidu.com