zoukankan      html  css  js  c++  java
  • php批量检查域名是否已注册并获取注册域名的注册公司

    一个小任务,给了一个包含了几千条域名的Excel,检测是否已经注册,注册的话获取注册公司,并获取对应网站是否能正常打开,最终以Excel文件呈现。

    1.起初,想到的就是读取域名,通过http调用 xinnet或者是万网的 whois查询接口查询,而后将页面结果正则匹配Registrant:,registrant organization:,registrant name:字段,获取该行:后边的内容。这样的结果就是很乱,很多注册公司不用这三个字段,没有一个统一的标准来判定是否注册及注册公司。

    2.后来搜到一个类似的解决方案 http://stackoverflow.com/questions/16234477/php-script-that-finds-the-registrar-of-any-domain-name ,直接通过读取 whois服务器,实现域名的查询。根据被查询域名的后缀名,访问不同的 whois服务器,查询结果。但是其包含的后缀也不全,而且很多返回的whois内容只有Registrar字段,并且运行中容易断掉。

    3.网上还有一种是调用 phpWhois 组件,实现 whois信息查询的核心代码部分:

    <pre><?php
    include('whois_inc/whois.main.php');
    $whois =newWhois();
    $result = $whois->Lookup($domain);
    $output = implode("
    ", $result['rawdata']);
    echo $output;?></pre>

    4.后来高人指点,应该先获取所有域名的whois信息到数据库,再慢慢分析,根据规律,分类,再分类,然后再获取。

    首先用PHPExcel将域名导入数据库。

    <?php
    error_reporting ( E_ALL ); // 开启错误
    set_time_limit ( 0 ); // 脚本不超时
    require_once 'library/PHPExcel.php';
    require_once 'library/PHPExcel/IOFactory.php';
    require_once 'library/PHPExcel/Reader/Excel5.php';
    $conn = mysql_connect ( "localhost", "root", "" );
    mysql_select_db ( "test1", $conn );
    mysql_query ( "set names utf8" );
    $inputFileName = './example.xls';
    // $inputFileName = './test.xls';
    $objReader = PHPExcel_IOFactory::createReader ( 'Excel5' ); 
    $objPHPExcel = $objReader->load ( $inputFileName ); // $filename可以是上传的文件,或者是指定的文件
    $sheet = $objPHPExcel->getSheet ( 0 );
    // var_dump($sheet);exit;
    $highestRow = $sheet->getHighestRow (); // 取得总行数
    $highestColumn = $sheet->getHighestColumn (); // 取得总列数
                                                 
    // 循环读取excel文件,读取一条,插入一条
    for($j = 2; $j <= $highestRow; $j ++) {
        $a = $objPHPExcel->getActiveSheet ()->getCell ( "A" . $j )->getValue (); 
        $b = $objPHPExcel->getActiveSheet ()->getCell ( "B" . $j )->getValue (); 
        $c = $objPHPExcel->getActiveSheet ()->getCell ( "C" . $j )->getValue ();
        
        $sql = "INSERT INTO domaininfo(domain,regdate,expdate) VALUES('$a','$b','$c')";
        mysql_query ( $sql );
    }
    echo "success";
    ?>

    linux系统可以使用whois 命令直接获取域名的whois信息,保存到数据库。

    <?php
    error_reporting ( E_ALL ); // 开启错误
    set_time_limit ( 0 ); // 脚本不超时
    $conn = mysql_connect ( "localhost", "test", "test1" );
    mysql_select_db ( "test", $conn );
    mysql_query ( "set names utf8" );
    $result = mysql_query ( "select * from domaininfo  " );
    while ( $row = mysql_fetch_array ( $result ) ) {
        $domain = $row['domain'];
        $retval = shell_exec("whois $domain");
        $retval = addslashes($retval);
        $sql = "update domaininfo set whois = '" . $retval . "'  where id = $row[id]";
        // echo $sql;exit;
        mysql_query ( $sql );
    }
    echo "over";
    ?>

    之后根据whois信息分类,将主表中域名逐渐分离到其他表中。

    根据匹配 no matching records或NOT FOUND或no match for 分离到domainNomatch表,
    匹配Registrant:并有返回值 if (preg_match ( '/registrants*:([^ ]+)/i', $row['whois'], $matches ))分离到一个表并获取$matches[1]为注册公司。

    匹配Registrant Organization:到一个表并获取注册公司,匹配Registrant name: 分离到一个表并获取。

    主表还剩下很多已注册但只有注册商没有注册公司返回的域名,大多是com后缀的,不知道为什么whois命令对com的域名返回的信息不够完整,后来对这些域名分离出来到一个网站上抓取匹配

    function getRegistantName($domain) {
        $url = "http://tool.admin5.com/whois/?q=$domain";
        $contents = @file_get_contents ( $url );
        // print_r($contents);echo "<br>";
        if (preg_match ( '/registrants*[Organization]*:([^<]+)/i', $contents, $matches )) {
            // print_r($matches);
            return trim ( $matches [1] );
        } elseif (preg_match ( '/registrants*[name]*:([^<]+)/i', $contents, $matches )) {
            return trim ( $matches [1] );
        } else {
            return "未找到信息";
        }
    }

    最后还剩下个位数的特殊域名直接手动处理了。。

    还有获取状态码:

    function getHttpStatusCode($url) {
         $curl = curl_init (); // 初始化新会话,返回curl句柄
         curl_setopt ( $curl, CURLOPT_URL, $url ); // 获取内容url
         curl_setopt ( $curl, CURLOPT_HEADER, 1 ); // 获取http头信息
         curl_setopt ( $curl, CURLOPT_NOBODY, 1 ); // 不返回html的body信息
         curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 ); // 返回数据流,不直接输出
         curl_setopt ( $curl, CURLOPT_TIMEOUT, 30 ); // 超时时长,单位秒
         curl_exec ( $curl ); // 执行该会话
         $rtn = curl_getinfo ( $curl, CURLINFO_HTTP_CODE );
         curl_close ( $curl ); // 关闭会话
         return $rtn;
     }

    各个表处理完后在输出到Excel文件,整合。

    相关代码:

    <?php
    header("Content-type: text/html; charset=utf-8");
    require_once "library/PHPExcel.php";
    require_once 'library/PHPExcel/IOFactory.php';
    require_once 'library/PHPExcel/Writer/Excel5.php';
    set_time_limit(0);
    
    //连接数据库
    $conn = mysql_connect ( "localhost", "test", "test1" );
    mysql_select_db ( "test", $conn );
    mysql_query ( "set names utf8" );
    $result = mysql_query("select * from domain_registrant");
    
    //导出excel
    $objPHPExcel = new PHPExcel();
    $objPHPExcel->setActiveSheetIndex(0)
    ->setCellValue('A1', '域名')
    ->setCellValue('D1', '是否注册')
    ->setCellValue('E1', '返回码')
    ->setCellValue('F1', '注册公司');
    $i = 2;
    while ($row = mysql_fetch_array($result)){
        $objPHPExcel->setActiveSheetIndex(0)
        ->setCellValue("A".$i, $row['domain'])
        ->setCellValue("D".$i, "已注册")
        ->setCellValue("E".$i, $row['code'])
        ->setCellValue("F".$i, $row['registrant']);
        $i++;
    }
        //输出新excel
    PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5')->save( "domain_registrant.xls");
    echo "over";
  • 相关阅读:
    VRRP(Virtual Router Redundancy Protocol)业界标准
    CISCO快速转发
    89、C++中将临时变量作为返回值时的处理过程
    87、C++函数调用的压栈过程
    82、类什么时候会析构?
    84、智能指针的原理、常用的智能指针及实现
    81、构造函数一般不定义为虚函数的原因
    80、构造函数析构函数可否抛出异常
    79、虚析构函数的作用,父类的析构函数是否要设置为虚函数?
    78、构造函数、析构函数的执行顺序?
  • 原文地址:https://www.cnblogs.com/eterwei/p/3737039.html
Copyright © 2011-2022 走看看