Активный участник
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007
Откуда: Симферополь
Помог: 98 раз(а)
|
Собственно понадобился парсер инфы о фильме с этого сайта.
После недолгих поисков нашел готовый класс, но пришлось дописать, т.к. некоторые данные находятся на другой странице.
Итог. Функция для получения id фильма и информации. Результат работы вывод списка фильмов найденых по переданному имени фильма. Далее возврат результатов парсинга в виде json.
PHP:
скопировать код в буфер обмена
function getFromIMDB($tt=1) { // если $tt = 0 тогда делаем поиск, иначе парсим по id global $database, $mosConfig_absolute_path, $ka_proxy_ip, $ka_proxy_port, $ka_proxy_user, $ka_proxy_pass, $ka_imdb_user, $ka_imdb_pass; $movie_name = urlencode(mosGetParam ($_REQUEST, 'movie_name', '')); $movie_id = intval(mosGetParam ($_REQUEST, 'movie_id', null)); require_once($mosConfig_absolute_path.'/administrator/components/com_kinoarhiv/classes/class.snoopy.php'); require_once($mosConfig_absolute_path.'/administrator/components/com_kinoarhiv/classes/class.parser.imdb.php'); $search_url = 'http://www.imdb.com/find?s=tt;q='; $movie_url = 'http://imdb.com/title/tt'; $snoopy = new Snoopy; $snoopy->proxy_host = $ka_proxy_ip; $snoopy->proxy_port = $ka_proxy_port; $snoopy->proxy_user = $ka_proxy_user; $snoopy->proxy_pass = $ka_proxy_pass; $snoopy->user = $ka_imdb_user; $snoopy->pass = $ka_imdb_pass; $snoopy->agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'; $snoopy->rawheaders['Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0'; $snoopy->rawheaders['Pragma'] = 'no-cache'; $snoopy->rawheaders['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'; $snoopy->rawheaders['Accept-Language'] = 'ru,en-us;q=0.7,en;q=0.3'; $imdb = new IMDB_Parser; if ($tt == 1 && $movie_name != '') { if ($snoopy->fetch($search_url.$movie_name)) { $raw_search_page = $snoopy->results; echo '<div align="left">'; // Get "Popular Titles" preg_match('@<p><b>Popular Titles</b>(.*?)</p>@', $raw_search_page, $pt); if ($pt !== '') { $strip_pt = preg_replace('@ onClick="(.*?)"@i', '', $pt[0 ]); echo preg_replace('@<a href="/title/tt(.*?)/">@', '<a id="link_to_movie" href="javascript:void(0);" onClick="getIMDB(\'\\1\');">', $strip_pt); } // Get "Exact Matches" preg_match('@<p><b>Titles \(Exact Matches\)</b>(.*?)</p>@', $raw_search_page, $em); if ($em !== '') { $strip_em = preg_replace('@ onClick="(.*?)"@i', '', $em[0 ]); echo preg_replace('@<a href="/title/tt(.*?)/">@', '<a id="link_to_movie" href="javascript:void(0);" onClick="getIMDB(\'\\1\');">', $strip_em); } // Get "Partial Matches" preg_match('@<p><b>Titles \(Partial Matches\)</b>(.*?)</p>@', $raw_search_page, $pm); if ($pm !== '') { $strip_pm = preg_replace('@ onClick="(.*?)"@i', '', $pm[0 ]); echo preg_replace('@<a href="/title/tt(.*?)/">@', '<a id="link_to_movie" href="javascript:void(0);" onClick="getIMDB(\'\\1\');">', $strip_pm); } echo '</div>'; } else { echo 'error fetching document: '.$snoopy->error; } } else { header('Content-type: application/json'); if ($snoopy->fetch($movie_url.$movie_id)) { $movie_name = $database->getEscaped($imdb->getMovieTitle($snoopy->results, true)); $year = intval($imdb->getMovieYear($snoopy->results)); $genres_arr = array_unique($imdb->getMovieGenres($snoopy->results)); $genres = implode('|', $genres_arr); $cns_arr = array_unique($imdb->getMovieCountry($snoopy->results)); $tagline = $imdb->getMovieTagline($snoopy->results); $time = $imdb->getMovieRuntime($snoopy->results); $directed_by = $imdb->getMovieDirectedBy($snoopy->results); $rate = $imdb->getMovieStars($snoopy->results); if ($snoopy->fetch($movie_url.$movie_id.'/fullcredits')) { $scenario = $imdb->getMovieScenarists($snoopy->results); $actors = $imdb->getMovieCast($snoopy->results); $producers = $imdb->getMovieProducedBy($snoopy->results); $music_by = $imdb->getMovieMusicBy($snoopy->results); $operators = $imdb->getMovieOperator($snoopy->results); } $result = '{"movie_name":"'.$movie_name.'"},{"year":"'.$year.'"},{"genres":"'.$genres.'"},{"countries":"'.$cns.'"},{"slogan":"'.$tagline.'"},{"time":"'.$time.'"},{"dir_by":"'.$directed_by.'"},{"rate":"'.$rate.'"},{"imdb_id":"'.$movie_id.'"},{"scenarists":"'.$scenario.'"},{"actors":"'.$actors.'"},{"prod_by":"'.$producers.'"},{"music_by":"'.$music_by.'"},{"operators":"'.$operators.'"}'; echo $result; } else { echo '{"error":"Error fetching document - '.$snoopy->error.'"}'; } } }
функция JS для парсинга
CODE ( javascript):
скопировать код в буфер обмена
function getIMDB(id) { jQuery(document).ready(function($){ $.nyroModalManual({ content: "Please waiting...<br />Transfering data..." }); $.ajax({ beforeSend: function(xhr){ if (xhr.overrideMimeType) { xhr.overrideMimeType("application/json"); } }, type: "POST", url: "index3.php", data: "option=com_kinoarhiv&task=getFromIMDB&tt=0&movie_id="+id+"&no_html=1", dataType: "json", cache: false, success: function(data){ // выполняем на массивом данных нужные действия }, error: function(xhr){ alert("Something went wrong: "+xhr.responseText); } }); }); }
класс в вложении.
класс snoopy здесь http://sourceforge[dot]net/projects/snoopy/
Jquery - http://jquery[dot]com
$.nyroModal можно заменить любым другим плагином, поддерживающим загрузку html в "себя".
(Отредактировано автором: 22 Марта, 2010 - 07:54:38)
|