За последние 24 часа нас посетил 17451 программист и 1650 роботов. Сейчас ищут 883 программиста ...

cURL не может победить JavaScript

Тема в разделе "Прочие вопросы по PHP", создана пользователем lucky89, 6 сен 2014.

  1. lucky89

    lucky89 Новичок

    С нами с:
    19 авг 2014
    Сообщения:
    32
    Симпатии:
    0
    Нужно парсить страницу http://ru.savefrom.net/
    Беру ссылку какого-нибудь видоса с Ютуба, собираю полную ссылку, например:
    http://ru.savefrom.net/#url=https://www.youtube.com/watch?v=vR3EeO2OVhI
    Результат отображается в блоке <div id="main">, но вывод идет через javascript. Ручками в браузере все выводится, а вот cURL вместо полезной информации выдает:
    Код (Text):
    1.  <div id="main">
    2.     <noscript><div class="wrapper"><p class="javascript-error">SaveFrom.net использует JavaScript для отображения информации. Пожалуйста, включите JavaScript и обновите эту страницу.</p></div></noscript>
    Вопрос: как можно сказать данному сервису, что у меня включен javascript и получить результат работы скрипта в блоке <div id="main"> для дальнейшего его парсинга? Средствами cURL это возможно? Может нужно что-то другое применить?
    Сейчас функция получения кода страницы выглядит так:
    Код (Text):
    1.  
    2. <?php
    3.  
    4. function get_web_page( $url )
    5. {
    6.     $uagent = "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14";
    7.  
    8.     $ch = curl_init( $url );
    9.  
    10.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   // возвращает веб-страницу
    11.     curl_setopt($ch, CURLOPT_HEADER, 0);           // не возвращает заголовки
    12.     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);   // переходит по редиректам
    13.     curl_setopt($ch, CURLOPT_ENCODING, "");        // обрабатывает все кодировки
    14.     curl_setopt($ch, CURLOPT_USERAGENT, $uagent);  // useragent
    15.     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // таймаут соединения
    16.     curl_setopt($ch, CURLOPT_TIMEOUT, 120);        // таймаут ответа
    17.     curl_setopt($ch, CURLOPT_MAXREDIRS, 10);       // останавливаться после 10-ого редиректа
    18.  
    19.     $content = curl_exec( $ch );
    20.     $err     = curl_errno( $ch );
    21.     $errmsg  = curl_error( $ch );
    22.     $header  = curl_getinfo( $ch );
    23.     curl_close( $ch );
    24.  
    25.     $header['errno']   = $err;
    26.     $header['errmsg']  = $errmsg;
    27.     $header['content'] = $content;
    28.     return $header;
    29. }
    30.  
    31.  
    32. $url_1 = "http://ru.savefrom.net/#url=https://www.youtube.com/watch?v=vR3EeO2OVhI";
    33. $result = get_web_page("$url_1");
    34. $page_1 = $result['content'];
    35. file_put_contents('page.txt',$page_1);
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    cURL не умеет выполнять js, он не строит dom-модель документа и прочие вещи. Он тупа считывает инфу по протоколу, и отдаёт её тебе
     
  3. lucky89

    lucky89 Новичок

    С нами с:
    19 авг 2014
    Сообщения:
    32
    Симпатии:
    0
    Тогда какими инструментами я могу решить свою задачу?
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Без понятия, если честно. Глянул сейчас во вкладке network результаты ajax-запроса, который выполняет savefrom.net, там тоже жётский JavaScript, видимо для защиты от таких, как ты :) Читал где-то предложение запускать из скрипта браузеры типа lynx и из них как-то получать результатирующее dom-дерево

    Добавлено спустя 4 минуты 9 секунд:
    Может организовать скачивание с ютубы через другие средства? Вот, к примеру, чего я нарыл: https://github.com/jeckman/YouTube-Downloader
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты хочешь тупо предоставлять те же услуги, что и тот сайт, его силами, под видом своего? =) ах ты проказник.
     
  6. lucky89

    lucky89 Новичок

    С нами с:
    19 авг 2014
    Сообщения:
    32
    Симпатии:
    0
    В целом да, но немного в другом формате и с дополнительным функционалом. А так же кэшированием запросов и постепенной индексацией полученных результатов.
    Я бы с удовольствием сделал свой парсер, но уже голову сломал при разгадывании Ютубовских ссылок и ссылок в Яндекс музыке, с менее именитыми сервисами все проще и в принципе получается.
    Вообще нерешаемых задач нет и со временем все равно напишу свой парсер. А пока для ускорения появления своего сервиса хотел вот ресурсами выше приведенного сайта воспользоваться.
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А что, по ссылке даунлоадер не работает? Которую я с гитхуба дал?
     
  8. lucky89

    lucky89 Новичок

    С нами с:
    19 авг 2014
    Сообщения:
    32
    Симпатии:
    0
    Скачал все файлы, сложил так же, как по вашей ссылке. Не работает. Картинки от видео находит. А прямых ссылок не дает. Пишет размер видео 0Kb. Не через index.php ни через getvideo.php не получаю прямую ссылку.

    Тут прочитал в подобно вопросе, что нужно проанализировать, какого вида и на какой адрес отправляется ajax запрос, эмулировать эти действия и парсить ответ.
    Какими средствами можно эмулировать эти действия? Да и проанализировать хз как, там такая каша в коде saveform :(
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Эмулировать тем же курлом - узнать, куда идёт ajax-запрос, послать туда же свой, посмотреть что вернёт. В вашем случае не вариант, поскольку вернёт http://clip2net.com/s/iRAsof, и разобрать это не реально. Говорю же, ради защиты от таких, как ты сделано :) Есть вариант, найти в исходниках JS, что оно потом с этим делает и сделать тоже самое. Ну тот код не мой, раз не работает, я бы поискал что-то ещё в сети для ютубы

    Добавлено спустя 12 минут 56 секунд:
    На том же phpClasses куча классов для реализации этой задачи с ютубой - авось хоть один, да сработает