Как сделать парсер на python

Добавил пользователь Владимир З.
Обновлено: 05.10.2024

Хочу отметить, что работа над этой статьей ещё не закончена. Если у вас есть замечания или дополнение, добро пожаловать в комментарии.

Важно

Всегда сначала посмотрите предлагает ли сайт собственный API, RSS/Atom фиды также пригодятся.

Требования

Мы будем использовать две дополнительные библиотеки для Python.

Запросы

Мы будем использовать библиотеку requests вместо urllib2, так как она во всех отношениях превосходит urllib2. Я мог бы долго это доказывать, но, как мне кажется, на странице этой библиотеки все сказано в одном абзаце:

LXML - это XML\HTML парсер, его мы будем использовать для извлечения необходимой нам информации из веб-страниц. Некоторые предпочитают BeautifulSoup, но я довольно близко знаком с написанием собственных xPath и стараюсь использовать Ixml для достижения максимальной скорости.

Краулинг и Парсинг

Краулинг (Crawling) - это самый обыкновенный парсер, только ссылку на следующую страницу вы получаете с той, на которой находитесь в данный момент (т.е. это поисковый робот, например, зашли на сайт и получили все ссылки, потом перешли по ним, потом снова получили остальные ссылки и перешли по ним и т.д). Краулинг используется для создания больших баз данных.

  • Краулинг категорий на сайте ebay (кстати у них есть API)
  • Краулинг контактных данных из телефонных справочников

Сохранение просмотренных адресов

Просмотренные адреса стоит сохранять, чтобы не парсить их по несколько раз. Для обработки не более 50000 адресов, я бы советовал использовать set (множество, тип данных). Можно просто просмотреть, есть ли адрес уже в наборе перед добавлением его в очередь на парсинг.

Если вы будете парсить крупный сайт, то предыдущий способ не поможет. Набор ссылок попросту достигнет больших размеров и будет использовать слишком много памяти. Решение - Фильр Блума. Не будем углубляться в подробности, но этот фильтр просто позволяет нам хранить посещенные адреса, а на вопрос “Был ли я уже по этому адресу?” он с очень большой вероятностью даёт верный ответ, при этом использует очень малый объём памяти. pybloomfiltermmap - очень хорошая реализация Фильтра Блума на Python.

Важно: обязательно нормализуйте URL адреса перед добавлением его в фильтр. В зависимости от сайта может потребоваться удаление всех параметров в URL. Вряд ли вы захотите сохранять один и тот же адрес несколько раз.

CSS селекторы

Так же я бы рекомендовал PyQuery, так как это тоже очень распространённое средство.

Извлекаем блок главного содержимого

Иногда приходится делать анализ только основного содержимого страницы, например, посчитать количество слов. В таком случае меню навигации или боковое меню можно исключить.

Можно использовать readability-lxml для этой цели. Основная его задача - извлекать основное содержимое со страницы (html всё равно может содержаться в извлекаемом содержимом). Продолжая решение задачи по подсчету слов, вы можете удалить html при помощи clean_html из lxml.html.clean, потом разбить результат по пробелам и произвести подсчет.

Параллелизм

Все хотят получить данные как можно быстрее, но запустив 200 параллельных запросов, вы только разозлите владельца хоста. Не стоит так делать. Сделайте одолжение всем, не допускайте более 5 одновременных запросов.

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

Robots.txt

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

Обычно исключением является случай, если вы пишите обычный парсер, например как у Google или Bing. В таком случае я бы советовал обращать внимание на файл robots.txt, чтобы избежать лишних задержек парсера. Если владелец хоста не хочет чтобы вы индексировали какое то содержимое, то и не следует этого делать.

Как не быть замеченным?

Не всегда хочется, чтобы ваши действия были замечены. На самом деле этого довольно просто добиться. Для начала следует изменять значения user agent в случайном порядке. Ваш IP адрес не будет изменяться, но такое часто случается в сети. Большинство крупных организаций, например университеты, используют один IP адрес для организации доступа в интернет всей своей локальной сети.

Следующее средство - прокси-сервера. Существует довольно много недорогих прокси-серверов. Если вы запускаете свои запросы со ста разных адресов, постоянно изменяете user agent да и ещё всё это происходит из разных дата центров, то отследить вас будет довольно сложно. Вот неплохой сервер - My Private Proxy.

Доходило до того, что к тому времени как прокси сервера, которые я использовал, были заблокированы владельцами хостов, сами сервера уже меняли свои IP адреса на новые.

Наследуем класс Response

Я бы советовал всегда наследовать класс requests.model.Response, так как в нем заключены очень полезные методы.

Частые проблемы

Установка LXML

Довольно часто возникают проблемы при установке Ixml, особенно в линуксе. Просто вначале надо установить зависимости:

а уже после можно выполнять команду pip install lxml в обычном режиме.

Как парсить сайты с Ajax

Сайт выдаёт другое содержимое парсеру

  1. Проверьте исходный код страницы и убедитесь в том, что искомые данные действительно там присутствуют. Вполне возможно, что содержимое было изменено при помощи javascript, а наш парсер не выполняет подобные действия. В таком случае есть только один выход - PhantomJS< :target="_blank" >. Управлять им вы можете при помощи Python, просто используйте selenium< :target="_blank" >или splinter.
  2. Часто сайты выдают разное содержимое разным браузерам. Сверьте параметры user agent вашего браузера и парсера.
  3. Иногда сайты различают ваше географическое положение и изменяют своё содержимое исходя из него. Если вы запускаете свой скрипт со стороннего сервера, то это может повлиять на содержимое ответа от сервера.

Пагинация

Иногда приходится парсить данные разбитые по страницам. К счастью, это тоже довольно легко обойти. Посмотрите внимательно на URL адреса, как правило, там присутствует параметр page или offset, отвечающий за номер страницы. Вот пример управления таким параметром:

Ошибка 403 / ограничения по частоте запросов

Решение простое, просто немного отстаньте от этого сайта. Будьте аккуратны с количеством параллельных запросов. Неужели вам действительно нужны эти данные в течение часа, может стоит немного подождать?

Если все таки это так необходимо, то стоит обратиться к услугам прокси-серверов. Просто создайте обычный прокси менеджер, который будет отслеживать, чтобы каждый прокси-сервер использовался не чаще чем через интервал X. Обратите внимание на разделы “Как не быть замеченным?” и “Параллелизм”

Примеры кода

Следующие примеры сами по себе не представляют большой пользы, но в качестве справки очень подойдут.

Пример простого запроса

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

Запрос с прокси

Парсинг содержимого ответа

Довольно легко распарсить html код полученный при помощи lxml. Как только мы преобразовали данные в дерево, можно использовать xPath для извлечения данных.

Скачиваем все изображения со страницы

Следующий скрипт скачает все изображения и сохранит их в downloaded_images/. Только сначала не забудьте создать соответствующий каталог.

Парсер на один поток

Этот парсер всего лишь показывает базовый принцип построения. Он использует очередь, чтобы можно было извлекать данные слева из очереди, а парсить страницы по мере их обнаружения. Ничего полезного этот скрипт не делает, он просто выводит заголовок страницы.

Веб-скарпинг - это автоматизированный процесс сбора данных с сайта.

Интернет – является центром всей информации на Земле, к сожалению, многая информация не является правдивой. Множество дисциплин, таких как : data science, business intelligence стараются искать истинную информацию и получать из неё пользу для бизнеса.

В данном гайде мы научимся:

- Парсить веб-сайт используя string методы и обычные выражения

- Парсить используя HTML parser

- Взаимодействовать с формами и другими компонентами сайта

Сбор информации с веб-сайта

Повторим ещё раз, веб-скрапинг - это автоматизированный сбор данных с сайтов. Но некоторые сайты запрещают парсить их данные при помощи того инструмента, который мы разработаем с вами в нынешнем гайде. Сайты могут запрещать парсить свои данные по след. Причинам:

Ваш первый Web scraper

Первый пакет, который мы используем, называется urlib. Он поможет нам работать с url. Данный модуль содержит urlopen() его нужно импортировать.

Далее присваиваем переменной url адрес в формате String.

Для того чтобы открыть данный сайт в python:

Теперь вы можете вывести данные переменной, чтобы увидеть контент сайта.

И когда у вас есть HTML как текст, вы можете извлечь информацию из него разными способами.

Извлекаем файлы из HTML методами String объекта

Одним из методов извлечения информации HTML файла могут быть string методы. Например, .find() для поиска через текст .

.fing() возвращает индекс первого входа нужного нам символа/тега. Покажем на примере " " методом .find().

Для того чтобы найти начало заголовка нам нужно к индексу добавить длину тега " ".

Также можем найти место где заканчивается " ":

Наконец, мы можем извлечь всё что находится в " ", зная первый и последний индекс:

На самом деле, HTML файл может быть намного менее предсказуемым, чем на Aphrodite странице. Поэтому далее мы вам покажем другой способ, который может решить эту задачу.

Регулярные выражения

Регулярные выражения - это паттерны, которые используются для поиска внутри текста типа string. Для этого нам нужна библиотека re.

Мы импортируем модуль re.

Регулярные выражения используют специальные метасимволы для определения разных паттернов. Например символ "*" разрешает вводить любые символы после себя.

Покажем на примере .findall() мы будем искать все совпадения с требуемым для нас выражением (первый элемент - то что мы ищем, второй - в каком тексте).

Используя параметр re.IGNORECASE позволяет методу не учитывать регистр.

Метод .replace() - заменяет все символы в тексте на требуемые нам символы.

Метод .sub() - " " для замены всего что находится между .

Давайте взглянем ближе на регулярные выражения:

  1. - отмечает открытие тега "title"
  2. *? - отмечает весь текст после открытие тега " "
  3. - отмечает элемент, который закрывает тег.

HTML парсер на Python


Ладно, хватит играться и развлекаться пора использовать серьёзные вещи для парсинг. К нашему счастью, в библиотеках Python есть множество инструментов, которые созданы для разных задач. Для парсинга нам подойдет Beautiful soup.

Скачиваем Beautiful soup

Теперь, вернёмся в едитор.

Создание объекта типа BeautifulSoup

Наша программа совершит 3 действия:

  1. Откроет URL
  2. Прочитает элементы и переведёт их в String
  3. Присвоит это объекту типа BeautifulSoup

При создании переменной "soup" мы передаём два аргумента, первый это сайт, который мы парсим, второй - какой парсер использовать.

Использование объекта BeautifulSoup. Методы:

Как можно заметить, есть много пустых строк, это результат появления символов новой строки в тексте HTML. Их можно убрать используя метод .replace() .

Если вам нужно что то найти, используйте .find()

Данная команда возвращает все теги .

Каждый объект становится тегом, поэтому можно использовать методы.

Даст нам имя переменной

Этот метод даст нам путь к файлу, например:

Можем увидеть что находится в заголовке

.string

Этот метод убирает теги, покажем на примере title:

Взаимодействие с HTML формами


Библиотека urllib идеально подходит для сбора информации с сайта, но иногда нам приходится взаимодействовать с сайтом, заполнять формы, нажать на кнопку. В этом нам поможет модуль MechanicalSoup.

Устанавливаем модуль

Создаём объект типа Browser

Можем запросить url

Если мы проверим "page" , то нам вернётся 200 - это значит что с сайтом всё в порядке. Если вернётся 404 или 500, то есть ошибка со стороны сайта/сервера.

Показывает нам структуру HTML

Взаимодействие с сайтом в реальном времени


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

Теперь мы можем использовать .get() объекта Browser.

Во-первых, нужно определить какой элемент требует обновления, скорее всего нужно просто найти id.

Давайте на примере разберёмся.

Прежде всего, советуем установить промежуток, чтобы сайт успевал перезагружаться. Используйте time.sleep(5) - 5 секунд.

Когда вы запустите программу, вы сразу увидите первый результат, который будет выведен на консоль. Далее будет перерыв в 10 секунд и всё повторится.

После 4 циклов программа остановится.

Используя такую технику, вы сможете собирать данные сайта в реальном времени, но будьте осторожны, слишком частые запросы буду подозрительны для сайта. Иначе ваш ip будет заблокирован и не будет возможности зайти на него.

Так же возможно сломать сервер, на котором хостится сайт, поэтому советуем читать "Правила пользования" (Terms of use)

Заключение


Python уникальный инструмент для множества задач. В данном уроке мы научились собирать информацию с сайта и переводить его в текст.

Только не забывайте, не все хотят делиться информацией в интернете. Всегда читайте Правила пользования, уважайте других контент-мейкеров.

В этой статье мы разберемся, как создать HTML скрапер на Python, который получает неофициальный доступ к коду сайта и позволяет извлечь необходимые данные.

Отличие от вызовов API

Альтернативный метод получения данных сайта — вызовы API. Взаимодействие с API — это официально предоставляемый владельцем сайта способ получения данных прямо из БД или обычных файлов. Обычно для этого требуется разрешение владельца сайта и специальный токен. Однако апи доступен не всегда, поэтому скрапинг так привлекателен, однако его законность вызывает вопросы.

Юридические соображения

Скрапинг может нарушать копирайт или правила использования сайта, особенно когда он используется для получения прибыли, конкурентного преимущества или причинения ущерба (например из-за слишком частых запросов). Однако скрапинг публично доступен и используется для личного использования, академических целей или безвредного некоммерческого использования.
Если данные являются платными, требуют регистрации, имеют явную защиту от скрапинга, содержат конфиденциальные данные или личные данные пользователей, то нужно избегать любого из видов скрапинга.

Установка Beautiful Soup в Python

Beautiful Soup — это Python библиотека для скрапинга данных сайтов через HTML код.
Установите последнюю версию библиотеки.

Импортируйте библиотеки в файле Python или Jupiter notebook:

И несколько стандартных библиотек, которые потребуются для скрапинга на Python:

Введение

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

Результаты поиск для скрапинга на Python

Предположим, что запрос приведет к странице результатов, которая выглядит следующим образом:

Как только мы узнаем, в каких элементах сайта хранятся необходимые данные, нам нужно придумать логику скрапинга, которая позволит нам получить всю нужную информацию из каждого объявления.
Нам предстоит ответить на следующие вопросы:

  1. Как получить одну точку данных для одного свойства (например данные из тега price в первом объявлении)?
  2. Как получить все точки данных для одного свойства со всей страницы (например все теги price с одной страницы)?
  3. Как получить все точки данных для одного свойства всех страниц с результатами (например все теги price со всех страниц с результатами)?
  4. Как устранить несоответствие, когда данные могут быть разных типов (например, есть некоторые объявления, в которых в поле цены указана цена по запросу. В конечном итоге у нас будет столбец, состоящий из числовых и строковых значений, что в нашем случае не позволяет провести анализ)?
  5. Как лучше извлечь сложную информацию (Например, предположим, что каждое объявление содержит информацию об общественном транспорте, например “0,5 мили до станции метро XY”)?

Логика получения одной точки данных

Все примеры кода для скрапинга на Python можно найти в Jupiter Notebook файле на GitHub автора.

Запрос кода сайта

Во-первых, мы используем поисковый запрос, который мы сделали в браузере в скрипте Python:

Переменная soup содержит полный HTML-код страницы с результатами поиска.

Поиск тегов-свойств

HTML классы и атрибут id

HTML-классы и id в основном используются для ссылки на класс в таблице стилей CSS, чтобы данные могли отображаться согласованным образом.
В приведенном выше примере, класс, используемый для получения информации о ценах из одного объявления, также применяется для получения цен из других объявлений (что соответствует основной цели класса).

Обратите внимание, что HTML-класс также может ссылаться на ценники за пределами раздела объявлений (например, специальные предложения, которые не связаны с поисковым запросом, но все равно отображаются на странице результатов). Однако для целей этой статьи мы фокусируемся только на ценах в объявлениях о недвижимости.
Вот почему мы сначала ориентируемся на объявление и ищем HTML-класс только в исходном коде для конкретного объявления:

Использование .text в конце метода find() позволяет нам возвращать только обычный текст, как показано в браузере. Без .text он вернет весь исходный код строки HTML, на которую ссылается класс:



Важное примечание: нам всегда нужно указывать элемент, в данном случае это p.

Логика получения всех точек данных с одной страницы

Чтобы получить ценники для всех объявлений, мы применяем метод find.all() вместо find():

Переменная ads теперь содержит HTML-код для каждого объявления на первой странице результатов в виде списка списков. Этот формат хранения очень полезен, так как он позволяет получить доступ к исходному коду для конкретных объявлений по индексу.

25 декабря 2021 – 25 января 2022, Онлайн, Беcплатно

Чтобы получить все ценники, мы используем словарь для сбора данных:

Важное примечание: использование идентификатора позволяет находить объявления в словаре:


Получение точек данных со всех страниц

Обычно результаты поиска либо разбиваются на страницы, либо бесконечно прокручиваются вниз.

Вариант 1. Веб-сайт с пагинацией

URL-адреса, полученные в результате поискового запроса, обычно содержат информацию о текущем номере страницы.

ссылки на страницы результатов поиска


Как видно на рисунке выше, окончание URL-адреса относится к номеру страницы результатов.

Важное примечание: номер страницы в URL-адресе обычно становится видимым со второй страницы. Использование базового URL-адреса с дополнительным фрагментом &pn=1 для вызова первой страницы по-прежнему будет работать (в большинстве случаев).

Применение одного цикла for-loop поверх другого позволяет нам перебирать страницы результатов:

Определение последней страницы результатов

Вы можете задаться вопросом, как определить последнюю страницу результатов? В большинстве случаев после достижения последней страницы, любой запрос с большим числом, чем фактическое число последней страницы, приведет нас обратно на первую страницу. Следовательно, использование очень большого числа для ожидания завершения сценария не работает. Через некоторое время он начнет собирать повторяющиеся значения.

Чтобы решить эту проблему, мы будем проверять, есть ли на странице кнопка с такой ссылкой:

Вариант 2. Сайт с бесконечным скроллом

В таком случае HTML скрапер не сработает. Альтернативные методы мы обсудим в конце статьи.

Устранение несогласованности данных

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

Функция для определения аномалий

И применить его при сборе данных:

Форматирование данных на лету

Используем эту функцию:

Получение вложенных данных

Информация об общественном транспорте имеет вложенную структуру. Нам потребуются данные о расстоянии, названии станции и типе транспорта.

Отбор информации по правилам

Первоначально переменная transport хранит два списка в списке, поскольку есть две строки информации об общественном транспорте (например, “0,3 мили Слоун-сквер”, “0,5 мили Южный Кенсингтон”). Мы перебираем эти списки, используя len транспорта в качестве значений индекса, и разделяем каждую строку на две переменные: расстояние и станцию.

Поиск дополнительных HTML атрибутов для визуальной информации

В коде страницы мы можем найти атрибут testid, который указывает на тип общественного транспорта. Он не отображается в браузере, но отвечает за изображение, которое отображается на странице. Для получения этих данных нам нужно использовать класс css-StyledIcon:

Преобразование в датафрейм и экспорт в CSV

Когда скрапинг выполнен, все извлеченные данные доступны в словаре словарей.

Данные объявления

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

Данные без вложенности

Создаём датафрейм

Мы можем экспортировать датафрейм в CSV:

Преобразование всех объявлений в датафрейм:

Мы это сделали! Теперь наш скрапер готов к тестированию.

Ограничения HTML скрапинга и его альтернативы

Этот пример показывает, насколько простым может быть скрапинг HTML на Python в стандартном случае. Для этого не нужно исследовать документацию. Это требует, скорее, творческого мышления, чем опыта веб-разработки.

Постановка задачи для парсинга

Урок 2. Парсер на Python
Урок 2. Парсер на Python
Урок 2. Парсер на Python
Урок 2. Парсер на Python

Наша задача на этом уроке заключается в том, что бы получить:

  1. Название каждого плагина
  2. Ссылку на плагин
  3. Количество отзывов
  4. Сохранить полученные данные в csv файл

Для начала работы, нам необходимо подготовить свое рабочее окружение,для этого:

  1. Открываем свой Pycharm (Или редактор, который вы используете)
  2. Создаем новый проект
  3. Импортируем библиотеки, как и в предыдущем уроке
  4. Дополнительно импортируем библиотеку csv (import csv)

Отлично, с постановкой задачи мы почти разобрались, ниже у нас код, который является каркасом парсера. Быстро пробежимся по коду, и закрепим наши знания, полученные в прошлом уроке.

  1. Функция get_html() — принимает адрес сайта, и возвращает свойство text объекта response
  2. Функция get_data() — принимает html код. Создаем экземпляр класса BS . Как и в первом уроке, мы передали два параметра ( html , и lxml )
  3. Функция main() — пока пустая функция, если не знакомы с оператором pass, советую почитать про данный оператор
  4. Точка входа

Анализ html разметки страницы

Как мы видим, у нас 4 блока с плагинами, и каждый блок заключен в тег section . Продолжим исследование html разметки страницы. Нам необходимо найти теги, внутри которых находятся необходимы нам данные.

  1. Ссылка на плагин
  2. Текст ссылки на плагин
  3. Количество отзывов

Отлично! Мы с вами проанализировали html код страницы, и выяснили в каких тегах хранятся наши данные. Ниже я описал структуру html страницы.

Урок 2. Парсер на Python

У нас есть структура html разметки, мы наглядно видим до каких тегов нам необходимо добраться, что бы получить нужные нам данные. Следующим шагом, мы напишем парсер, который будет собирать необходимые нам данные.

Создание парсера на Python

Ниже представлен листинг кода, который возвращает нам все найденные теги section .

Как видите в данном коде, появилось небольшое дополнение.

  1. В функции get_data() мы создали переменную articles
  2. Обратились к soup с помощью find_all , что бы найти все теги article , которые есть на странице
  3. Для того, что бы убедиться в том, что мы идем в правильном направлении, мы можем воспользоваться методом len()
  4. return len(article) , в случае если все правильно, то функция вернет нам 16 , так как у нас всего 16 плагинов на странице
  5. Если у вас возникает ошибка, опишите проблему в комментариях

Отлично, по сути наш парсер почти готов. Теперь, наша задача состоит в том, что бы в цикле получить нужные нам данные.

Как видите, с каждым разом к нашему коду добавляется новый функционал. Как вы понимаете основная операция происходит у нас в функции get_data() , и так же у нас появилась новая функция refinde() .

  1. В функции get_data() , мы нашли все теги article , с помощью метода find_all . Данный метод возвращает нам все найденные элементы в виде списка.
  2. Запускаем цикл for, и перебираем полученный список.
    1. Сначала ищем теги h3 , и забираем текст заключенный между ними. Это и есть заголовок нашего плагина
    2. Затем ищем ссылку на заголовок
    3. Далее ищем количество отзывов
    • 1,985 total ratings (без функции refinde)
    • 1985 с функцией refinde()

    Сама функция работает достаточно просто.

    • Функция принимает один аргумент в виде строки
    • Для строки используем метод split() , который по пробелу разбивает строку, и возвращает нам ее в виде списка, из этого списка, мы забираем первый элемент.
    • Первым элементом является число (количество скачиваний), но она содержит запятую, а так как мы хотим сохранить наши данные в csv, то лучше нам от нее избавиться
    • Используем метод replace() , и заменяем запятую на пустой символ

    И так друзья, подведем итоги этой главы. У нас с вами получилось спарсить все нужные данные, если вы все сделали правильно, то у вас должен получится следующий результат.

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

    Запись в csv

    Вот мы и подошли в плотную к завершении этого большого урока. Мы получили все данные, которые нас интересовали, но нам теперь их надо как то сохранить. И так, для таких моментов Python предоставляет нам встроенный модуль csv, которым мы и воспользуемся.

    Как видите наш код код изменился, у нас появилась новая функция записи в csv . Поехали разбираться.

    • Внутри функции get_data() мы создали словарь, куда внесли все полученные ранее нами значения
    • Создали функцию write_csv()
      • Функция работает довольно просто, создаем/открываем файл для записи
      • Будьте внимательны с флагами, которые вы указываете. К примеру ‘ w ‘, всегда будет перезаписывать существующий файл, а флаг ‘ a ‘, это как append в списках, добавлять новые данные в конец файла
      • Далее используем writerow() и передаем туда кортеж с нашими данными

      После запуска нашего скрипта, у нас появится файл listplugins3.csv . Открыть данный файл можно как в Excel , так и в другом стороннем редакторе. Конечный результат сбора данных, вы можете увидеть ниже.

      Урок 2. Парсер на Python

      Домашнее задание

      Урок 2. Парсер на Python

      Получите и сохраните, ссылку на тему оформления, и его название. Трудностей у вас возникнуть не должно, если все же они будут, добро пожаловать в комментарии.

      Заключение

      В этом уроке, я постарался насколько это возможно подробно объяснить как все устроено. В следующих уроках, такие подробности будут опущены. Сегодня нам удалось спарсить название/ссылку/рейтинг 16 плагинов. Конечно, это можно было бы сделать и в ручную, и не пришлось бы копаться в коде, и изучать что то. Но представьте себе, что у вас не 16 плагинов, а 10 000 .Для таких случаев и создаются парсеры. Достаточно понять, как устроена структура страницы, и вы одним махом сможете собрать все данные подходящие под ваш шаблон.

      На следующих уроках, мы будем рассматривать и другие виды сайтов, и в целом как правильно писать парсеры, что бы они не падали во время работы, будем использовать try…except конструкции, и прочие. Запомните, чем больше парсеров вы напишите, тем быстрее у вас появится опыт, и понимание того, как все устроено изнутри.

      Читайте также: