На каком языке лучше писать парсеры?
Нужно сделать парсер который сайт очень быстро мог обойти, подскажите на каком языке лучше его писать? Думала на 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)
На чем писать парсер сайтов? на PHP или Ruby?
На чем писать парсер сайтов?
PHP знаю хорошо
Ruby вообще не знаю 🙂
Парсер должен быть многопоточным и быстро работать)
вот думаю ради такого нужно выучить ruby
или хватит PHP?
- Вопрос задан более трёх лет назад
- 9207 просмотров
Комментировать
Решения вопроса 2
Golang | Python | NodeJS | Java
Нормальные люди не ищут себе приключений, берут scrapy и python и получают многопоточный парсер из коробки.
Ответ написан более трёх лет назад
Комментировать
Нравится 6 Комментировать

Javascript Developer
Ответ написан более трёх лет назад
Нравится 3 2 комментария
Alexv01 @Alexv01 Автор вопроса
Он нормально спарсит сайт в 200к-500к страниц и будет парсить каждое утро в 9-00?

ну явно в nodeJs многопоточность сделана лучше чем в php..
Ответы на вопрос 8

Системный администратор со стажем.
На чем писать парсер сайтов?
— на чем умеете.
Выучить руби оно конечно можно, но не ради написания парсера, к тому же парсер написать на руби ничуть не легче чем на пэхапе.
в пыхе есть нормальная многопоточность?
— той которая есть для парсера хватит с лихвой.
Он нормально спарсит сайт в 200к-500к страниц и будет парсить каждое утро в 9-00
Это вообще не зависит от языка написания парсера. Зависит от того что за сайт будете парсить в первую очередь, как часто вас банить будут, как качественно парсер написан, хорошие ли прокси сервера используете, и.т.п
Парсинг данных, какой язык практичней?
Приветствую всех ребята.
Постараюсь описать как можно короче и как можно понятнее.
Нужно написать полноценный парсер, который будет собирать информацию с сайтов по указанным юзерами категориям.
Простой пример 1 — Нужно с сайта toster.ru собрать информацию пользователей с ником на первую букву ( А ) сколько вопросов было решено этими юзерами, процент, сколько сообщений они оставили под какими тегами больше всего решенных вопросов и т.д.
Простой пример 2 — Нужно с сайта фриланс собрать среднюю стоимость работы в час php разработчика по гео РФ или Украина. Процент положительных и отрицательных отзывов и т.д.
Собственно вопрос стоит в реализации. На каком языке будет практичнее пилить данный скрипт?
Где то, слышал что подобные затеи хорошо реализуются на ASP.NET собственно вопрос к знающим, так ли это?
Классика PHP так как скрипт будет на сервере я думаю при многократном обращении в секунду будет долго обрабатывать. Допустим парсят ежесекундно 500 человек по ( хххх mb) данным. Небольшая ли нагрузка для PHP как долго он будет справляться с задачей?
Взгляд на Golang — как GO справляется с такими задачами?
Взгляд на node js и java — хотелось бы услышать ваше мнение.
Друзья, прошу не кидать нелестные фразы в мою сторону. Так как раньше такого опыта не было, решил спросить у вас.
Я не совсем понимаю что лучше использовать в данных ситуациях.
Задача: Быстрота, Надежность, Многопоточность, что бы выдерживал большое количество обращений в секунду.
Всем спасибо! 🙂
- Вопрос задан более трёх лет назад
- 5411 просмотров
1 комментарий
Простой 1 комментарий
Парсинг сайта вместе с Python и библиотекой Beautiful Soup: простая инструкция в три шага
Рассказываем и показываем, как запросто вытянуть данные из сайта и «разговорить» его без утюга, паяльника и мордобоя.


Иллюстрация: Катя Павловская для Skillbox Media

Антон Яценко
Изучает Python, его библиотеки и занимается анализом данных. Любит путешествовать в горах.
Для парсинга используют разные языки программирования: Python, JavaScript или даже Go. На самом деле инструмент не так важен, но некоторые языки делают парсинг удобнее за счёт наличия специальных библиотек — например, Beautiful Soup в Python.
В этой статье разберёмся в основах парсинга — вспомним про структуру HTML-запроса и спарсим сведения о погоде с сервиса «Яндекса». А ещё поделимся записью мастер-класса, на котором наш эксперт в веб-разработке покажет, как с нуля написать веб-парсер.
Что такое парсинг и зачем он нужен?
Парсинг (от англ. parsing — разбор, анализ), или веб-скрейпинг, — это автоматизированный сбор информации с интернет-сайтов. Например, можно собрать статьи с заголовками с любого сайта, что полезно для журналистов или социологов. Программы, которые собирают и обрабатывают информацию из Сети, называют парсерами (от англ. parser — анализатор).
Сам парсинг используется для решения разных задач: с его помощью телеграм-боты могут получать информацию, которую затем показывают пользователям, маркетологи — подтягивать данные из социальных сетей, а бизнесмены — узнавать подробности о конкурентах.
Существуют различные подходы к парсингу: можно забирать информацию через API, который предусмотрели создатели сервиса, или получать её напрямую из HTML-кода. В любом из этих случаев важно помнить, как вообще мы взаимодействуем с серверами в интернете и как работают HTTP-запросы. Начнём с этого!
HTTP-запросы, XML и JSON
HTTP (HyperText Transfer Protocol, протокол передачи гипертекста) — протокол для передачи произвольных данных между клиентом и сервером. Он называется так, потому что изначально использовался для обмена гипертекстовыми документами в формате HTML.
Для того чтобы понять, как работает HTTP, надо помнить, что это клиент-серверная структура передачи данных․ Клиент, например ваш браузер, формирует запрос (request) и отправляет на сервер; на сервере запрос обрабатывается, формируется ответ (response) и передаётся обратно клиенту. В нашем примере клиент — это браузер.
Запрос состоит из трёх частей:
- Строка запроса (request line): указывается метод передачи, версия HTTP и сам URL, к которому обращается сервер.
- Заголовок (message header): само сообщение, передаваемое серверу, его параметры и дополнительная информация).
- Тело сообщения (entity body): данные, передаваемые в запросе. Это необязательная часть.
Посмотрим на простой HTTP-запрос, которым мы воспользуемся для получения прогноза погоды:
_GET /https://yandex.com.am/weather/ HTTP/1.1_
В этом запросе можно выделить три части:
- _GET — метод запроса. Метод GET позволяет получить данные с ресурса, не изменяя их.
- /https://yandex.com.am/weather/ — URL сайта, к которому мы обращаемся.
- HTTP/1.1_ — указание на версию HTTP.
Ответ на запрос также имеет три части: _HTTP/1.1 200 OK_. В начале указывается версия HTTP, цифровой код ответа и текстовое пояснение. Существующих ответов несколько десятков. Учить их не обязательно — можно воспользоваться документацией с пояснениями.
Сам HTTP-запрос может быть написан в разных форматах. Рассмотрим два самых популярных: XML и JSON.
JSON (англ. JavaScript Object Notation) — простой формат для обмена данными, созданный на основе JavaScript. При этом используется человекочитаемый текст, что делает его лёгким для понимания и написания:

Для просмотра HTML-кода откроем «Инспектор кода». Для этого можно использовать комбинации горячих клавиш: в Google Chrome на macOS — ⌥ + ⌘ + I, на Windows — Сtrl + Shift + I или F12. Инспектор кода выглядит как дополнительное окно в браузере с несколькими вкладками:

Переключаться между вкладками не надо, так как вся необходимая информация уже есть на первой.
Теперь найдём блок в коде, где хранится значение температуры. Для этого следует последовательно разворачивать блоки кода, располагающиеся внутри тега . Сделать это можно, нажимая на символ ▶.
Как понять, что мы на правильном пути? Инспектор кода при наведении на блок кода подсвечивает на сайте ту область, за которую он отвечает. Переходим последовательно вглубь HTML-кода и находим нужный нам элемент.
В нашем случае пришлось проделать большой путь: элемент с классом «b‑page__container» → первый элемент с классом «content xKNTdZXiT5r0Tp0FJZNQIGlNu xIpbRdHA» → элемент с классом «xKNTdZXiT5r0vvENJ» → элемент с классом «fact card card_size_big» → элемент с классом «fact__temp-wrap xFNjfcG6O4pAfvHM» → элемент с классом «link fact__basic fact__basic_size_wide day-anchor xIpbRdHA» → элемент с классом «temp fact__temp fact__temp_size_s». Именно последнее название класса нам потребуется на следующем шаге.

Шаг 3
Пишем код и получаем необходимую информацию
Продолжаем писать команды в терминал, командную строку, IDE или онлайн-редактор кода Python. На этом шаге нам остаётся использовать подключённые библиотеки и достать значения температуры из элемента . Но для начала надо проверить работу библиотек.
Сохраняем в переменную URL-адрес страницы, с которой мы планируем парсить информацию:

Но весь код нам не нужен — мы должны выводить только тот блок кода, где хранится значение температуры. Напомним, что это . Найдём его значение с помощью функции find() библиотеки Beautiful Soup.
Функция find() принимает два аргумента:
- указание на тип элемента HTML-кода, в котором происходит поиск;
- наименование этого элемента.
В нашем случае код будет следующим:
temp = bs.find('span', 'temp__value temp__value_with-unit')
И сразу выведем результат на экран с помощью print:
print(temp)
class="temp__value temp__value_with-unit">+17
Получилось! Но кроме нужной нам информации есть ещё HTML-тег с классом — а он тут лишний. Избавимся от него и оставим только значения температуры с помощью свойства text:
print(temp.text)
Всё получилось. Мы смогли узнать текущую температуру в городе с сайта «Яндекс.Погода», используя библиотеку Beautiful Soup для Python. Её можно использовать для своих задач — например, передавая в виджет на своём сайте, — или создать бота для погоды.
Скрапинг веб-сайтов с помощью Python — мастер-класс для новичков
Если вы совсем новичок в веб-скрапинге, но хотите написать свой парсер (например, для автоматической генерации отчётов в Excel), рекомендуем посмотреть вебинар от Михаила Овчинникова — ведущего инженера-программиста из Badoo. Он на понятном примере объясняет основы языка Python и принципы веб-скрапинга. Уже в начале видеоурока вы запустите простой парсер и научитесь читать данные в формате HTML и JSON.
Запись вебинара по скрапингу сайтов с помощью Python и библиотеки Beautiful Soup
Парсинг динамических сайтов c помощью Python и библиотеки Selenium
Бесплатная библиотека Selenium позволяет эмулировать работу веб-браузера — то есть «маскировать» веб-запросы скрипта под действия человека в Google Chrome или Safari. Почему это важно? Сайты умеют распознавать ботов и блокируют IP-адреса, с которых отправляются автоматические запросы.
Избежать «бана» можно двумя способами: изучить HTTP, принципы работы Python с вебом и написать свой эмулятор с нуля или воспользоваться готовым инструментом. Во втором случае Selenium — одно из лучших и самых удобных решений.
О том, как работать с библиотекой, рассказал Михаил Овчинников:
Запись вебинара по сбору данных с помощью библиотек Selenium и Beautiful Soup
Резюме
Парсинг помогает получить нужную информацию с любого сайта. Для него можно использовать разные языки программирования, но некоторые из них содержат стандартные библиотеки для веб-скрейпинга, например Beautiful Soup на Python.
А ещё мы рекомендуем внимательно изучить официальную документацию по библиотекам, которые мы использовали для парсинга. Например, можно углубиться в возможности и нюансы использования библиотеки Beautiful Soup на Python.
Читайте также:
- 3 фреймворка для тестирования на Python: обзор конфигураций
- 5 шаблонов проектирования, которые должен освоить каждый разработчик
- Как происходит модульное тестирование в Python