批量获取域名的工具subDomainsBrute好用,但是获取到的域名太多,不清楚每个域名是否都可以正常访问,所以使用python写了一个工具,来判断http或https页面是否可以访问,以及访问的标题内容。
代码如下,欢迎交流,需要自取。
"""
======================
@Auther:CacheYu
@Time:2019/10/24 下午
======================
"""
#!usr/bin/python
#coding:utf-8
from bs4 import BeautifulSoup
import urllib.request
import requests
import time
import io
import sys
#python3
# 判断是否能访问;获取标题;进行报错处理
def exception(url):
try:
r = requests.get(url=url)
time.sleep(0.01)
if(r.status_code == 200):
#判断获取的r的编码方式,如果是utf-8的话,则再进行utf-8编码(由于网页的原因,部分utf-8需要再次编码,否则,会出现乱码)
if(r.apparent_encoding=='utf-8'):
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, 'lxml')
title = soup.title.text.replace(' ','').replace('\t','').replace('\n','').replace('\r','')
print(url+'\t'+title)
else:
time.sleep(2)
print(url+'\t访问页面出错')
except requests.exceptions.ConnectionError:
time.sleep(2)
print(url+'\t未知的服务器')
except requests.exceptions.ConnectTimeout:
time.sleep(2)
print(url+'\t连接、读取超时')
# 获取每行url
def urls(lines):
for line in lines:
# 判断是否为空行
if (line =='\n'):
pass
else:
line = line.replace(' ','').replace('\t','').replace('\n','')
if(line[0:4] == 'http'):
exception(line)
else:
url_h = 'http://'+line
exception(url_h)
url_hs = 'https://'+line
exception(url_hs)
if __name__ =='__main__':
#test.txt是存放url或host的文件
file = open('test.txt')
lines = file.readlines()
print('开始检查:\nurl\t标题')
urls(lines)
file.close()
写的过程中,由于不熟悉,两个地方思考了很久。
一个是获取url的内容,是使用urllib.request还是使用request。已转发文章。
一个是由于获取了不同网站的内容,当提取标题的时候,涉及到如何统一编码。python3目前基本上解决了大部分编码问题,由于本次的编码有点特殊,同样的utf-8编码,一个页面可以正常转换,一个却变成乱码,如果均将编码转成utf-8,则其他编码格式,例如GB2312编码的网站则乱码显示。
python2和python3的一些不同
1) python2中默认使用ascii,python3中默认使用utf-8
2) Python2中,str就是编码后的结果bytes,str=bytes,所以s只能decode。
3) python3中的字符串与python2中的u'字符串',都是unicode,只能encode,所以无论如何打印都不会乱码,因为可以理解为从内存打印到内存,即内存->内存,unicode->unicode
4) python3中,str是unicode,当程序执行时,无需加u,str也会被以unicode形式保存新的内存空间中,str可以直接encode成任意编码格式,s.encode('utf-8'),s.encode('gbk')