休闲篇:使用Python检测网址是否可以打开并获取该网址的IP地址

事情是这样的,一个朋友拿着一张Excel表,里面包含了网站名称和域名信息,数量在几百条左右吧,他想知道这张Excel表中的这些域名是否能打开,并想知道这个域名对应的IP地址(不考虑CDN这种情况),他的做法是,复制网址,然后在浏览器中输入该域名,如果能打开就标记个可以访问,不能访问的话,需要加个www的主机头,再进行测试。如果该域名可以访问,则打开cmd窗口ping一下这个域名,得到其IP地址。
他说这样太慢了,有没有办法通过程序的形式进行检测。
我听了这需求,一个头两个大,使用.NET到是可以通过DnsGetHostAddresses获取ip地址信息,也可以通过HttpClient来判断域名是否可以访问。读取和导出Excel对于.NET来说,要写不少代码。怎么办呢?发现电脑上有Python环境,那就使用Python来简单实现下吧。又快又省事~~~

主要思路

1、使用openpyxl来处理Excel
2、使用pandas来处理数据
3、使用requests来判断域名是否可以访问
4、使用socket来获取可访问域名的ip地址
5、使用asyncio执行异步操作

具体操作

先安装下需要的库

pip install pandas requests openpyxl

定义读取Excel的方法

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

获取域名的IP地址

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分钟时间,一杯奶茶到手=^^=~