Как получить результат запроса ajax?

274
28 апреля 2017, 20:57

Столкнулся с необходимостью спарсить данные с одного сайта, а именно livestreamz.net. Реализовать все решил инструментами cURL. Проблема в том, что блок вывода данных здесь подгружается из AJAX. В процессе вышел на подгружающий скрипт (livestreamz.net/wp-admin/admin-ajax.php), скопировал POST и данные с HEADER, однако скрипт упорно отказывается отдавать мне данные (как в браузере, так и через cURL). В процессе код привел к такому виду, хоть и накидал здесь лишнего в процессе поиска решения:

<?php
$curl = curl_init();
$ajaxpost = array(
"action" => "load_events",
"catid" => "all",
"searchevent"=>"",
"timezone" => "+3",
);
$headers = array(
    "POST /wp-admin/admin-ajax.php HTTP/1.1",
    "Host: livestreamz.net",
    "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3",
    "Accept-Encoding: gzip, deflate",
    "Content-Type: application/x-www-form-urlencoded; charset=UTF-8",
    "Content-Length: 56",
    "Connection: keep-alive",
    "Cache-Control: max-age=0",
    "Accept: */*",
    "Referer: http://livestreamz.net",
    "X-Requested-With: XMLHttpRequest",
    'Cookie: __cfduid=d95956aaa26b79dbad1a96384993998531493297051; advanced_ads_page_impressions=3; __atuvc=3"%"7C17; PHPSESSID=ckulfdc3oiadpip52pcnc4e7g1; _ga=GA1.2.625847550.1493297040; _gat=1; __atuvs=5901f58c7fbdc80d001'
);
curl_setopt($curl, CURLOPT_FAILONERROR, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // allow redirects
curl_setopt($curl, CURLOPT_TIMEOUT, 10); // times out after 4s
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // return into a variable
curl_setopt($curl, CURLOPT_URL, "http://livestreamz.net/wp-admin/admin-ajax.php");
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $ajaxpost);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0");
$data = curl_exec($curl);
echo $data;

Как быть? Ставить PhantomJS не хотелось бы, ведь по факту все данные есть. Что я упускаю из виду? Два дня бьюсь над этим скриптом. Благодарю за внимание.

Answer 1
<?php
// Generated by curl-to-PHP: http://incarnate.github.io/curl-to-php/
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://livestreamz.net/wp-admin/admin-ajax.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "action=load_events&catid=all&searchevents=&timezone=%2B2");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate');
$headers = array();
$headers[] = "Cookie: __cfduid=d2abfa332829db89b5c207208ad12f6321493328481; PHPSESSID=kf6trcf1id5m3j6m5gbvepqqm1; _ga=GA1.2.969357550.1493328489; _gat=1; __atuvc=2%7C17; __atuvs=5902626778c02752001";
$headers[] = "Origin: http://livestreamz.net";
$headers[] = "Accept-Encoding: gzip, deflate";
$headers[] = "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,fr;q=0.2,uk;q=0.2,pl;q=0.2,de;q=0.2";
$headers[] = "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36";
$headers[] = "Content-Type: application/x-www-form-urlencoded; charset=UTF-8";
$headers[] = "Accept: */*";
$headers[] = "Referer: http://livestreamz.net/";
$headers[] = "X-Requested-With: XMLHttpRequest";
$headers[] = "Connection: keep-alive";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
echo $result;
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close ($ch);

Тест:

# php test.php
                        <tr class="visible" data-nowtime="1493328940" data-token="1493240400" data-date="April 27th, 2017 00:00:00"  style="display: table-row;">
                            <td style="background: #E2E2E2;background-image: url('/img/streamhub-white-bar.png');padding: 11px 6px;" colspan="7" class="">
                                <h3>Schedule for April 27th, 2017</h3>
                            </td>
                        </tr>
                                            <tr data-toggle="collapse" data-nowtime="1493328940" data-token="1493312702" data-date="April 27th, 2017 20:05:02"  data-target="#links5377" data-link="http://livestreamz.net/1305-miami-marlins
-vs-philadelphia-phillies/" class="events-list accordion-toggle collapsed visible " style="display: table-row;height: 43px;">
                        <td class="home-sport">
                            <a href="#" data-toggle="tooltip" data-placement="left" title="Basketball">
                                <img src="http://livestreamz.net/wp-content/uploads/2016/07/Baseball-clipart-clipart-cliparts-for-you.jpg">
                            </a>
                        </td>
                        <td class="home-time">
                            <div id="time5377">
                                20:05                            </div>
                        </td>
...

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

READ ALSO
получение подстроки из строки с помощью регулярного выражения

получение подстроки из строки с помощью регулярного выражения

есть строка, например: _это_та_самая_строкаокончание

234
Генератор случайных чисел с энтропией

Генератор случайных чисел с энтропией

Необходимо сгенерировать случайные числа в диапазоне от 0 до 100 с шагом 1 (или 01 с шагом 0

336
Thread или таймер

Thread или таймер

Каждые 6 секунд получаю данные с АЦП через COMPORTКак по-вашему лучше (правильнее) оформить: через поток или через компонент Timer прямо в основной...

261