Написание простого парсера на python
10.12.2024
51
0
0
0
0
Вводная
В этой статье я приведу пример самого простого парсера на питоне. В двух версиях. Первая это парсер статических страниц, вторая это парсер динамически-загружаеммых страниц. Для того, кто пишет парсеры разница между ними не очень большая, но есть. В обоих случаях, для сбора ссылок на изображения я использовал BeautifulSoup4.
Так как, разрешения парсить чужие сайты я пока не получил, решил показать на примере своего. Будем парсить "страницу обо мне". Там есть как встроенные изображения, так и динамически прогружаемые. Идеальный пример короче.
Если нужен исходный код и готовый проект, то вот прошу.
Базовый скрипт, его устройство и работа
Начнём пожалуй с установки необходимых пакетов и их импорта. Нам потребуются 3 пакета:
- requests - Для отправки запросов на целевой сайт и получение веб-страниц. Требуется для статического парсинга.
- selenium - Для создания браузера-без-интерфейса и отправки с него запросов. Требуется для динамического парсинга.
- beautifulsoup4 - Для самого скрапинга. Нахождение необходимых элементов и преобразование, сохранение его в нужном формате (файлы, списки ...)
Создадим виртуальное окружение и установим вышеперечисленные пакеты:
Данная команда создаст директорию .venv и загрузит туда базовые библиотеки, необходимые для питона, вместе с его исполняемым файлом.
Теперь активируем (войдём) в виртуальное окружение, для Windows:
А это для Linux:
После активации виртуального окружения, наконец, установим необходимые пакеты:
Теперь создадим файл main.py. Добавим необходимые импорты и целевой урл в файл:
В самый конец файла добавь точку входа программы. Данная строчка говорит о том, что при запуске данного файла через интерпретатор python, она выполнит две функции поочерёдно, get_static и get_dynamic.
О них мы поговорим в следующих главах, а пока посмотрим на мои декораторы и саму парсер-функцию:
Первый декоратор просто выводит заданное сообщение. В моём случае это имя функции. Есть и другой способ получить имя текущей функции в исполняемом потоке, но это будет уже слишком для данной статьи.
О том, как их использовать ты увидишь в следующих главах. Этот декоратор принимает строковый аргумент и выводит его на консоль перед тем, как исполнить функцию вокруг которой данный декоратор обёрнут.
Следующий декоратор работает по схожему принципу, он выводит в консоль все полученные изображения, и он не принимает никаких аргументов.
Дальше нам потребуется функция самого скрапинга. Непосредственно в нем мы и указываем, при помощи чего парсим, как парсим и что парсим. Создаётся суп ...
В этом "супе" мы находим все изображения и извлекаем из их данные, сохранённые в scr атрибуте. Создаётся список, который передаётся декоратору и там уже обрабатывается, то есть выводится в консоль.
Это конечно хорошо, но чтобы данная функция работал она должна получить некоторый исходник, то есть целевую страницу. И тут в дело вступают в дело две функции, о которых я говорил ранее; get_static и get_dynamic.
Парсер статических страниц
Если тебе необходимо спарсить статический сайт, то считай тебе повезло. В наши дни, таких сайтов встречаешь всё реже и реже. Но если целевой сайт такой, то данная функция будет работать как часы:
Мы подключили 2 декоратора о которых я говорил чуть выше. Они оборачиваются вокруг функции при помощи использования символа @. Эта функция принимает в качестве аргумента урл и возвращает текст самой страницы.
Парсер динамических страниц
Зачастую ты будешь сталкиваться с ситуацией, когда вроде бы ответ 200 и вроде бы страница вернулась, но на ней ничего нет. Так бывает, когда парсишь динамические сайты. Они просто ещё не прогрузили свой контент, а ты просто скачал шаблон без контента :(
Вот как можно получить динамическую страницу:
Принцип работы тот же что и у get_static. Мы подключаем 2 декоратора. Они оборачиваются вокруг функции при помощи использования символа @. Эта функция принимает в качестве аргумента урл и возвращает текст самой страницы.
Отличие лишь в реализации того, как получается сама страничка, ну и используемые инструменты, конечно. В данном случае я использовал Firefox, но ты можешь использовать любой другой браузер, главное чтобы он был у тебя установлен.
Я так же добавил несколько опций для настройки драйвера:
- headless - значит не создавать и не отображать окно браузера
- no-sandbox - значит использовать все доступные ресурсы машины на которой запущен скрипт
- disable-dev-shm-usage - значит создать дополнительный файл подкачки, если не хватит
После создания драйвера, задаём значение ожидания в секундах перед тем как спарсить страницу. Это не лучшее моё решение. Лучше бы использовать таймер, который кончается при загрузке определённого контента, так он будет ждать ровно столько, сколько надо, чтобы забрать страницу. Но дело в том, что все сайты разные и нужно знать, загрузку какого элемента ожидать. Поэтому я решил пойти по универсальному решению и тупо ждать 5 секунд. (´。_。`)
Все-таки выводы
Парсер полностью готов и единственное, что остаётся это его запустить. Да, это не совсем простой парсер, но он очень нагляден и имеет в своей основе всё необходимое чтобы спарсить большинство сайтов. Вот так его запускают:
И вот консольный вывод, который ты получишь:
Хочешь спарсить ссылки вместо изображений? Пожалуйста. Лишь перепиши функцию scrape, и готово.
Что-то или кто-то блокирует парсин? Пожалуйста. Модифицируй get_static, добавь прокси или начни ротацию пользовательских агентов. Если и это не помогло, переходим на тяжёлую артиллерию и начинаем динамический парсинг, модифицируем и его если потребуется; функция get_dynamic.
Не нравиться вывод в консоль? Ну так всегда можно переделать и сделать собственные декораторы.
В общем ты понял. Это базовый шаблон для твоего парсера. И в случае если ты, что-нибудь не так скопировал, вот полный скрипт:
И на этом я откланиваюсь. <(_ _)>
Комментарии
(0)
Отправить
Сейчас тут пусто. Буть первым (o゚v゚)ノ
Использованные термины
- Парсер ⟶ Это программа или компонент программного обеспечения, который анализирует текст или данные, разбивая их на составные части и преобразуя в удобный для обработки формат. Обычно парсеры используются для извлечения информации из структурированных данных, таких как HTML, XML, JSON или других форматов.
Релевантные вопросы
- Что такое ручной парсинг? Это процесс извлечения данных из веб ресурсов или документов подразумевающий ручной, то есть исполненный человеком без помощи каких-либо вспомогательных скриптов или программ.
- Можно ли парсить Instagram? Если данные, которые ты собираешься собрать являются публичными и они доступны всем, то однозначно можно. Плюс Инста предоставляет специальный API для парсинга, поэтому проблем возникнуть не должно.
- Что такое облачный парсер Это услуга по сборе информации из различных источников и группировки их в различных форматах, которая проводится на облачных серверах поставщика данной услуги.