Net::HTTP - Универсальный базовый парсер с поддержкой многостраничного парсинга и обходом CloudFlare
Net::HTTP – это универсальный парсер, который позволяет решать большинство нестандартных задач. Может быть использован как основа для для парсинга произвольного контента с любых сайтов. Позволяет скачать код страницы по ссылке, поддерживает многостраничный парсинг (переход по страницам), автоматическую работу с прокси, позволяет выполнить проверку успешного ответа по коду или по содержимому страницы.
Кейсы по применению парсера Net::HTTP
Аукцион доменов REG.RUПарсинг аукциона свобождающихся доменов с возможностью фильтрации
Данные по SSL сертификатуПарсинг данных SSL сертификата доменов с сайта leaderssl.ru
Парсинг ресурса Booking.comПолучение результатов поиска квартир и отелей на сайте
Сбор характеристик товараПример парсинга неизвестного количества характеристик товара
Парсинг базы фильмов из IMDBПолучает данные о каждом фильме и записывает их в результат
Проверка наличия HTTPSПресет проверяет наличие HTTPS на сайте
Список собираемых данных
- Контент
- Код ответа сервера
- Описание ответа сервера
- Заголовки ответа сервера
- Прокси, использованные при запросе
- Массив со всеми собранными страницами (используется при работе опции Use Pages)
Возможности
- Многостраничный парсинг (переход по страницам)
- Автоматическая работа с прокси
- Проверка успешного ответа по коду или по содержимому страницы
- Поддерживает сжатия gzip/deflate/brotli
- Определение и преобразование кодировок сайтов в UTF-8
- Обход защиты CloudFlare
- Выбор движка (HTTP или Chrome)
- Опция Check content – выполняет указанное регулярное выражение на полученной странице. Если выражение не сработало, страница будет загружена заново с другой прокси.
- Опция Use Pages – позволяет перебрать указанное количество страниц с определенным шагом. Переменная $pagenum содержит текущий номер страницы при переборе.
- Опция Check next page – необходимо указывать регулярное выражение, которое будет извлекать ссылку на следующую страницу (обычно кнопка "Вперёд"), если она существует. Переход между страницами осуществляется в рамках указанного лимита (0 - без ограничений).
- Опция Page as new query – переход на следующую страницу происходит в новом запросе. Позволяет убрать ограничение на количество страниц для перехода.
Варианты использования
- Скачивание контента
- Скачивание картинок
- Проверка кода ответа сервера
- Проверка наличия HTTPS
- Проверка наличия редиректов
- Вывод списка URL редиректов
- Получение размера страницы
- Сбор мета-тегов
- Извлечение данных из исходного кода страницы и/или заголовков
Примеры запросов
В качестве запросов необходимо указывать ссылки на страницы, например:
Варианты вывода результатов
A-Parser поддерживает гибкое форматирование результатов благодаря встроенному шаблонизатору Template Toolkit, что позволяет ему выводить результаты в произвольной форме, а также в структуированной, например CSV или JSON.
Вывод контента Код ответа сервераФормат результата [% response.Redirects.0.Status || сode %] позволяет выводить статус 301, если в запросе присутствуют редиректы.
Получение данных о запросеПеременная $response помогает получить о запросе и ответе сервера
Получение редиректов JSON с редиректами Вывод статуса ответа сервера Время ответа сервера Получение размера страницыВ качестве примера размер представлен в трех разных вариантах.
Обработка результатов
A-Parser позволяет обрабатывать результаты непосредственно во время парсинга, в этом разделе мы привели наиболее популярные кейсы для парсера Net::HTTP.
Вывод заголовков H1-H6Добавить регулярку (опция Использовать регулярку) <(h\d)>(.+?)<\/\1> , в поле "Применить к" выбрать $pages.$i.data - Page content , в поле напротив регулярки выбрать модификаторы sg . В качестве типа результата будет автоматически выбран массив. В поле Имя указать headers , в "$1 to" указать tag , нажать на плюсик напротив и в "$2 to" указать content . В Формате результата использовать $p1.headers.format('$content\n') .
Сбор мета-теговДобавить регулярку (опция Использовать регулярку) (<meta[^>]+>) , в поле "Применить к" выбрать $pages.$i.data - Page content , в поле напротив регулярки выбрать модификатор g . В качестве типа результата будет автоматически выбран массив. В поле Имя указать meta , в "$1 to" указать item . В Формате результата использовать $p1.meta.format('$item\n') .
Варианты прохода по пагинации
Использование Use pagesUse pages. Данная функция позволяет проходить по пагинации с указанием наперед известного числа страниц. Для примера возьмем одну из категорий на сайте каталога товаров https://www.proball.ru/catalog/myachi/ . Вверху и внизу мы видим панель пагинации. При клике по пиктограмах с номерами страниц можно увидеть в строке браузера, как осуществляется передача параметра с номером страницы в конце запроса:
Use pages - это своего рода счетчик, который фактически в переменную $pagenum подставляет по порядку номера, увеличивая их на то значение, которое мы укажем
Как видно на скриншоте, в формате запроса парсера в нужном месте используется переменная $pagenum . Функция Use pages переберет и подставит в запрос все значения, фактически мы будем получать ссылки для запроса
где вместо переменной $pagenum будет подставлен номер страницы, начиная от 1 и до 4 с шагом 1 . Таким образом, получается проход по страницах нужного диапазона. В этом заключается ограничение данного метода - нужно заранее знать количество страниц, которые есть в пагинации. Очевидно, что при одновременном парсинге нескольких категорий, количество страниц везде будет разное, и как выход, мы можем просто указать большее количество предполагаемых страниц. Но это не совсем правильно, поэтому есть более оптимальное решение, о котором речь пойдет дальше
Использование Сheck next pageСheck next page - это еще одна функция, которая позволяет организовать проход по пагинации. Особенность ее использования заключается в том, что для перехода на следующую страницу, нужно использовать регулярное выражение, которое будет возвращать ссылку на следующую страницу. Это более удобный и наиболее часто применяемый способ. Но применить его для https://www.proball.ru/catalog/myachi/ не получится, т.к. в коде нету ссылок на следующие страницы. Ссылки там генерируются скриптом. Поэтому возьмем в качестве примера сайт http://www.imdb.com/search/name?gender=female . Здесь есть пагинация как в начале так и в конце списка. Посмотрев и проанализировав исходный код, можно увидеть наличие ссылки, которая позволяет переходить на следующую страницу:
- в поле Next page RegEx запишем регулярное выражение
- в поле Limit укажем количество страниц, которое нужно пройти
В примере указано 4 . Указав лимит, мы определяем, сколько страниц парсер должен пройти. В нашем случае будет пройдено 5 страниц, так как отсчет начинается с 0 . Если указать лимит 0 , то парсер будет работать до того времени, пока не пройдет все страницы в независимости от их количества. Это очень удобно использовать, когда нужно спарсить все результаты со всех страниц
Как было сказано выше, есть возможность динамически ограничивать количество страниц в Use pages. Для этого нужно совместно использовать Use pages и Сheck next page. Дополним пример, который был рассмотрен при описании Use pages и добавим в него функцию Сheck next page:
Эти две функции в паре работают следующим образом: Use pages обеспечивает проход по страницам, а Check next page проверяет, существует ли следующая. Как только Check next page не найдет следующей страницы, парсинг этой категории будет остановлен, не дожидаясь прохода по всему количеству, которое указано в Use pages. Совмещая эти функции, мы добавляем эффективности в работе парсера, экономя время и ресурсы
Использование макросов подстановокМакросы подстановок позволяют реализовать последовательную подстановку значений из указанного диапазона
Данный пресет будет работать следующим образом. Указав в формате запроса шаблон:
мы добавляем подстановку значений от 1 до 10 (диапазон можно указать любой) в сам запрос. Таким образом мы получаем запросы, оторые обеспечивают проход по нужному количеству страниц, вида:
Использование макросов подстановок для прохода по пагинации похоже на функцию Use pages и имеет такие же ограничения, то есть нужно указывать конкретный диапазон значений. Преимуществом данного метода можно считать то, что через макросы подстановок можно подставлять разные значения, как числовые, так и текстовые, например, слова или выражения. Таким образом мы можем более гибко вставлять нужные части в запросы или формировать сами запросы из частей, которые будут размещаться в разных файлах, если этого требует задание