Как парсить сайты с помощью CsQuery


Удобная и бесплатная библиотека CsQuery дает отличную возможность написать свой парсер для сайтов. Гибкий и шустрый. Давайте на примере рассмотрим, как ей пользоваться. В этой статье я расскажу основы, а также помогу избежать ошибок. Если же вам требуется парсер на заказ, то пишите мне – сделаем вместе. Не бесплатно, но недорого.

Немного теории

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

CsQuery создаст идентичный DOM из того же источника, что и любой браузер на основе Gecko. CsQuery реализует все селекторы CSS2 и CSS3 и фильтры, а также комплексную модель DOM. Вы можете использовать все те же методы jQuery (и элемент DOM), с которыми вы знакомы, для перемещения и управления DOM.

Механизм выбора CSS полностью индексирует каждый документ по имени тега, идентификатору, классу и атрибуту. Индекс является субсекто-дееспособным, что означает, что сложные селекторы все еще смогут воспользоваться индексом (для любой части индексированного селектора). Производительность селекторов по сравнению с другими существующими на C# в HTML парсинг библиотек порядков быстрее.

Более того, весь тестовый набор из Sizzle (jQuery CSS selector engine) и jQuery (1.6.2) был перенесен из Javascript в C# для этого проекта. Почти все, что вам нужно, это в объект CQ, который предназначен для работы как объект jQuery.

Подключение CsQuery к Visual Studio

Итак, для начала качаем проект CsQuery. Из множества файлов в нем нам потребуется только библиотека CsQuery.dll, находящаяся в папке distribution. Подключаем её как обычно к проекту в Visual Studio – добавляем ссылку:



И теперь можно использовать пространство имен

using CsQuery;
Отлично. Но теперь давайте посмотрим на сайт, с которого требуется собрать информацию, спарсить данные – так называемый сайт-донор.

Разбор сайта

Чтобы что-то вытащить с сайта, надо понять его структуру. Для примера возьмем сайт mingkh.ru – предположим, что нам надо вытащить оттуда адреса и телефоны управляющих компаний. Очень часто помимо непосредственного разбора страницы компании, с которой надо взять информацию, требуется еще собрать и адреса страниц этих самых компаний. В нашем случае это делается просто.

Есть страница со всеми компаниями. Если мы посмотрим исходный код её, то обнаружим закономерность:



Каждая ссылка в таблице класса table-striped ведет на страницу компании, так что собрав все эти ссылки, мы сможем получить массив адресов страниц.

Сбор адресов страниц

Возвращаемся к нашему проекту в визуал студии на C# и пишем такой код в обработчике кнопки:

CQ dom = CQ.CreateFromUrl("http://mingkh.ru/rating/moskva/moskva/");          
            foreach (IDomObject obj in dom.Find(".table-striped a"))
            {
                if (obj.GetAttribute("href") != "")
                {
                     chet++;
                     mass[chet, 0] = "http://mingkh.ru" + obj.GetAttribute("href");
                    textBox1.Text += mass[chet, 0] + System.Environment.NewLine;
                }
  }
Давайте рассмотрим его подробнее. В первой строке создаем дерево элементов страницы. Далее проходим циклом по всем ссылкам в таблице с классом table-striped. Если у объекта ссылка не пустая, то заносим в массив и выводим его в текстбокс. Отлично, теперь мы имеем список адресов.

Карточка компании

Пришло время поработать с карточкой компании. Здесь тоже все просто. Необходимая нам информация находится в тегах dd:



Получить её можно вот так:

CQ dom = CQ.CreateFromUrl("http://mingkh.ru/moskva/moskva/1157746180305/");          

    foreach (IDomObject obj in dom.Find("dd"))
                    {
                        if (obj.TextContent != "")
                        {
textBox1.Text += = obj.TextContent;
                        }
                    }
Чтобы выбрать адреса и телефоны, можно пойти двумя путями. Если пункты в карточке компании не меняются и у всех одинаковы, то просто взять элемент по порядку. Например, адрес – это третий тег dd, то есть выбирается вот так:

dom.Find("dd").Eq(3)
А если вы не уверены, что какой-то пункт может быть пропущен, то для каждой страницы можно составить таблицу соответствий, инициализировать два массива. Первый заполнить названиями пунктов, а второй – содержимым.

В следующих статьях мы разберем некоторые хитрости парсинга. При обработке больших объемов информации требуется работать не так в лоб. Если вам требуется помощь, то смело пишите мне. За небольшую плату я с удовольствием помогу вам разобраться в вопросах парсинга сайтов на C#.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, CsQuery, си шарп, парсинг, парсинг сайтов




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Урок 24. Получение информации DateTime C#
Задача с массой на Java
Анализ алгоритмов: введение