使用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
相關文章
相關標籤/搜索