как правильно парсить разные страницы на сайте с авторизацией? — хабр q&a

Что-то ещё?

Для PHP существуют ещё десятки разнообразных библиотек и инструментов для парсинга, но в этой статье мы рассмотрели только самые интересные, функциональные и производительные.

Подробнее о других способах парсинга средствами PHP можно прочитать в соответствующей теме на StackOverflow.

Если вы не используете PHP, то можете ознакомится с кратким списком похожих инструментов для других языков программирования:

C :htmlcxx, libxml ;

Python:lxml, BeautifulSoup, html5lib;

Java:JSOUP, TagSoup;

Ruby:Nokogiri, Oga, Rubyful Soup;

Perl:HTML::TokeParser, HTML::Parser, HTML::SimpleParse;

.NET: Html Agility Pack;

Swift:libxml 2, Hpple;

Ассемблер:AsmXml.

Htmlsql

htmlSQL — экспериментальная PHP библиотека, позволяющая манипулировать HTML-разметкой посредством SQL-подобных запросов.

Простейший пример, извлекающий атрибуты href и title всех ссылок (элементы a) с классом list:

SELECT href,title FROM a WHERE $class == "list"

Как и с обычными mysql_ функциями, воспользовавшись методами fetch_array() или fetch_objects(), мы можем получить результат выполнения данного запроса в виде привычного ассоциативного массива или объекта.

Стоит также упомянуть о высоком быстродействии htmlSQL: часто она справляется в несколько раз быстрее phpQuery или того же Simple HTML DOM.

Тем не менее, для сложных задач вам может не хватить функциональности, а разработка библиотеки давно прекращена. Но даже несмотря на это, она всё ещё представляет интерес для веб-разработчиков: в ряде случаев значительно удобнее использовать язык SQL вместо CSS-селекторов. Особенно когда вы не знаете, что такое CSS-селекторы 😉

Phpquery

Как и Simple HTML DOM, phpQuery является PHP вариантом JQuery, но на этот раз более похожим на своего «старшего javascript-брата».

Портировано почти всё, что есть в JS-фреймворке: поддержка селекторов, атрибутов, манипуляций, обхода, плагинов, событий (в том числе имитации кликов и т.д.) и даже AJAX. Использовать можно как через PHP, так и через командную строку в виде отдельного приложения.

Более того, согласно нашим бенчмаркам, phpQuery оказался в 8 (!) раз быстрее Simple HTML DOM.

Вот небольшой пример на phpQuery, в котором происходит обработка заранее выбранных элементов списка (li):

foreach(pq('li') as $li) {
        // Можно вывести различные данные обычным текстом 
        $tagName = $li->tagName;
        $childNodes = $li->childNodes;
        // А можно добавить обертку phpQuery (аналог $() в JQuery) и, например, добавить к элементу какой-то класс
        pq($li)->addClass('my-second-new-class');
}

Подробную документацию и больше примеров найдете на официальной странице в Google Code.

Simple html dom

Simple HTML DOM — PHP-библиотека, позволяющая парсить HTML-код с помощью удобных jQuery-подобных селекторов.

Она лишена главного недостатка XPath — библиотека умеет работать даже с невалидным HTML-кодом, что значительно упрощает работу. Вы также забудете о проблемах с кодировкой: все преобразования выполняются автоматически.

Xpath и dom

DOM и XPath не являются библиотеками в привычном смысле этого слова, это стандартные модули, которые встроены в PHP начиная с пятой версии. Именно отсутствие необходимости использовать сторонние решения делает их одними из лучших инструментов для парсинга HTML страниц.

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

Вот, например, код с использованием DOM и XPath, который ищет в разметке все теги и модифицирует их атрибуты src:

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

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

<?php

include_once('simple_html_dom.php');

function curl_get($url, $referer = 'http://www.google.com', $fields = []) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20220101 Firefox/69.0");
    curl_setopt($ch, CURLOPT_REFERER, $referer);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $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_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));

    curl_close($ch);
    return $data;
}


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

$auth_data = [
   "user[email]" => "[email protected]",
   "user[password]" => "pass",
   "user[remember_me]" => "on",
   "authenticity_token" => "",
   "utf8" => "✓"
];

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

echo $page;



?>

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

На сайте есть такой токен

введите сюда описание изображения

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

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

Как правильно парсить разные страницы на сайте с авторизацией?

Здравствуйте.

Есть необходимость распарсить некоторые данные в своём аккаунте одного сервиса. Для авторизации использую cURL, авторизоваться получилось хорошо, но возникло затруднение на стадии, когда надо ходить по нескольким категориям, в каждой категории есть пэйджер, где может быть ещё десяток страниц. Получается, что file_get_contents() использовать я не могу, а для каждой следующей страницы открывать новую сессия curl – на мой взгляд слишком жирно и по коду в том числе… Как аккуратно решить мою задачу? Как вообще люди поступают в таком случае? Может я какой-то момент упустил? Можете ли вы показать пример, как это сделать?

UPD:
Я надеялся, просто, что есть какая-то возможность авторизоваться, закрыть сессию cURL и далее уже обрабатывать данные, брать другие страницы и так далее вне сессии…

Регулярные выражения

Даже не смотря на то, что «регулярки» — это первое, что приходит на ум, использовать их для настоящих проектов не стоит.

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

Вместо «допиливания» своего регулярного выражения при каждом малейшем изменении кода рекомендуем использовать инструменты ниже — это и проще, и удобнее, и надежнее.

Вывод

В своем мини-исследовании мы пришли к выводу, что в большинстве случаев для парсинга лучше использовать библиотеку phpQuery: она быстрая, функциональная и современная.

С другой стороны, для совсем простых задач логично было бы использовать стандартные модули PHP, такие как XPath, DOM или, на крайний случай, регулярные выражения.

Похожее:  Sigen pro кошелек - подробная инструкция пользования

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *