@bakhritdinov_b

PHP парсер с поддержкой proxy функции это реально?

Здравствуйте, есть скрипт "Парсер Кинопоиса" который работает отлично, но Кинопоиск блокирует IP. (К сожалению IP статический. Вот сам скрипт
<?php
require "DB.php";
	$id = $_GET['id'];
	header('Content-Type: text/json; charset=utf-8');
	if ($json = DB::query("SELECT json FROM cache WHERE id=$id")) {
		echo $json[0]['json'];
		DB::query("UPDATE cache SET hit=hit+1 WHERE id=$id");
	} else {
		include "Snoopy.class.php";
		$snoopy = new Snoopy;
		$snoopy -> maxredirs = 2;
		
		//авторизация, чтобы не банили
		$post_array = array(
			'shop_user[login]' => 'dimmduh',
			'shop_user[pass]' => 'gfhjkm03',
			'shop_user[mem]' => 'on',
			'auth' => 'go',
		);
		$snoopy -> agent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; uk; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 Some plugins";
		// отправляем данные для авторизации
		$snoopy->submit('http://www.kinopoisk.ru/level/30/', $post_array);
		
		$snoopy -> fetch('http://www.kinopoisk.ru/film/' . $id);
		$main_page = $snoopy -> results;
		$main_page = iconv('windows-1251' , 'utf-8', $main_page);
		// страница с трейлерами
		$snoopy -> fetch('http://www.kinopoisk.ru/film/' . $id . '/video/type/1/');
		$trailers_page = $snoopy -> results;
		$trailers_page = iconv('windows-1251' , 'utf-8', $trailers_page);
		
		$parse = array(
			'name' =>         '#<h1.*?class="moviename-big".*?>(.*?)</h1>#si',
			'originalname'=>  '#<span itemprop="alternativeHeadline">(.*?)</span>#si',
			'year' =>         '#год</td>.*?<a[^>]*>(.*?)</a>#si',
			'country_title' =>'#страна</td>.*?<td[^>]*>(.*?)</td>#si',
			'slogan' =>       '#слоган</td><td[^>]*>(.*?)</td></tr>#si',
			'actors_main' =>  '#В главных ролях:</h4>[^<]*<ul>(.*?)</ul>#si',
			'actors_voices' =>'#Роли дублировали:</h4>[^<]*<ul>(.*?)</ul>#si',
			'director' =>     '#режиссер</td><td[^>]*>(.*?)</td></tr>#si',
			'script' =>       '#сценарий</td><td[^>]*>(.*?)</td></tr>#si',
			'producer' =>     '#продюсер</td><td[^>]*>(.*?)</td></tr>#si',
			'operator' =>     '#оператор</td><td[^>]*>(.*?)</td></tr>#si',
			'composer' =>     '#композитор</td><td[^>]*>(.*?)</td></tr>#si',
			'genre' =>        '#жанр</td><td[^>]*>[^<]*<span[^>]*>(.*?)</span>#si',
			'budget' =>       '#бюджет</td>.*?<a href="/level/85/film/[0-9]+/" title="">(.*?)</a>#si',
			'usa_charges' =>  '#сборы в США</td>.*?<a href="/level/85/film/[0-9]+/" title="">(.*?)</a>#si',
			'world_charges' =>'#сборы в мире</td>.*?<a href="/level/85/film/[0-9]+/" title="">(.*?)</a>#si',
			'rus_charges' =>  '#сборы в России</td>.*?<div style="position: relative">(.*?)</div>#si',
			'world_premiere'=>'#премьера \(мир\)</td>[^<]*<td[^>]*>.*?<a[^>]*>(.*?)</a>#si',
			'rus_premiere' => '#премьера \(РФ\)</td>[^<]*<td[^>]*>.*?<a[^>]*>(.*?)</a>#si',
			'time' =>         '#id="runtime">(.*?)</td></tr>#si',
			'description' =>  '#<span class=\"_reachbanner_\"><div class=\"brand_words\"[^>]*>(.*?)</div></span>#si',
			'imdb' =>         '#IMDB:\s(.*?)</div>#si',
			'kinopoisk' =>    '#<div id="block_rating".*?<span class="rating_ball">(.*?)</span>#si',
			'kp_votes' =>     '#<span style=\"font:100 14px tahoma, verdana\">(.*?)</span>#si',
		);
		$trailers_parse = array(
			'url' =>     '#<a href="/getlink\.php[^"]*?link=([^"]*)" class="continue">(.*?)</a>#si',
			'trailer_page' => '#<a href="([^"]*)" class="all"#si',
			'html'	=> '#<!-- ролик -->([\w\W]*?)<!-- \/ролик -->#si'
		);
	 
	 
		$new=array();
		foreach($parse as $index => $value){
			if (preg_match($value,$main_page,$matches)) {
				if (in_array($index, array('actors_voices','actors_main'))) { // здесь нужен дополнительный парсинг
					if (preg_match_all('#<li itemprop="actors"><a href="/name/(\d+)/">(.*?)</a></li>#si',$matches[1],$matches2,PREG_SET_ORDER)) {
						$new[$index] = array();
						foreach ($matches2 as $match) {
							if (strip_tags($match[2]) != '...') $new[$index][] = array('name'=>strip_tags($match[2]),'id'=>$match[1]);
						}
					}
				} else if (in_array($index, array(
												'director',
												'script',
												'producer',
												'operator',
												'composer',
											))) {
					if (preg_match_all('#<a href="/name/(\d+)/">(.*?)</a>#si',$matches[1],$matches2,PREG_SET_ORDER)) {
						$new[$index] = array();
						foreach ($matches2 as $match) {
							if (strip_tags($match[2]) != '...') $new[$index][] = array('name'=>strip_tags($match[2]),'id'=>$match[1]);
						}
					}
				} else if ($index == 'genre') {
					if (preg_match_all('#<a href="/lists/.*?/(\d+)/">(.*?)</a>#si',$matches[1],$matches2,PREG_SET_ORDER)) {
						$new[$index] = array();
						foreach ($matches2 as $match) {
							if (strip_tags($match[2]) != '...') $new[$index][] = array('title'=>strip_tags($match[2]),'id'=>$match[1]);
						}
					}
				} else if ($index == 'poster_url') {
					$new[ $index ] = 'http://www.kinopoisk.ru' . $matches[1];
				} else {
					$new[ $index ] = preg_replace('#\\n\s*#si', '', html_entity_decode(strip_tags($matches[1]),ENT_COMPAT | ENT_HTML401, 'UTF-8'));
					$new[ $index ] = result_clear( $new[ $index ], $index );
				}			
			}
		}
		$new['poster_url'] = 'http://www.kinopoisk.ru/images/film_big/' . $id . '.jpg';
		$url = array();
		$trailer_page = array();
		$all_trailers = array();
		foreach($trailers_parse as $index => $regex){
			if ($index == 'html') {
				if (preg_match_all($regex, $trailers_page, $matches, PREG_SET_ORDER)) {
					foreach ($matches as $match) { // по всем трейлерам (в каждом по нескольку видео в разном качестве)
						
						if (preg_match('#<tr>[\w\W]*?<a href="[^"]*" class="all">(.*?)</a>\s*<table[\w\W]*?</table>[\w\W]*?<tr>[\w\W]*?<table[\w\W]*?</table>[\w\W]*?<tr>[\w\W]*?<table[\w\W]*?</td>\s*<td>([\w\W]*?)</table>[\w\W]*?<td[\w\W]*?<td>([\w\W]*?)</table>#si', $match[1], $title_sd_hd_matches)) { // название, стандартное качество и HD
							$trailer_family = array();
							$trailer_family['title'] = $title_sd_hd_matches[1];
							// SD качество
							$sd = array();
							if (preg_match_all('#<a href="/getlink\.php[^"]*?link=([^"]*)" class="continue">(.*?)</a>#si', $title_sd_hd_matches[2], $single_videos, PREG_SET_ORDER)) {
								foreach ($single_videos as $single_video){
									$sd[] = array(
										'url' => $single_video[1],
										'quality' => strip_tags($single_video[2])
									);
								}
							}
							$trailer_family['sd'] = $sd;
							// HD качество
							$hd = array();
							if (preg_match_all('#<a href="/getlink\.php[^"]*?link=([^"]*)" class="continue">(.*?)</a>#si', $title_sd_hd_matches[3], $single_videos, PREG_SET_ORDER)) {
								foreach ($single_videos as $single_video) {
									$hd[] = array(
										'url' => $single_video[1],
										'quality' => strip_tags($single_video[2])
									);
								}
							}
							$trailer_family['hd'] = $hd;
							$all_trailers[] = $trailer_family;
						}
						
					}
				}
			} else if (preg_match_all($regex,$trailers_page,$matches,PREG_SET_ORDER)) {
				foreach ($matches as $match) {
					${$index}[] = $match[1];
				}
			}
		}
		// переходим по ссылке на страницу главного трейлера и качаем ссылки на видео оттуда
		$main_trailer_url = array();
		if (isset($trailer_page[0])) {
			$snoopy -> fetch('http://www.kinopoisk.ru' . $trailer_page[0]);
			$main_trailer_page = $snoopy -> results;
			$main_trailer_page = iconv('windows-1251' , 'utf-8', $main_trailer_page);
			file_put_contents('main_trailer_'.$id.'.html', $main_trailer_page );			
			if (preg_match_all('#<a href="/getlink\.php[^"]*?link=([^"]*)" class="continue">(.*?)</a>#si',$main_trailer_page,$matches,PREG_SET_ORDER)) {
				foreach ($matches as $match) {
					$main_trailer_url[] = array('description'=>strip_tags($match[2]),'url'=>$match[1]);
				}
			}		
		}
		$new['trailer_url'] = $main_trailer_url[count($main_trailer_url)-1]['url'];
		$new['trailers'] = $all_trailers;
		$json = json_encode(array(
				'movie' => $new,
			)
		);
		echo $json;
		DB::query("INSERT IGNORE INTO cache SET id=$id, json='".str_replace(array("\\","'"), array("\\\\","\\'"), $json)."'");
	}
	
	function result_clear( $val, $key = '' ){
		if ( empty( $val ) || $val == '-' ){
			$val = '';
		} else {
			$pattern = array('&nbsp;', '&laquo;', '&raquo;');
			$pattern_replace = array(' ','','');
			$val = str_replace( $pattern, $pattern_replace, $val );
		}
		switch ($key) {
			case 'genre':
			case 'producer':
			case 'operator':
			case 'director':
			case 'script':
			case 'composer':
				$val = str_replace(', ...','', $val );
				break;
		}
		
		return $val;
	}
	
	function p( $ar ){
		print_r( $ar );
	}
?>

Можно ли здесь реализовать curl_proxy? чтоб была возможность указать настройки прокси сервера.
Заранее спасибо за ответы! (если понадобиться класс Snoopy.class.php) вот ссылка ТУТ
  • Вопрос задан
  • 3958 просмотров
Решения вопроса 1
BuriK666
@BuriK666
Компьютерный псих
40-44 строки
var $proxy_host =	""; // proxy host to use
var $proxy_port =	""; // proxy port to use
var $proxy_user =	""; // proxy user to use
var $proxy_pass =	""; // proxy password to use
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
EnterSandman
@EnterSandman
Эникей
И, наверное, Dom лучше парсить, чем регулярками извращаться
Ответ написан
@kuznetsov_anatoliy
написание парсеров, видео парсеров
Snoopy.class поддерживает прокси, данный класс не поддерживает https
класс хороший
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы