Парсинг страниц сайтов(html-контента) на php.
Заметка посвящается парсингу, в частности парсинг сайтов, парсинг страниц, парсинг в веб-среде, парсинг html-контента сайта. В процессе разработки различных веб-сервисов очень часто приходится сталкиваться с задачами, в которых требуется быстро получить различного рода информацию в больших объемах. В основном это связано с граббингом, кражей информации, как хотите это называйте. Дело в том, что информация доступна и открыта. Особенность парсинга — это быстрый и автоматизированный сбор данных, контента со страниц сайта. Сейчас очень популярно парсить в веб-среде, а именно парсить сайта, который содержать хоть какую-нибудь ценность и актуальность для людей. Особой ценностью является каталог товаров, включая картинки, базы данных справочников и многое другое, что может пригодиться для конкурентов. Давайте попробуем спарсить нужную информацию в html, попробуем достать все ссылки с нескольких страниц нашего сайта. Для начала нам необходимо получить контент сайта в формате html. Для этого нам достаточно знать адреса нужных страниц. Хочу показать 2 основных способа получения контента со страницы сайта: В первую очередь приготовим массив с нужными адресами страниц:
//3 ссылки нашего сайта: $urls = array('http://hello-site.ru/blog/','http://hello-site.ru/web-notes/','http://hello-site.ru/games/');
1 вариант — php функция file_get_contents. Функция возвращает html-строку, которую мы будем парсить на ссылки:
//помещаем каждую ссылку в функцию file_get_contents foreach($urls as $urlsItem) < $out .= file_get_contents($urlsItem); //и добавляем содержание каждой страницы в строку >echo $out; //здесь контент всех трех страниц
2 вариант — CURL. Библиотека, которая поддерживается php и имеет большой набор настроек, от POST-запросов до работы с FTP. Рассмотрим стандартный вызов библиотеки curl, который отдаст нам контент сайта:
foreach($urls as $urlsItem) < //пропускаем каждую ссылку в цикле $output = curl_init(); //подключаем курл curl_setopt($output, CURLOPT_URL, $urlsItem); //отправляем адрес страницы curl_setopt($output, CURLOPT_RETURNTRANSFER, 1); curl_setopt($output, CURLOPT_HEADER, 0); $out .= curl_exec($output); //помещаем html-контент в строку curl_close($output); //закрываем подключение >echo $out; //здесь контент всех трех страниц
Теперь в нашей строке $out находится контент всех трех страниц. Итак, переходим непосредственно к парсингу нашей строки. Опять же хочу показать 3 варианта решения нашей задачи: «нативный» способ на php, с помощью встроенной библиотеки DOMDocument и библиотеки SimpleHTMLDOM. 1. php функция explode. Функция находит искомый символ или часть строки и делит целую строку на элементы массива. Повторюсь, нам необходимо получить значения всех атрибутов href у тегов a, для этого будем делить общую строку на некоторые части\отрезки:
// explode $hrefs = explode(' foreach($hrefText as $hrefTextItem) < //избавляемся от ссылок с пустым атрибутом href if($hrefTextItem!='')< $clearHrefs[]=$hrefTextItem; >> $clearHrefs = array_unique($clearHrefs); //избавляемся от одинаковых ссылок print_r($clearHrefs); // в итоге у нас массив со всем ссылками с 3х страниц
Если распечатать наш массив, будет примерно следующее:
Array ( [0] => / [1] => /hello [3] => /timer/ [4] => /leftmenu/ [5] => /faq/ [6] => /blog/ [8] => /web-notes/ [9] => /ordersite/ [10] => /games )
2. встроенная библиотека DOMDocument. Работаем с классом примерно следующим образом:
//domelement $dom = new DOMDocument; //создаем объект $dom->loadHTML($out); //загружаем контент $node = $dom->getElementsByTagName('a'); //берем все теги a for ($i = 0; $i < $node->length; $i++) < $hrefText[] = $node->item($i)->getAttribute('href'); //вытаскиваем из тега атрибут href > foreach($hrefText as $hrefTextItem) < //избавляемся от ссылок с пустым атрибутом href if($hrefTextItem!='')< $clearHrefs[]=$hrefTextItem; >> $clearHrefs = array_unique($clearHrefs); //избавляемся от одинаковых ссылок print_r($clearHrefs); // в итоге у нас массив со всем ссылками с 3х страниц
Результат такого кода ровно такой же, что и с помощью функции explode. 3. библиотека SimpleHTMLDOM. Ее необходимо подключать из файла. Работа примерно схожа с DOMDocument. Работаем с классом:
//simplehtml include('simple_html_dom.php'); //подключаем файл с классом SimpleHTMLDOM $html = new simple_html_dom(); //создаем объект $html->load($out); //помещаем наш контент $collection = $html->find('a'); //собираем все теги a foreach($collection as $collectionItem) < $articles[] = $collectionItem->attr; //массив всех атрибутов, href в том числе > foreach($articles as $articlesItem) < $hrefText[] = $articlesItem['href']; //собираем в массив значения подмассива с ключом href >foreach($hrefText as $hrefTextItem) < //избавляемся от ссылок с пустым атрибутом href if($hrefTextItem!='')< $clearHrefs[]=$hrefTextItem; >> $clearHrefs = array_unique($clearHrefs); //избавляемся от одинаковых ссылок print_r($clearHrefs); // в итоге у нас массив со всем ссылками с 3х страниц
Повторюсь, результат в массив ровно такой же как и выше в двух вышеперечисленных. Теперь, имея массив со всеми ссылками, собранными с трех страниц сайта, можно отправить ссылки в нужное русло, все зависит от задачи и фантазии. Имея такие возможности, можно спарсить большое количество данных самого разного вида информации, картинки, тексты, логи и т.д. Чужая информация в ваших руках, распоряжайтесь как вам угодно, но сами защищайтесь, хотя это невозможно) Успехов!
Парсинг (Parsing) сайтов на PHP
Для парсинга (parsing) сайтов при помощи PHP обычно используется или регулярные выражения или сторонние библиотеки.
Регулярные выражения в PHP — описание функций для использования регулярных выражений в PHP.
phpQuery — портирован из jQuery механизм селекторов.
PHP Simple HTML DOM Parser требуется подключить к проекту только файл simple_html_dom.php. Пример использования
include('simple_html_dom.php'); // Create DOM from string $html = str_get_html($links); //or $html = file_get_html('www.example.com'); foreach($html->find('a') as $link) { echo $link->href . '
'; }

11 Самых Популярных Статей
- ulimit (limits.conf) управление ограничениями ресурсов ОС Linux
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Что такое страны tier 1,2,3 и как правильно выбрать ГЕО для рекламной кампании
- Настройка, использование GitLab CI/CD
- Что означает «> /dev/null 2>&1» или перенаправление STDIN, STDOUT и STDERR?
- Настройка и использование сервера OpenVPN в Linux
- PostgreSQL: создать БД, пользователя, таблицу, установить права
- Виды кодировок символов
- Использование rsync в примерах
- my.cnf примеры конфигурации MySQL, MariaDB
- dig проверка DNS сервера
11 Самых Популярных Обзоров
- ТОП 4 лучших антидетект браузеров в 2023 (Бесплатные & Платные)
- Обзор и отзывы о Namecheap в 2023 году
- Хостинг Zomro (Зомро)
- Обзор браузера Dolphin
- ТОП 3 Проверенных VPN, Прокси, Хостинг VPS Турция в 2023
- Что такое абузоустойчивый хостинг (bulletproof)?
- Обзор и отзывы о 4VPS (FourServer) в 2023 году
- Обзор и отзывы AstroProxy в 2023 году
- Обзор и отзывы о PQ Hosting в 2023 году
- Обзор и отзывы о Hostinger в 2023 году: преимущества и недостатки
- Проверенные VPS / VDS хостинг провайдеры
Чтение файла в PHP. Выбираем оптимальный вариант

Приветствую вас, друзья!
Думаю, что, если не все, то, уж точно большинство из вас сталкивались на практике с необходимостью чтения информации из txt файлов на уровне серверных скриптов. У меня, по крайней мере, таких случаев было несколько, о последнем из которых я вам сегодня и расскажу.
Ничего в этом сложного нет, но иногда глаза разбегаются от обилия вариантов, предоставляемых средствами серверных языков. Если говорить конкретно о PHP, на котором я сейчас программирую, то с помощью его функций можно считывать содержимое файлов и построчно, и целиком в строку, и в массив, причём для последнего варианта существует ещё несколько способов… Вот такие пироги
К сожалению только, данные методы работают с различной скоростью для файлов разной структуры, и о скорости их работы нет ни единого слова в официальной документации; об этом можно судить лишь на практике, перебирая все возможные варианты.
Поэтому, сегодня я продемонстрирую вам работу различных функций PHP для чтения файлов, чтобы, когда вам нужно будет создать PHP парсер файла для решения реальных задач, вы знали, из чего выбирать. А также подскажу, как именно в «боевых условиях» сделать правильный выбор.
Создаём PHP парсер файла — начальные условия
Перед тем, как мы начнём, пару слов о задаче, для которой я создавал парсер файла на PHP, а затем выбирал из реализованных вариантов оптимальный.
Однажды у меня на работе возникла проблема, которая заключалась в том, что в БД хранились телефоны пользователей в неверном формате. Сам баг я, естественно, без проблем пофиксил.
Но, что делать с неверной информацией, которая на тот момент уже хранились в базе данных? Естественно, её нужно было заменить на корректную.
Для этого мне был предоставлен текстовый файл с идентификаторами пользователей и их телефонами, которые нужно было перенести в БД.
Должен сказать, он получился весьма увесистым: 352 Кбайта и 8223 строки текста, в каждой из которых содержался идентификатор пользователя и его телефон в формате id_пользователя:номер_телефона.
Словом, вся задача заключалась в построчном чтении файла PHP средствами, выделения из строки идентификатора и телефона с последующим обновлением значения телефона у пользователя в БД, найденного по айдишнику.

Мой проект был реализован на PHP фреймворке Yii, следовательно в дальнейших примерах кода вы встретите элементы его API для работы с БД, в частности, поэтому не пугайтесь
После анализа имеющихся в языке конструкций, а также опыта других разработчиков, по крупицам собранного в Интернете, мне удалось выделить 4 способа, которые я далее вам и продемонстрирую.
Ну, а после я расскажу, по каким критериям и как именно я выбирал среди них оптимальный вариант. И, естественно, поделюсь результатами
Так что данная статья — отличная тренировка терпеливости Суть её будет заключаться в подробном изучении следующего материала вплоть до результатов, которые будут ждать вас в конце. По ходу, кстати, можете поработать ещё и над фантазией, предполагая, как именно будет выбираться идеальный вариант.
Чтение файла в PHP построчно с помощью fgets()
Для того, чтобы прочитать файл построчно, в PHP есть специальная функция fgets(). Чтобы с её помощью считать содержимое всего файла, её нужно вызывать в цикле, проходясь по всем строкам.
В итоге, PHP парсер файла, реализующий данный алгоритм, у меня принял следующий вид:
find('unique_id IN (:id1, :id2)', array(':id1' => strtolower($params[0]), ':id2' => strtoupper($params[0]))); if ($client) < $client->phone = str_replace(array("\r", "\n"), "", $params[1]); $client->save(); > > > > if (!feof($fh)) < echo 'Error: unexpected fgets() fail\n'; >fclose($fh); > else echo "Check the filename, file doesn't exists!"; >
Немного расшифрую свою писанину, если у кого-то возникнут сложности в понимании.
В самом начале, переменной $filename присваивается значение имени файла, который будет парситься, с полным путём к нему. Далее следуют PHP проверка существования файла и читаем ли он с помощью функций file_exists() и is_readable() соответственно.
Если всё ОК, то открываем файл с помощью функции fopen(), которая вызывается с PHP оператором управления ошибками для того, чтобы отключить вывод ошибок, генерируемых данной функцией. Использовать я его решил, чтобы сгенерировать своё сообщение об ошибке вместо стандартного.
Если файл открыть получилось, то мы проходимся по всем его строкам в цикле, пока файл не закончится, и, если строка не пустая, разделяем её по символу двоеточия функцией explode().
Затем проверяем, что id пользователя и его телефон не пустые, ищем пользователя в БД по айдишнику и, если таковой существует, то обновляем ему номер телефона, убрав из значения номера предварительно символы переноса и начала новой строки.
Ну, и ещё я использовал PHP функции strtolower() и strtoupper() для проверки существования в БД пользователя с идентификаторами, которые могли быть прописаны в различных регистрах, т.к. они в моём случае состояли из символов и цифр.

Далее по коду следуют различные сообщения об ошибках, которые могут возникнуть на разных этапах, а также функция закрытия файла — fclose().
PHP парсинг файла в массив с помощью file()
Данный метод чтения файла в PHP предполагает использование функции file(), которая открывает файл и помещает его содержимое в массив. При этом элементами массива будут являться, как раз, строки считываемого файла, что в моей ситуации отлично подходит.
Код данного варианта PHP парсера файла получился следующий:
find('unique_id IN (:id, :id2)', array(':id' => strtolower($params[0]), ':id2' => strtoupper($params[0]))); if ($client) < $client->phone = str_replace(array("\r", "\n"), "", $params[1]); $client->save(); > > > > > else echo "Check the filename, file doesn't exists!"; >
Как видите, от предыдущего способа чтения файла в PHP данный отличается только своим началом, где файл открывается и сразу же считывается функцией file() вместо связки fopen() + fgets(), как ранее.
Далее код такой же.
PHP чтение файла в переменную с помощью fread()
Ещё одной функцией PHP для разбора файла является fread(), с помощью которой можно читать различные фрагменты файла указанной длины. Чтобы прочитать файл в PHP целиком, в качестве размера фрагмента я указал размер файла, полученный с помощью функции filesize():
if (!empty($lines)) < foreach ($lines as $line) < if (!empty($line)) < $params = explode(':', $line); if (!empty($params[0]) && !empty($params[1]) && $params[1] != 'Fake') < $client = Clients::model()->find('unique_id IN (:id1, :id2)', array(':id1' => strtolower($params[0]), ':id2' => strtoupper($params[0]))); if ($client) < $client->phone = str_replace(array("\r", "\n"), "", $params[1]); $client->save(); > > > > > else echo "Check the filename, file doesn't exists!"; >
Данный способ чтения файла PHP средствами, на самом деле, очень похож на предыдущий, т.к., несмотря на то, что с помощью PHP данные из файла изначально считываются не в массив, а в строковую переменную, далее она всё равно преобразуется в массив, т.к. с ним проще работать, чем со строкой.
Преобразование строки в массив на PHP проще всего сделать с помощью уже применявшейся сегодня функции explode(), в качестве разделителя в которую был передан символ начала строки.
А дальше всё идёт по накатанной
Создаём PHP парсер файла на базе file_get_contents()
Ну, и напоследок, я решил реализовать PHP парсинг файла с помощью функции file_get_contents(), которая, как раз и предназначена для чтения файла целиком в строку, т.е. работает, практически, как fread($fp, filesize($filename)).
За тем лишь исключением, что file_get_contents() самостоятельно открывает файл и считывает его, в то время как для использования fread() нужно было предварительно открыть файл через fopen() и получить его указатель для дальнейшего использования.
В целом, код PHP парсера файла на базе file_get_contents() будет практически как и в предыдущем случае:
find('unique_id IN (:id1, :id2)', array(':id1' => strtolower($params[0]), ':id2' => strtoupper($params[0]))); if ($client) < $client->phone = str_replace(array("\r", "\n"), "", $params[1]); $client->save(); > > > > > else echo "Check the filename, file doesn't exists!"; >
На этом всё. Пришло время подвести итоги производительности всех перечисленных вариантов и выяснить, какой же PHP парсер файла оказался самым оптимальным для дальнейшего использования.
Какой способ обработки файлов в PHP является оптимальным?
Чтобы выбрать из найденных вариантов самый оптимальный, т.е. самый быстрый, я решил определить время выполнения скрипта PHP в каждом случае. Для этого я воспользовался методикой, описанной в статье по ссылке.
Сами по себе PHP функции чтения файлов достаточно шустрые, поэтому, чтобы добиться хоть каких-то более-менее осязаемых цифр времени их работы, я специально оставил в тестируемых фрагментах операции с базой данных, которые во всех случаях были одни и те же.
Время работы PHP скрипта я также решил для удобства округлять до третьего знака после запятой, т.е. до тысячных долей секунд (хотя, можно было ограничиться и сотыми, на самом деле).
Помню, когда я учился в школе и писал свою научную работу по физике (да, был такой опыт ) на её защите перед университетскими преподавателями меня постоянно упрекали за недостаточное количество экспериментов (я делал по 3 опыта для каждого случая). «Светилы науки» называли цифры в 100, ну или, хотя бы, в 10 экспериментов для сравнения различных ситуаций, чтобы можно было делать какое-то их сопоставление и минимизировать вероятность случайного превосходства одного над другим.
Да, досталось мне тогда от них крепко, но их рекомендации я хорошо усвоил, что даже сейчас об этом помню, хотя прошло уже более 10 лет с тех пор. Тем более, что данные рекомендации действительно были основаны на законах математической статистики и теории вероятности.
Ну, на научность своих нынешних экспериментов я в данной статье не претендую, поэтому число в 100 экспериментов я посчитал излишне большим, а процесс их проведения — слишком утомительным занятием.
В итоге, я решил ограничиться 10 экспериментами для каждого варианта PHP парсера файла, чего, как оказалось в итоге, оказалось вполне достаточно, чтобы выделить явного лидера без всякой подтасовки фактов и зацепок за сотые и тысячные доли секунды превосходства.
Результаты вычислений времени работы разработанных мною PHP парсеров файла представлены в следующей таблице и рассортированы по PHP функциям, на базе которых они работают.
| Эксперимент | fgets() | file() | fread() | file_get_contents() |
| 1 | 9,147 | 9,722 | 10,539 | 2,008 |
| 2 | 8,950 | 9,006 | 9,495 | 1,733 |
| 3 | 8,821 | 8,845 | 9,207 | 1,642 |
| 4 | 8,717 | 8,876 | 8,931 | 1,758 |
| 5 | 9,010 | 9,091 | 8,703 | 1,635 |
| 6 | 9,110 | 8,640 | 9,712 | 1,633 |
| 7 | 9,074 | 9,626 | 9,13 | 1,645 |
| 8 | 8,886 | 9,204 | 9,048 | 1,701 |
| 9 | 8,667 | 8,918 | 9,438 | 1,713 |
| 10 | 8,852 | 9,197 | 9,537 | 1,567 |
| Среднее | 8,923 | 9,113 | 9,374 | 1,704 |
Как видите, помимо значений времени выполнения скрипта в каждом из 10 экспериментов, я решил подсчитать среднюю температуру по больнице
А именно, арифметическое среднее время работы каждого PHP парсера файла, чтобы можно было выявить лидера.
И им оказался, как видите, последний вариант, реализованный на базе функции file_get_contents(), который выполняет чтение содержимого файла в строковую переменную с дальнейшим его преобразованием в массив и обработкой в цикле.
Все остальные варианты PHP парсеров файлов работают примерно с одинаковой скоростью.
Почему именно он обогнал своих конкурентов я, если честно, не имею ни малейшего понятия. Могу лишь предположить, что операция чтения файла в строку с помощью file_get_contents() требует меньше ресурсов, чем формирование готового массива строк с помощью file().
А превосходство над fgets() и fread() можно списать на то, что перед их использованием требуется открытие файла с помощью fopen(), на что требуется время.
Да, на самом деле, это и не важно, т.к. цифры говорят сами за себя: благодаря использованию функции file_get_contents() PHP парсер файла на его базе работает в 5 раз быстрее остальных, что и повлияло на моё решение использовать его на практике.
Разбор файла в PHP — выводы
Как я уже и говорил в начале, мои опыты не являются безупречными и опираться исключительно на полученные в их ходе результаты не стоит, т.к., несмотря на быстродействие file_get_contents() в моей ситуации, бывают случаи, когда намного удобнее и эффективнее использовать другие приведённые мною PHP парсеры файлов.
Кроме того, не стоит забывать, что PHP сам по себе является синхронным языком программирования, т.е. все серверные операции происходят последовательно без возможности настройки их параллельного выполнения, в том числе, и на разных ядрах серверного процессора.
Следовательно, на время выполнения операций, прописанных в PHP коде, может влиять целый ряд факторов, среди которых основным является нагруженность ядра в момент работы PHP приложения.
Я это особенно ощутил во время проведения опытов, когда один и тот же PHP парсер файла отработал за 9, затем за 12, а потом снова за 9 секунд на трёх последовательных итерациях из-за банального запуска проводника Windows во время второго случая, который, естественно, тоже требует серверных ресурсов.
Учитывая данные особенности, я проводил эксперименты практически одновременно, друг за другом, при одинаковом комплекте запущенных программ, чтобы не распылять ресурсы серверного железа.
Поэтому в дальнейшем, при проведении подобных экспериментов с PHP конструкциями действуйте аналогичным образом, т.к. это, по сути, единственный способ привести эксперименты к равным условиям.
Если же вы будете работать с асинхронными серверными языками (C#, Java) или технологиями (Node.js, например), то, по возможности, для экспериментов создавайте отдельный поток, который будет работать на выделенном ядре процессора.
Ну, а если найти полностью незадействованное ядро не получится (что при уровне современного ПО не удивительно), то вы хотя бы сможете найти самое слабонагруженное или, хотя бы, со статической нагрузкой, которая не меняется во времени.
Надеюсь, что мои наблюдения и рекомендации будут вам полезны, равно как и мои сегодняшние эксперименты с PHP парсерами файлов.
Подытоживая, хочу сказать, что приведённые в статье фрагменты кода могут использоваться не только для парсинга текстовых файлов в PHP, но и отлично подойдут для других форматов, например, для разбора CSV файлов дампа базы данных MySQL.
Пишите ваши отзывы, как положительные, так и отрицательные в комментариях под статьёй — мне необходимо любое ваше мнение для дальнейшего развития
Также буду благодарен, если поделитесь данной статьёй со своими друзьями в социальных сетях с помощью кнопочек ниже.
До новых встреч!
P.S.: если вам нужен сайт либо необходимо внести правки на существующий, но для этого нет времени и желания, могу предложить свои услуги.
Более 5 лет опыта профессиональной разработки сайтов. Работа с PHP, OpenCart, WordPress, Laravel, Yii, MySQL, PostgreSQL, JavaScript, React, Angular и другими технологиями web-разработки.
Опыт разработки проектов различного уровня: лендинги, корпоративные сайты, Интернет-магазины, CRM, порталы. В том числе поддержка и разработка HighLoad проектов. Присылайте ваши заявки на email cccpblogcom@gmail.com.
И с друзьями не забудьте поделиться
На каком языке лучше писать парсеры?
Нужно сделать парсер который сайт очень быстро мог обойти, подскажите на каком языке лучше его писать? Думала на php, но вроде как я понимаю это плохая идея, сможете ещё объяснить мне почему php плох для парсеров?
jessgt ★
20.12.18 12:25:58 MSK
← 1 2 →
Я не знаю — сможешь ли ты когда-нибудь написать парсер, но мой ты уже сломал.
yyk ★★★★★
( 20.12.18 12:28:55 MSK )

попробуй питон. там несложный синтаксис + есть готовые библиотеки, которые могут что тебе нужно
chenbr0 ☆
( 20.12.18 12:31:30 MSK )
Ответ на: комментарий от chenbr0 20.12.18 12:31:30 MSK

. но нету полноценных лямбд.
ados ★★★★★
( 20.12.18 12:33:55 MSK )

Не хочешь пхп — пиши на перле. С регекспом там более чем в порядке.
Или что вообще имелось ввиду?
hbars ★★★★★
( 20.12.18 12:34:42 MSK )
На чём удобно, на том и пиши. Регулярки есть везде, обход dom тоже. Я использовал hxselect (https://www.w3.org/Tools/HTML-XML-utils/) с башем для этого дела, т.к. удобно смотреть выхлоп и вообще с пайпами работать, вместо кодинга с итерациями и всякими вонючими либами.
crutch_master ★★★★★
( 20.12.18 12:40:17 MSK )
Последнее исправление: crutch_master 20.12.18 12:42:39 MSK (всего исправлений: 1)
Нужно сделать парсер который сайт очень быстро мог обойти
Прежде чем писать парсер нужно хотя бы понять, что узкое место в парсинге интернет-сайтов — скорость отдачи контента сайтом.
Deleted
( 20.12.18 12:43:25 MSK )
Ответ на: комментарий от yyk 20.12.18 12:28:55 MSK

hbars ★★★★★
( 20.12.18 12:53:15 MSK )
Ответ на: комментарий от hbars 20.12.18 12:34:42 MSK
Хотела на php, но мне сказали что он работает в 1 поток и из-за этого будет очень медленно парсится сайт.
jessgt ★
( 20.12.18 12:53:20 MSK ) автор топика
Ответ на: комментарий от hbars 20.12.18 12:34:42 MSK

Не надо парсить HTML/json регэкспами!
Shadow ★★★★★
( 20.12.18 12:58:44 MSK )

Guest_1488 ★
( 20.12.18 13:00:18 MSK )
Ответ на: комментарий от jessgt 20.12.18 12:53:20 MSK

Проблема в том, что для асинхронного/многопоточного парсера надо организовывать какую-то очередь данных. Обычно берут какую-то бд. Лучше взять готовый фреймворк для парсеров.
Shadow ★★★★★
( 20.12.18 13:03:59 MSK )
Думала на php, но вроде как я понимаю это плохая идея, сможете ещё объяснить мне почему php плох для парсеров?
В смысле, «я сама придумала, что он плохой, а вы объясните мне, почему?»
Alve ★★★★★
( 20.12.18 13:05:57 MSK )
Ответ на: комментарий от Alve 20.12.18 13:05:57 MSK
нененене, выше я писала что мне сказали что php плохо подходит, т.к. он медленный и работает в 1 поток
jessgt ★
( 20.12.18 13:09:41 MSK ) автор топика
Ответ на: комментарий от Shadow 20.12.18 13:03:59 MSK

Те загонять в базу и потом sql? И как оно быстрее чем в память.
hbars ★★★★★
( 20.12.18 13:31:37 MSK )
Последнее исправление: hbars 20.12.18 13:32:47 MSK (всего исправлений: 1)
Это скраппер, а не парсер. Ищем удобную либу для любого языка и вперёд.
RazrFalcon ★★★★★
( 20.12.18 13:31:39 MSK )

deep-purple ★★★★★
( 20.12.18 13:35:44 MSK )
На любом языке общего назначения. Что из языков ты знаешь, кроме PHP?
Deleted
( 20.12.18 13:43:53 MSK )
Ответ на: комментарий от Deleted 20.12.18 13:43:53 MSK
jessgt ★
( 20.12.18 13:52:56 MSK ) автор топика
Ответ на: комментарий от hbars 20.12.18 13:31:37 MSK

Не надо городить пул в памяти же. Быстрее в разработке.
Shadow ★★★★★
( 20.12.18 13:53:09 MSK )
Ответ на: комментарий от jessgt 20.12.18 12:53:20 MSK
но мне сказали что он работает в 1 поток и из-за этого будет очень медленно парсится сайт.
А вы уверены, что тот кого вы собираетесь парсить будет рад нагрузке от вашего парсера в N-потоков?
Deleted
( 20.12.18 13:55:15 MSK )

javascript, ибо к нему куча инструментов по разбору любых сайтов с подключением браузеров в нескольких вариантах, на пхп ты далеко не уедешь
umren ★★★★★
( 20.12.18 13:58:16 MSK )
Ответ на: комментарий от jessgt 20.12.18 13:52:56 MSK
Ну так и что бы не взять например https://www.npmjs.com/package/node-html-parser ? Единственная проблема которую видно сразу —
Deleted
( 20.12.18 14:01:42 MSK )

На котором умеешь писать код.
на php, но вроде как я понимаю это плохая идея
PHP мало чем отличается от других языков по основной сути. Его ругают, но код на нём всё же работает.
сможете ещё объяснить мне почему php плох для парсеров?
Это нужно спрашивать у тех, кто заявляет, что «PHP плох для парсеров».
Для PHP рекомендую взять http://simplehtmldom.sourceforge.net/ (хотя я других библиотек и не пробовал вообще-то). Для Python — https://www.crummy.com/software/BeautifulSoup/bs4/doc/, запускать под PyPy.
i-rinat ★★★★★
( 20.12.18 14:14:10 MSK )

Ни почему не плох. Не хуже, чем любая другая скриптота. Бери любой асинхронный фреймворк и вперёд, к победе коммунизма.
no-such-file ★★★★★
( 20.12.18 15:08:34 MSK )
Ответ на: комментарий от jessgt 20.12.18 13:09:41 MSK

мне сказали что php плохо подходит, т.к. он медленный и работает в 1 поток
no-such-file ★★★★★
( 20.12.18 15:14:18 MSK )
Ну если у тебя вообще есть понимание того как пишутся парсеры, то наверное должна понимать что разницы особой нет. Какой язык тебе привычней на том и пиши. cURL, регулярки и прочий инструментарий есть везде (на самом деле нет, но это не важно).
schizoid89
( 20.12.18 15:37:27 MSK )
Парсеры для стандартных форматов вообще писать не нужно, они есть готовые. А PHP плох вообще для всего.
slovazap ★★★★★
( 20.12.18 15:51:09 MSK )
Не важно, что за ЯП или библиотека, главное, чтобы chrome headless.
Deleted
( 20.12.18 15:52:02 MSK )

который сайт очень быстро мог обойти
Какой сайт и насколько быстро
goingUp ★★★★★
( 20.12.18 16:48:00 MSK )
А мог бы уже сделать. Чем тебя нода не устроила? Твоя задача сводится к пониманию структуры представления на сайте и поиску xpath, если искомые элементы типа ссылок «далее» промаркированы, то вообще всё просто.
Бери scrappy, если питона не знаешь. Там по-моему можно без проблем headless браузер прикрутить для джаваскрипта, но процессинг жс это ресурсоёмко будет.
anonymous
( 20.12.18 16:58:54 MSK )

На том, что знаешь. Библиотеки разбора HTML есть везде.
И не называй разбор HTML «парсингом»
tailgunner ★★★★★
( 20.12.18 17:12:00 MSK )
Парсилку html в php можно запросто написать, если регекспами парсить.
anonymous
( 20.12.18 17:17:42 MSK )
Ответ на: комментарий от anonymous 20.12.18 17:17:42 MSK

Я так понимаю, призывалась эта ссылка.
tailgunner ★★★★★
( 20.12.18 17:21:48 MSK )
Ответ на: комментарий от tailgunner 20.12.18 17:21:48 MSK
Мало ли о чем там дегенераты пишут, их там много и пишут они достаточно. С помощью регекспов, которые КА разбора регулярных грамматик, можно распарсить все, что угодно.
ПХП медленный, если автомат разбора руками по символьно, а если на основе регекспов его сделать и из ПХП им управлять и никаких особых тормозов разбора не будет.
anonymous
( 20.12.18 17:29:18 MSK )
Ответ на: комментарий от anonymous 20.12.18 17:29:18 MSK

Мало ли о чем там дегенераты пишут, их там много
Здесь тоже есть.
С помощью регекспов, которые КА разбора регулярных грамматик, можно распарсить все, что угодно.
tailgunner ★★★★★
( 20.12.18 17:29:52 MSK )
Последнее исправление: tailgunner 20.12.18 17:30:37 MSK (всего исправлений: 1)
Ответ на: комментарий от tailgunner 20.12.18 17:29:52 MSK
Самокритично, даже я бы сказал, неожиданно. Хвалю.
anonymous
( 20.12.18 17:30:53 MSK )
Kaitai Struct, про него на ЛОРе были новости. Описываешь формат в декларативном виде и генерируешь парсер под язык, который тебе нравится (если он поддерживается Kaitai Struct).
Pravorskyi ★★★
( 20.12.18 17:31:33 MSK )
Ответ на: комментарий от Pravorskyi 20.12.18 17:31:33 MSK

Как-то много шутников в этой теме,
tailgunner ★★★★★
( 20.12.18 17:32:33 MSK )
Ответ на: комментарий от hbars 20.12.18 12:34:42 MSK
причём тут парсер и регекспы?
Ford_Focus ★★★★★
( 20.12.18 21:10:23 MSK )
Ответ на: комментарий от jessgt 20.12.18 13:09:41 MSK
но вообще для парсинга ничего этого не нужно
разбирать html можно даже simplexml’ом
Ford_Focus ★★★★★
( 20.12.18 21:18:26 MSK )
Ответ на: комментарий от jessgt 20.12.18 13:52:56 MSK
но тебе это тоже не нужно
Ford_Focus ★★★★★
( 20.12.18 21:21:12 MSK )
Няшная растишечка же!
Rust для парсеров идеален.
anonymous
( 20.12.18 22:18:46 MSK )

на том, который умеет работать с регулярными выражениями
grem ★★★★★
( 20.12.18 22:23:12 MSK )
Ответ на: комментарий от grem 20.12.18 22:23:12 MSK
Конечно нет, в 99% случаев тебе не придутся использовать регулярки никак. Ну и потом, парсить регулярками html, это такое себе. Даже если они достаточно быстрые, профит будет убит тем что там по 10000 циклов разборов на каждом предложении.
anonymous
( 20.12.18 22:40:35 MSK )

Рекомендую Perl5. Язык был специально создан для обработки данных. Существует множество готовых библиотек и даже программ — для разных форматов, например. Беспрецедентная поддержка UNICODE. Позиционируется как максимально приближенный к естественному (английскому) языку синтаксис, поэтому, помимо всего прочего, множество интуитивно понятных примеров конструкций. Те же регулярные выражения возникли как стандарт именно из развития Perl5, в который они очень гармонично встроены.
Infra_HDC ★★★★★
( 20.12.18 23:38:55 MSK )
Ragel. Дальше можешь использовать любой другой язык для обработки напаршеного.
xpahos ★★★★★
( 21.12.18 00:49:44 MSK )
Ответ на: комментарий от anonymous 20.12.18 22:40:35 MSK

Не заметил, что там речь именно о сайте 🙁
grem ★★★★★
( 21.12.18 07:38:09 MSK )
Ответ на: комментарий от jessgt 20.12.18 13:52:56 MSK
cheerio тогда возьми.
deadNightTiger ★★★★★
( 21.12.18 07:44:06 MSK )
Ответ на: комментарий от jessgt 20.12.18 13:09:41 MSK
Берешь paralell и качаешь хоть во сколько хочешь потоков. Потом cat page1.html | hxnormalize | hxselect | perl -pe «/regexp/» | grep | sed | . | perl -pe «. » >> profit.txt Кода минимум и ничего знать не надо вообще, кроме регулярок и css селекторов. Но парсинг это такое дело, что каждую новую задачу будешь решать разными средствами. Где-то хватит curl, а где-то нужен selenium. Где-то можно hxselect | регулярками, а где-то есть нормальный api и можно обойтись jq / нодой.
crutch_master ★★★★★
( 21.12.18 07:46:28 MSK )
Последнее исправление: crutch_master 21.12.18 07:55:02 MSK (всего исправлений: 6)

который сайт очень быстро мог обойти
Тебя забанят или просто сервер положишь (а это уже уголовка, особенно для детей в рядах Навального), если будешь сайты быстро обходить. Если хочешь быстро, то прежде задайся вопросом где взять охапку проксей по дешевке.
На джаве с нормальной IDE.
сможете ещё объяснить мне почему php плох для парсеров?
Парсер это не рокетсайнс, его хоть на баше может делать, поэтому пхп сойдет. Главное то не ЯП, а хорошая библиотека под это дело. Найдешь хорошую библиотеку, с хорошей документацией — считай пол дела сделано.
foror ★★★★
( 21.12.18 07:58:00 MSK )
Последнее исправление: foror 21.12.18 08:00:19 MSK (всего исправлений: 2)
