Обсуждение статьи "Парсинг HTML с помощью curl"

 

Опубликована статья Парсинг HTML с помощью curl:

В статье описывается простейшая библиотека с использованием сторонних компонентов для парсинга HTML-кода. Из неё вы узнаете как добраться до данных, которые нальзя получить GET и POST запросами. Мы подберем какой-либо сайт с не слишком объемными страницами и попытаемся получить с него интересную информацию.

Как и в других таких случаях, вполне может возникнуть такой вопрос: "А зачем это нужно?". Можно прямо из MQL скрипта принять страницу сайта и прочитать в заранее известном месте заранее известное количество символов. А затем работать с получившейся строкой. Да, так можно сделать. Но такой подход намертво привяжет код MQL скрипта к HTML коду страницы. А если этот код хотя бы минимально изменится? Вот в таких случаях и возникает потребность в парсере, который предоставляет возможность работы c HTML-документом, как с деревом (к этому мы еще вернемся в соответствующем разделе). И его можно реализовать на MQL, но правильно ли это будет, как скажется на производительности, удобно ли будет сопровождать такой код? Поэтому задача парсинга выносится в отдельную библиотеку. Сразу стоит сказать, что и парсер не решает всех проблем. Он свою часть работы сделает, но что, если дизайн сайта изменится настолько радикально, что станут другими имена классов, атрибуты? В этом случае придется оперативно менять объект поиска, а возможно и не один объект. Поэтому одна из задач, которая будет перед нами стоять, это создание нужного кода максимально быстро и с наименьшими усилиями. И желательно из уже готовых частей. В таком случае разработчик сможет легче сопровождать код и оперативно вносить в него изменения в случае возникновения описанной ситуации.

Мы подберем какой-либо сайт с не слишком объемными страницами и попытаемся получить с него интересную информацию. Какую именно, это не так уж и важно, но все-таки постараемся, чтобы наши усилия были не совсем бесполезны. Разумеется, эта информация должна быть доступна MQL скриптам в терминале. Программный код будет оформлен в виде стандартной DLL библиотеки.

В настоящей статье задача будет решаться без асинхронных вызовов и учета многопоточности.

Автор: Andrei Novichkov

 

Есть ли какие либо ограничения по парсингу?

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

Московская Биржа - Основные параметры срочного контракта
Московская Биржа - Основные параметры срочного контракта
  • www.moex.com
Влияем на развитие, создаем будущее
 
Aleksey Vyazmikin:

Есть ли какие либо ограничения по парсингу?

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

Какого то единого механизма для парсинга создать нельзя. Статью можно взять за основу. Библиотеки для парсинга и приема страниц тоже можно взять. В статье упор сделан на том, как работать с библиотеками на конкретном примере. Причем примере не сложном, что бы читателя не путать. Получаем страницу, грузим её в парсер. А вот потом сугубо индивидуальная работа, ибо структура страниц везде разная и это придется учитывать. Поэтому код из статьи нужно будет править.

 

лихо закручено !

андрей, а вы не можете просто дать

1.описание всех функций в этой dll - GETANDPARSE.dll 

2. примеры вызова каждой из функций

это позволит не вникать во все детали проекта, у меня, например, до сих пор  VS 2010,

потому я не могу даже раскрыть ваш проект


я хочу использовать вашу dll для

1. прочитать страницу из SSL сайта

2. записать ее в файл

3. парсить уже буду самостоятельно, скорее всего..

 
Denis Sartakov:

лихо закручено...

Добрый день.

Вам не поможет описание функций из моей длл. К сожалению, любая такая длл будет "странично зависимой". Моя длл парсит только ту страницу, про которую я пишу в статье. Тут ничего не сделаешь, в длл приходится зашивать алгоритм поиска нужной инфы в уже пропарсенной страницы, разумеется, он всякий раз разный.  В статье об этом есть. Постараться уйти от этого, "обобщить" как то схему поиска  - получить на выходе целое мощное самостоятельное приложение, которое будет нужно очень и очень не многим. Вам нужен новый проект. Возьмите курл для получения страниц, возьмите джимбо для парсинга. Вам останется всего лишь пробежаться по дереву, которое построит джимбо и отыскать нужный кусок. И второе. Моя длл - учебная. Я рассчитываю на читателя с не большими знаниями предмета, люди разбирающиеся, все знают лучше меня. А поэтому код максимально облегчен - минимум проверок, отсутствие обработки исключений, для боевого варианта это недопустимо.

P.S.  Все таки 10-ю студию можно было бы обновить. У нас в феврале уже с++ 20 грядет, так что пора бы .

 
Andrei Novichkov:

Добрый день.

Вам не поможет описание функций из моей длл. К сожалению, любая такая длл будет "странично зависимой". Моя длл парсит только ту страницу, про которую я пишу в статье. Тут ничего не сделаешь, в длл приходится зашивать алгоритм поиска нужной инфы в уже пропарсенной страницы, разумеется, он всякий раз разный.  В статье об этом есть. Постараться уйти от этого, "обобщить" как то схему поиска  - получить на выходе целое мощное самостоятельное приложение, которое будет нужно очень и очень не многим. Вам нужен новый проект. Возьмите курл для получения страниц, возьмите джимбо для парсинга. Вам останется всего лишь пробежаться по дереву, которое построит джимбо и отыскать нужный кусок. И второе. Моя длл - учебная. Я рассчитываю на читателя с не большими знаниями предмета, люди разбирающиеся, все знают лучше меня. А поэтому код максимально облегчен - минимум проверок, отсутствие обработки исключений, для боевого варианта это недопустимо.

P.S.  Все таки 10-ю студию можно было бы обновить. У нас в феврале уже с++ 20 грядет, так что пора бы .

ага, спасибо.

 

андрей, подскажи как качнуть из libcurl  это вот


libcurl-x32.dll и libcurl-x32.lib


качается какая-то чепуха...

libcurl.a  -  это что за тип такой ?

 
Denis Sartakov:

андрей, подскажи как качнуть из libcurl  это вот


libcurl-x32.dll и libcurl-x32.lib


качается какая-то чепуха...

libcurl.a  -  это что за тип такой ?

Там внимательно смотреть надо и выбирать ОС и разрядность. 32-х разрядные версии скорее всего будут называться просто libcurl.dll

Я вам прикрепил файл, но не проверял

Файлы:
libcurl.zip  482 kb
 
Denis Sartakov:

я хочу использовать вашу dll для

1. прочитать страницу из SSL сайта

2. записать ее в файл

3. парсить уже буду самостоятельно, скорее всего..

Можно без DLL. Чем не устраивает скачивание через WebRequest? А парсить можно на MQL5. Есть разные готовые коды для HTML/XML. В качестве примера - вот такой вариант.

Извлечение структурированных данных из HTML-страниц с помощью CSS-селекторов
Извлечение структурированных данных из HTML-страниц с помощью CSS-селекторов
  • www.mql5.com
Среда разработки MetaTrader позволяет интегрировать программы и внешние данные, в частности, получаемые из сети Интернет через WebRequest. Наиболее универсальным и часто применяемым форматом данных в сети является HTML. В тех случаях, когда тот или иной публичный сервис не предоставляет открытый API для запросов или его протокол трудно...
 
Andrei Novichkov:

Там внимательно смотреть надо и выбирать ОС и разрядность. 32-х разрядные версии скорее всего будут называться просто libcurl.dll

Я вам прикрепил файл, но не проверял

тут толькл dll, нужна библтотека .lib,

чтобы можно было делать свои проекты в С++

 
Stanislav Korotky:

Можно без DLL. Чем не устраивает скачивание через WebRequest? А парсить можно на MQL5. Есть разные готовые коды для HTML/XML. В качестве примера - вот такой вариант.

парсить - здесь вообще никаких проблем, худо, бедно всегда можно сделатью

вопрос один только - 

1. прочитать из программы страницу из SSL сайта


адекватных рабочих  примеров я не нашел....

Причина обращения: