使用python获取网站http状态码,保存异常网站列表

批量检测网站是否可访问,正常网站返回的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
View Code

 

posted @ 2017-12-31 14:39  江南烟雨[0]  阅读(744)  评论(0编辑  收藏  举报