2007. 10. 29. 15:26
MNCAST 플래시 동영상 정보 수집 BOT
2007. 10. 29. 15:26 in 자작소스/PHP
<?php /** * bot_mncast.php * Create on Wed Sep 12 14:12:45 KST 2007 * Last modified on Wed Sep 12 14:12:45 KST 2007 * @author Kang YongSeok <wyseburn(at)gmail.com> * * mncast 플래시 동영상 정보수집 bot */ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * MNCAST 상세보기 페이지에서 태그내용을 리턴 * * @param text $html * @return text */ function getMncastTag($html) { $spos = strpos($html,"function loadComplete()"); $spos = strpos($html,"printMovieInfo",$spos); for($i=0;$i<13;$i++) { $spos = strpos($html,'"',$spos+1); } $epos = strpos($html,'"',$spos+1); return substr($html,$spos+1,$epos-$spos-1); } /** * 형태소로 잘라진 검색어를 쿼리형태로 리턴 * * @param int $no * @param text $str * @return text/null */ function getSearchKeywordQuery($no,$str){ if(empty($str)) return NULL; $txt = file_get_contents("XXXXXXXXX/getKeyword.php?keyword=".urlencode($str)); if(empty($txt)) return NULL; if(strpos($txt,'_')) return "(".$no.",'".str_replace('_',"'),(".$no.",'",$txt)."')"; else return "(".$no.",'".$txt."')"; } /** * 태그,태그,태그 형식을 쿼리형식으로 리턴 * * @param int $no * @param text $str * @return text */ function getTagQuery($no,$str) { if(empty($str)) return NULL; if(strpos($str,',')) return "(".$no.",'".str_replace(',',"'),(".$no.",'",$str)."')"; else return "(".$no.",'".$str."')"; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 에러출력을 제어 ini_set("display_errors","0"); // 수집내용을 저장할 로그파일을 설정 $log_filename = "~계정/log/mncast/LOG".date("Ymd").".txt"; $now_hour = date("H"); // 쉘모드에서 실행하므로 인자값을 받아 처리 // ex)/usr/local/php/bin/php /경로/bot_mncast.php 4 & ==> argv[0] = "not_mncast.php", argv[1] = "4" // 페이지 번호를 설정하면 페이지번호로 읽어들임 if($argv[1] && ctype_digit($argv[1])) { $pagenum = $argv[1]; } else { $pagenum = 1; } // mncast 카테고리별 목록(전체) 페이지 수집 LOOP do { // 플래시 중복체크 (이미 수집한 플래시 확인용) $duplication_count = 0; // 한페이지에서 수집한 플래시의 수 $collect_count = 0; // mncast의 경우 1~20 페이지는 HTML Caching을 사용하므로 페이지를 2개로 구성 if($pagenum <= 20) { $list_url = "http://www.mncast.com/category/Html/cate0-1-".$pagenum.".html"; } else { $list_url = "http://www.mncast.com/category/categoryList.asp?cate=0&sort=1&page=".$pagenum; } // 페이지의 HTML Source 를 읽어 들임 // getPageSource 함수 소스(http://wyseburn.tistory.com/52) $html = getPageSource($list_url); // 읽어들인 HTML Source에서 플래시 정보만 Parsing // parseString 함수 소스(http://wyseburn.tistory.com/54) // USE_STATIC 설정을 하면 static 변수를 기억하여 계속 사용가능 while(($str = parseString(&$html[1], "<div id='s_player'>", "</div>",USE_STATIC)) !== NULL) { // 상세보기 페이지를 읽어들이기 위한 key(md5)를 time으로 설정 $now_time = time(); // 이미지명과 이미지명속에 포함된 파일코드(파일명)를 읽음 $flash_flv_image = parseString($str, "<img src='", "'"); $spos = strrpos($flash_flv_image,"/") + 1; $epos = strrpos($flash_flv_image,'.') - $spos; $filename = substr($flash_flv_image,$spos,$epos); if(empty($filename)) { continue; } // 파일코드를 이용하여 플래시 정보XML 파일을 호출후 정보 추출 $xml = getPageSource("http://dory.mncast.com/_MovieInfoXML_.php?movieID=".$filename); $flash_flv_title = parseString(&$xml[1],"<title>","</title>"); $flash_flv_hit = parseString(&$xml[1],"<viewcnt>","</viewcnt>"); $flash_flv_url = parseString(&$xml[1],"<url>","</url>"); $flash_flv_playtime = parseString(&$xml[1],"<duration>","</duration>"); $flash_flv_num = parseString(&$xml[1],"<num>","</num>"); $flash_flv_contents = parseString(&$xml[1],"<content>","</content>"); $flash_flv_category1 = parseString(&$xml[1],"<cate1>","</cate1>"); $flash_flv_category2 = parseString(&$xml[1],"<cate2>","</cate2>"); $flash_flv_category = getCategoryCode($flash_flv_category1, $flash_flv_category2); // 파일코드에 포함된 등록 시간을 추출 $tmp_time = substr($filename,-14); $flash_flv_time = mktime(substr($tmp_time,8,2),substr($tmp_time,10,2),substr($tmp_time,12,2),substr($tmp_time,4,2),substr($tmp_time,6,2),substr($tmp_time,0,4)); if(empty($flash_flv_num)) { continue; } // 추출된 플래시가 이미 등록되있는지 확인 $result = mysql_query("SELECT COUNT(*) FROM flash_flv_info WHERE no = ".$flash_flv_num); if(@mysql_result($result,0)) { // 이미 등록된 플래시가 4회이상 존재한다면 이후 정보는 이미 추출한 정보이므로 종료 if($duplication_count >= 4) { // 로그 저장 saveText($log_filename, $now_hour."|".$pagenum."|".$collect_count."|".$duplication_count."\n"); exit; } $duplication_count++; continue; } // 상세보기에서 필요한 정보추출을 위해 상세보기 HTML Source 추출 $tag = getPageSource("http://www.mncast.com/player/index.asp?mnum=".$flash_flv_num."&tKey=".$now_time."&eKey=".md5($now_time)); // 상세보기에서 태그내용을 추출 $flash_flv_tag = getMncastTag(&$tag[1]); if($flash_flv_tag === ',') { $flash_flv_tag = ''; } // 추출한 flash 영상 정보를 등록 $result = mysql_query(" INSERT INTO flash_flv_info SET no=".$flash_flv_num.", category=".$flash_flv_category.", category1=".$flash_flv_category1.", category2=".$flash_flv_category2.", play_time=".$flash_flv_playtime.", hit=".$flash_flv_hit.", reg_time=".$flash_flv_time.", tag='".$flash_flv_tag."', image_url='".$flash_flv_image."', flv_url='http://".$flash_flv_url.".flv', title='".mysql_real_escape_string($flash_flv_title)."' "); if(mysql_affected_rows()) { // 제목을 형태소로 분리하여 검색키워드로 저장 $keyword_query = getSearchKeywordQuery($flash_flv_num,$flash_flv_title); if($keyword_query) { mysql_query("INSERT INTO flash_flv_keyword (no, keyword) VALUES ".$keyword_query); } if($flash_flv_tag) { // 태그를 테이블에 저장 $tag_query = getTagQuery($flash_flv_num,$flash_flv_tag); if($tag_query) { mysql_query("INSERT INTO flash_flv_tag (no, tag) VALUES ".$tag_query); } } // 상세보기를 별도 테이블에 저장(홈페이지 상세보기이외에는 사용처가 없으므로 분리) mysql_query("INSERT INTO flash_flv_contents (no, contents) VALUES (".$flash_flv_num.",'".mysql_real_escape_string($flash_flv_contents)."')"); // flv 파일이 필요할경우 flash 파일을 저장 // 원격 파일을 로컬에 저장하는 함수 (http://wyseburn.tistory.com/53) // getRemoteFile($flash_flv_url,"경로/".$filename.".flv"); $collect_count++; } } // HTML Source 페이지의 내용을 리셋 parseString("", "", "", USE_STATIC | USE_RESET); // 로그를 저장 (http://wyseburn.tistory.com/80) saveText($log_filename, $now_hour."|".$pagenum."|".$collect_count."\n"); $pagenum++; } while($collect_count); ?>