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";