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("\n", $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 ( '/registrant\s*:([^\r\n]+)/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 ( '/registrant\s*[Organization]*:([^<]+)/i', $contents, $matches )) {
        // print_r($matches);
        return trim ( $matches [1] );
    } elseif (preg_match ( '/registrant\s*[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";

 

 

 

posted @ 2014-05-19 16:06  eterwei  阅读(583)  评论(0编辑  收藏  举报