標籤:style class blog c code java
一個小任務,給了一個包含了幾千條網域名稱的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><?phpinclude(‘whois_inc/whois.main.php‘);$whois =newWhois();$result = $whois->Lookup($domain);$output = implode("\n", $result[‘rawdata‘]);echo $output;?></pre>
4.後來高人指點,應該先擷取所有網域名稱的whois資訊到資料庫,再慢慢分析,根據規律,分類,再分類,然後再擷取。
首先用PHPExcel將網域名稱匯入資料庫。
<?phperror_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資訊,儲存到資料庫。
<?phperror_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檔案,整合。