Парсинг данных с сайта на AJAX

228
13 ноября 2017, 22:03

Имеется задача по парсингу данных из всплывающих окон с сайта. Данные подгружаются после нажатия на эту самую кнопку. Пробовал смотреть запросы которые идут при этом всём - когда появляется окно, ко мне прилетает JSON, но в нём нет самих данных, а только заголовки полей этого окна. Можно ли как-то отловить запрос, или же нужно прибегать к эмуляции нажатия на эту самую кнопку?

Answer 1

Просто выполните вручную требуемый запрос и посмотрите во вкладке Networks (Google Chrome, Dev Console) что именно отправляет и поступает на сервер. Ищите в списке xhr-запрос. Смотрите какие именно заголовки и данные отправляются на сервер, после чего выполняете эту эмуляцию в cURL.

Пробовал смотреть запросы которые идут при этом всём - когда появляется окно, ко мне прилетает JSON, но в нём нет самих данных, а только заголовки полей этого окна.

Вполне возможно, что там не один xhr-запрос, а несколько. В первом приходят данные для создания окна, а уже во втором поступает информация для загрузки. Но то, что данные приходят - это факт, просто надо все правильно отследить.

Конечно, еще может быть ситуация, когда все поступает через WebSockets, но они также отслеживаются при анализе сетевого трафика.

Чтобы воспроизвести AJAX-запрос используйте следующий код:

// headers
$headers = array(
    'Cookie: ...',
    'Host: ...',
    ...
);
// post fields
$post_fields = array(
    'arg_1'=>'arg_1_value',
    'arg_2'=>'agr_2_value',
    ...
);
// options
$options = array(
    CURLOPT_URL => 'target_url',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER => false,
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query($post_fields),
    CURLOPT_CONNECTTIMEOUT => 20,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_TIMEOUT => 20,
    CURLOPT_USERAGENT => 'your_user_agent'
);
// curl
$curl = curl_init();
curl_setopt_array($curl, $options);
$data = curl_exec($curl);
curl_close($curl);

В качестве заголовков ($headers) передаем массив, который передается в реальном запросе. Можно его передавать не весь, но как правило обязательными являются Cookies (если сайт требует авторизацию), также в некоторых случаях сервер проверяет Host, Referer, User Agent (его в принципе, тоже можно передать как заголовок).

Подавляющее большинство AJAX-запросов на практике идет через POST, поэтому в настройках указываем передачу методом POST и отправляем на сервер массив переменных (которые должны быть такими же, как при реальном запросе - agr_1, arg_2).

В качестве target_url указываем тот URL, к которому обращается скрипт при AJAX-запросе. В случае необходимости также можно подключить проксирование через HTTP/HTTPS или SOCKS5 (рекомендую второе).

В переменную $data пишутся данные, которые приходят в запросе. В случае необходимости также можно подключить вывод заголовков ответа (CURLOPT_HEADER) или отладку (CURLOPT_VERBOSE).

READ ALSO
Как сделать фильтрация на сайте по запросу бд?

Как сделать фильтрация на сайте по запросу бд?

Доброй ночи, у меня такой вопросКак реализовать фильтрацию на сайте через запрос к бд? То есть добавляются лоты и вписывается "1" или "2"

160
SQLSTATE[42000]: Syntax error or access violation: 1064

SQLSTATE[42000]: Syntax error or access violation: 1064

An exception occurred while executing 'INSERT INTO Answer (name_of_answ, right, Question_id) VALUES (?, ?, ?)' with params ["ок", 1, 133]:

219
Что не так с запросом?

Что не так с запросом?

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

194
Как вывести циклом поля из вкладок

Как вывести циклом поля из вкладок

Проблема следующая: Пытаюсь вывести значения кастомных полей размещенных во вкладках, например: вкладка 1, вкладка 2, и тд

197