Задать вопрос
@lemonlimelike

Почему не хочется парсить кинопоиск?

Всем привет! Написал парсер. Первым делом я получаю json ответ, в котором есть id фильма на кинопоиске. Из этого id делаю ссылку на кинопоиск. Затем я получаю данные по этому фильму. Таких id'шек около 15к. Получается что парсеру нужно 15к раз зайти на по каждой ссылке на кинопоиск и взять нужные данные. Но парсится лишь первые 2 фильма, затем ошибка, что переменная `$img пуста`. Затем если я сразу же запускаю еще раз скрипт, то он сразу же.. на первой обработке первого массива происходит ошибка, что `$img` пуста. Что делать? Подскажите, есть ли альтернатива кинопоиску?
Вот скрипт:
$url = file_get_contents('url');
$json = json_decode($url, true);
echo 'Работает: '. PHP_EOL;
$start = microtime(true);
foreach ($json as $k => $value) {
    // echo $k. '--';
    // print_r($value);
    echo "Заходим на Kinopoisk по id: " . $value['kinopoisk_id'] . PHP_EOL;
    $newUrl = new Crawler(file_get_contents('https://www.kinopoisk.ru/film/' . $value['kinopoisk_id']));

    echo 'Ждем 5 сек раз'.PHP_EOL;
    sleep(5);

    $img = $newUrl->filter('.popupBigImage img')->attr('src');

    echo 'Ждем 5 сек два'.PHP_EOL;
    sleep(5);

    $rating = $newUrl->filter('.rating_ball')->text();

    echo 'Ждем 5 сек три'.PHP_EOL;
    sleep(5);

    $films = Films::where('name',$value['name'])->first();
    if($films == null){
        $film = new Films();
        $film->name = $value['name'];
        $film->translate = 'Нормальный';
        $film->url = $value['url'];
        $film->year = $value['year'];
        $film->img = $img;
        $film->rating = $rating;
        $film->kinopoisk_id = $value['kinopoisk_id'];
        $film->save();
    }
}
  • Вопрос задан
  • 6353 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
@DanKud
Во-первых конечно проверьте какой ответ приходит от запроса к странице Кинопоиска на тех итерациях цикла когда получаете ошибку. Там скорей всего капча появляется.

Во-вторых используйте для подключения страницы не примитивный file_get_contents, а полноценные библиотеки. Тот же дефолтный CURL например. Передавайте полностью HTTP-заголовки, имитируя обычный пользовательский браузер. Учитывая специфику Кинопоиска и то, что его пытаются парсить все кому не лень, такие банальные блокировки юзера как запросы с пустыми заголовками там стоят 100%.

Ну и уже соответственно если думать дальше и капча все-равно будет появляться, то уже писать скрипт обхода капчи с помощью соответствующих сервисов.

Плюс один дополнительный момент парсинга с помощью библиотеки Symfony\DomCrawler на будущее. Подгружайте исходники для парсинга не напрямую через вызов класса new Crawler(), а уже после вызова методом ->addHtmlContent(), чтобы избежать проблем с кодировкой:

$newUrl = new Crawler();
$newUrl->addHtmlContent(file_get_contents('https://www.kinopoisk.ru/film/' . $value['kinopoisk_id']));
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@iliya936
Типичный Битриксойд
Попробуй просто сделать запрос file_get_contents и распечатать его ответ, скорее всего увидишь или страничку с капчей или что доступ запрещен, думаю что такой гигант как кинопоиск заботится о том чтобы их сайт не парсили.
Ответ написан
alex-1917
@alex-1917
Если ответ помог, отметь решением
То, что ты пытаешься парсить, периодически выкладывают полными архивами некие лица...
Дружи с гуглом)))
И пожалуйста не пиши больше словосочетание file_get_contents, у меня на file_get_contents аллергия....
Ответ написан
VladOsadchyi
@VladOsadchyi
Студент
Тут КиноПоиск на Python парсят
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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