事情是这样的,一个朋友拿着一张Excel表,里面包含了网站名称和域名信息,数量在几百条左右吧,他想知道这张Excel表中的这些域名是否能打开,并想知道这个域名对应的IP地址(不考虑CDN这种情况),他的做法是,复制网址,然后在浏览器中输入该域名,如果能打开就标记个可以访问,不能访问的话,需要加个www的主机头,再进行测试。如果该域名可以访问,则打开cmd窗口ping
一下这个域名,得到其IP地址。
他说这样太慢了,有没有办法通过程序的形式进行检测。
我听了这需求,一个头两个大,使用.NET到是可以通过Dns
的GetHostAddresses
获取ip地址信息,也可以通过HttpClient
来判断域名是否可以访问。读取和导出Excel对于.NET来说,要写不少代码。怎么办呢?发现电脑上有Python环境,那就使用Python来简单实现下吧。又快又省事~~~
1、使用openpyxl
来处理Excel
2、使用pandas
来处理数据
3、使用requests
来判断域名是否可以访问
4、使用socket
来获取可访问域名的ip地址
5、使用asyncio
执行异步操作
pip install pandas requests openpyxl
async def read_excel(file_path):
# 'A'列是网站名称,'B'列是域名
df = pd.read_excel(file_path, usecols=['A','B'], engine='openpyxl')
return df[['A','B']].values.tolist()
async def is_url_reachable(url):
try:
response = requests.head(url, allow_redirects=True, timeout=10)
return response.status_code == requests.codes.ok except requests.RequestException:
return False
async def get_domain_ip(domain):
try:
# 使用socket获取IP地址
ip_address = socket.gethostbyname(domain)
return ip_address except socket.gaierror:
return None
async def check_url(file_path):
# 读取Excel文件中的域名列表
domains = await read_excel(file_path)
# 存储结果的字典
results = {}
for object in domains:
domain = object[1]
# 检查链接是否可访问
if 'www' in domain: #包含了www
reachable = await is_url_reachable(f'http://{domain}') # 检测是否可以访问
if reachable:
domain = f'http://{domain}'
else:
reachable = await is_url_reachable(f'https://{domain}') # 检测https是否可以访问
if reachable:
domain = f'https://{domain}'
else: #不包含www
reachable = await is_url_reachable(f'http://www.{domain}') #加上www进行访问
if reachable: # 可以访问
domain = f'http://www.{domain}'
else: # 无法访问
reachable = await is_url_reachable(f'https://www.{domain}') #加上www进行访问
if reachable: # 可以访问
domain = f'https://www.{domain}'
# 获取IP地址
ip_address = await get_domain_ip(domain.replace('http://', '').replace('https://', ''))
info = [object[0],domain,'可以访问' if reachable else '无法访问',ip_address]
print(info)
# 存储结果
results[domain] = {
'网站名称': object[0],
'域名': domain,
'是否可以访问': '可以访问' if reachable else '无法访问',
'IP地址': ip_address }
# 将结果保存到Excel文件中
df = pd.DataFrame(results).T
df.to_excel('E:/result.xlsx', index=False)
print(f"Results saved to 'result.xlsx'")
async def main():
await check_url('E:/111.xlsx')
if __name__ == "__main__":
asyncio.run(main())
运行python脚本后,在E盘生成了一个result.xlsx
文件,一共花了不到10分钟时间,一杯奶茶到手=^^=~