@uzi_no_uzi

Как правильно организовать парсер php?

Пишу парсер для одного сайта. На сайте есть авторизация, это сильно усложняет, т.к. я в php новичок

<?php

include_once('simple_html_dom.php');

function curl_get($url, $referer = 'http://www.google.com', $fields = [], $headers) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, $headers);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0");
    curl_setopt($ch, CURLOPT_REFERER, $referer);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_COOKIEJAR, __DIR__ . "/cookie.txt");
    $data = curl_exec($ch);


    $dom = str_get_html($data);

    $token = $dom->find('#big_login input[name="authenticity_token"]');

    foreach($token as $tok) {
        $fields["authenticity_token"] = $tok->value;
    }
    
    curl_setopt($ch, CURLOPT_COOKIEFILE, __DIR__ . "/cookie.txt");
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));

    $data = curl_exec($ch);
    
    curl_close($ch);
    return $data;
}

$headers = array(
    "Accept: text/html,application/xhtml+xm…plication/xml;q=0.9,*/*;q=0.8",
    "Accept-Encoding: gzip, deflate, br",
    "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3",
    "Connection: keep-alive",
    "Content-Length: 231",
    "Content-Type: application/x-www-form-urlencoded",
    "Host: *********",
    "TE: Trailers",
    "Upgrade-Insecure-Requests: 1",
    "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
);




$url_auth = 'https://*******/users/sign_in';

$auth_data = [
   "user[email]" => "123123sad@mailnow2.com",
   "user[password]" => "******",
   "user[remember_me]" => "0",
   "authenticity_token" => "",
   "utf8" => "✓",
   "button" => ""
];

$page = curl_get($url_auth, 'http://www.google.com', $auth_data, $headers);

echo $page;




?>


По идее после вывода должна выводиться страница, где я авторизован, но нет, выводиться просто страница с авторизацией.

На сайте есть такой токен
5d989a47b6c34005595358.jpeg

Который я паршу в итоге, я так понял его тоже нужно отправлять, при авторизации

Что я делаю не так и почему выбивает страницу авторизации?

Обновление после действий, что советовали в ответах:
Я добавил заголовки и стал получать такую вот ошибку
5d9921a817ebb352832225.png

HTTP/1.1 422 Unprocessable Entity Date: Sat, 05 Oct 2019 23:04:15 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive Set-Cookie: __cfduid=d722fccafcd9721b8615b37889ed419291570316655; expires=Sun, 04-Oct-20 23:04:15 GMT; path=/; domain=.leaderator.pro; HttpOnly X-Request-Id: a8cc9cf5-3eeb-4e07-901c-4cd8742ea984 X-Runtime: 0.010576 Strict-Transport-Security: max-age=31536000; includeSubDomains CF-Cache-Status: DYNAMIC Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/e..." Server: cloudflare CF-RAY: 52130896a979c3ca-LED


Обновление после действий, что советовали в ответах №2:
5d99bb5f25321038079659.png
Вот что отправляется POST запросом в браузере при обычной авторизации. Т.е. я по сути все правильно отправляю

На этот раз я стал получать вот такой ответ при выводе:
HTTP/1.1 302 Found Date: Sun, 06 Oct 2019 09:49:22 GMT Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff X-Download-Options: noopen X-Permitted-Cross-Domain-Policies: none Referrer-Policy: strict-origin-when-cross-origin Location: https://********/ Cache-Control: no-cache Set-Cookie: _finder_session=RkgyQUV1NWdlNis0cmFuL0FQdDBjcWxNMUUzOEljMTZUR0lpVENleitTMTY5OGtmc1gyTzkrWTM3YVE0UkNOV3Y4dDlIdkxqMVpkZ2hiRmJtam4xU1VxU1o5cmg3M0VZV0NLazlwTlg1S0lWNk8zZ21TLy8xZkJoTVBrQVBZNmg5ZTA2ckFDaEhJUkVpajZBWHE3TWhyVS8vVlZTMzg1NldxNHJVQUVxOHFUQXlsT3A3UUVETXNCeFFGeWVIZXJUc0NZV2JQSGhCT2tlYlJFVllXV0U2M0pMbXJiT0JyT0hFUXRLeExxbnlLNkpMZXJLdGRwejFxTXBDMU5oMmpuTWVtVXdySTZ3Vm41NjJmTDUrbkl0Mnc9PS0tUFRZcnVBeW9oZTJZQTRDMW5WVzhQdz09--578e6d6b8b7333177eae8ab28a9713461e441f40; path=/; secure; HttpOnly X-Request-Id: a01c854a-f4ca-47b3-a93c-f0fb3f30de69 X-Runtime: 0.272714 Strict-Transport-Security: max-age=31536000; includeSubDomains Strict-Transport-Security: max-age=31536000 Content-Security-Policy: block-all-mixed-content CF-Cache-Status: DYNAMIC Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/e..." Server: cloudflare CF-RAY: 5216b9951afd4e64-DME You are being redirected.


Я не могу понять, я зашел или нет? Я нагуглил, что 302 это код редиректа, когда заходишь на сайт. тебя действительно редиректит по этой ссылке, что дана в самом конце:
You are being redirected(это слово кликабельно, и оно ссылка указывает на главную страницу сайта, как и происходит при обычной авторизации).


Что я делаю на этот раз не так? Или я все таки вошел на сайт?

P.S. Куки в файл сохраняются, с этим все нормально
  • Вопрос задан
  • 277 просмотров
Пригласить эксперта
Ответы на вопрос 2
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Делается первый curl_exec(), получили страницу авторизации.
Распарсили, вытащили auth token. И всё.

А где второй curl_exec(), с уже заполнеными полями формы авторизации? Только curl_close() - и прощай.
Да, и Referer у этого второго запроса уже не может быть google.com, должен быть адрес этого сайта.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Обычно, сайты проверяют заголовки (валидные строки, куки и т.д.) и работают, используя JS.
Проверьте, что сайт, который Вы парсите - не использует JS.
Тогда, правильно формируйте заголовки.

Если это не так, то нужно использовать JS для парсинга со стороны клиента для корректой работы страницы, а обрабатывать полученный контент - уже где хотите.
Например, head-less браузер PhantomJS или nightmarejs
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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