Как парсить сайты на python
Перейти к содержимому

Как парсить сайты на python

  • автор:

Как парсить сайты и для чего это нужно?

Всем привет! Сегодня сегодня мы поговорим о том как сделать парсер сайтов на python,+ мы поговорим о том как мы можем внедрить парсер в Telegram бота.

Начало

Наша работа будет разделена на 2 части:

  • В 1 части мы будем писать парсер.
  • В 2 части мы этот парсер внедрим в Telegram бота.

Часть 1

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

Так что. ПОЕХАЛИ! Мы будем ипользовать две библиотеки: BeautifulSoup и requests

Кратко о библиотеках:

  • BeautifulSoup и requests — это библиотеки для языка Python, которые используются для получения данных из Интернета.
  • Requests — это библиотека, которая облегчает выполнение HTTP-запросов и управление сеансами. Это означает, что requests позволяет вашему коду получать страницы, изображения и другой контент с Интернета.
  • BeautifulSoup — это библиотека для парсинга HTML-кода. Она позволяет коду извлекать конкретные элементы HTML-разметки из веб-страницы и далее обрабатывать их. Пример использования BeautifulSoup — извлечение текста, ссылок и других элементов из HTML-страницы.

Мы импортируем библиотеки которые на понадобятся для парсинга.

Теперь наша задача отправить get запрос на сайт и зайти в классы в которых мы можем найти нужные нам файлы.

Теперь мы фильтруем файлы и если файлы с текстовым описанием не «Расписание 1 курс», то мы их пропускаем. А если файл нам подходит, то мы его сохраняем в качестве ссылки на сам файл. И уже в будущем мы сохраняем файл.

Вот первая часть подходит к концу. Давайте посмотрим как можно добавить парсер в бота

Часть 2

Импортируются необходимые модули, такие как Bot, Dispatcher, types (из aiogram), logging, requests, BeautifulSoup и os.

Далее определяется токен для бота, создается ссылка на бота и его диспетчер (Dispatcher).

Далее определяется функция «send_First_Course», которая получает расписание для колледжа с помощью парсинга веб-страницы с помощью requests и BeautifulSoup. Затем проверяется, содержит ли файл «Расписание учебных занятий 1 курс с», и если это так, получается ссылка на файл и он в будущем должен будет загружается и сохранятся на диск.

Затем определяются обработчики команд «/command1», «/command2» и «/command3». «/command1» отправляет URL-адрес файла расписания в ответ на запрос пользователя. «/command2» отправляет сам файл в ответ на запрос пользователя, а затем удаляет его с диска. «/command3» отправляет сообщение с ссылкой на чат на Telegram.

Далее определяется основное тело кода с функцией «executor.start_polling()». Эта функция запускает бота, который начинает слушать сообщения от пользователей и отправлять ответы в соответствии с определенными командами.

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

Веб-парсинг для начинающих с Python и Repl.it¶

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

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

Есть много причин, по которым вы можете захотеть использовать парсинг веб-страниц. Например, вам может потребоваться:

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

Есть много других вариантов использования веб-скрапинга. Однако следует также отметить, что законы об авторском праве и законы об очистке веб-страниц сложны и различаются в зависимости от страны. Если вы явно не копируете их контент или не выполняете парсинг в коммерческих целях, люди, как правило, не возражают против этого. Однако было несколько судебных дел, связанных со сбором данных из LinkedIn и вниманием СМИ из-за сбора данных из OKCupid . Очистка веб-страниц может нарушать закон, противоречить условиям обслуживания определенного веб-сайта или нарушать этические принципы, поэтому будьте осторожны с тем, где вы применяете этот навык.

Убрав заявление об отказе от ответственности, давайте научимся соскабливать его!

Обзор и требования¶

В частности, в этом уроке мы рассмотрим:

  • Что такое веб-сайт на самом деле и как работает HTML
  • Просмотр HTML в вашем веб-браузере
  • Использование Python для загрузки веб-страниц
  • Использование BeautifulSoup для извлечения частей очищенных данных

Мы будем использовать онлайн-среду программирования Repl.it, поэтому вам не нужно будет устанавливать какое-либо программное обеспечение локально, чтобы выполнять пошаговые инструкции . Если вы хотите адаптировать это руководство к своим потребностям, вам следует создать бесплатную учетную запись, перейдя на repl.it и проследив за их процессом регистрации.

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

Веб-страницы: красавица и чудовище¶

Вы, несомненно, раньше посещали веб-страницы с помощью веб-браузера. Веб-сайты существуют в двух формах:

  1. Тот, к которому вы привыкли, где вы можете видеть текст, изображения и другие медиафайлы. Для удобного и (обычно) эстетичного отображения информации используются разные шрифты, размеры и цвета.
  2. «Источник» веб-страницы. Это компьютерный код, который сообщает вашему веб-браузеру (например, Mozilla Firefox или Google Chrome), что и как отображать.

Веб-сайты создаются с помощью комбинации трех компьютерных языков: HTML, CSS и JavaScript. Само по себе это огромная и сложная область с запутанной историей, но для эффективной автоматизации парсинга веб-страниц необходимо иметь общее представление о том, как некоторые из них работают. Если вы откроете какой-либо веб-сайт в своем браузере и щелкните правой кнопкой мыши где-нибудь на странице, вы увидите меню, которое должно включать параметр «просмотреть исходный код страницы» — для проверки формы кода веб-сайта, прежде чем ваш веб-браузер интерпретирует его. .

Это показано на изображении ниже: обычная веб-страница слева с открытым меню (отображается при щелчке правой кнопкой мыши на странице). Нажав «просмотреть исходный код страницы» в этом меню, вы увидите результат справа — мы можем увидеть код, содержащий все данные и вспомогательную информацию, которые необходимы веб-браузеру для отображения полной страницы. В то время как страницу слева легко читать, использовать и она хорошо выглядит, страница справа выглядит чудовищно. Чтобы разобраться в этом, требуются некоторые усилия и опыт, но это возможно и необходимо, если мы хотим писать собственные парсеры.

Изображение 1: Обычный и исходный вид одной и той же новостной статьи BBC.

Навигация по исходному коду с помощью поиска¶

Первое, что нужно сделать, — это выяснить, как соотносятся две страницы: какие части обычно отображаемого веб-сайта соответствуют каким частям кода. Вы можете использовать «найти» Ctrl + F ) в представлении исходного кода, чтобы найти определенные фрагменты текста, которые видны в обычном представлении, чтобы помочь в этом. На веб-странице слева мы видим, что история начинается с фразы «Получение работы на телевидении». Если мы ищем эту фразу в представлении кода, мы можем найти соответствующий текст в коде в строке 805.

Изображение 2: Поиск текста в исходном коде веб-страницы.

<p > Непосредственно перед подсвеченной разделе HTML — код , чтобы указать , что пункт ( <p> в HTML) начинается здесь , и что это особый вид пункта (введение в историю). Абзац продолжается до </p> символа. Вам не нужно беспокоиться о полном понимании HTML, но вы должны знать, что он содержит как текстовые данные, из которых состоит новость, так и дополнительные данные о том, как их отображать.

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

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

Навигация по исходному коду с помощью инструментов разработчика¶

Вы можете открыть инструменты разработчика для своего браузера из главного меню, при этом Google Chrome показан слева, а Mozilla Firefox — справа внизу. Если вы используете другой веб-браузер, вы сможете найти аналогичный параметр.

** Изображение 3: ** Открытие инструментов разработчика в Chrome (слева) и Firefox (справа)

Активация инструмента вызывает появление новой панели в вашем веб-браузере, обычно внизу или справа. Инструмент содержит панель «Инспектор» и инструмент выбора, который можно выбрать, нажав значок, выделенный красным ниже. Когда инструмент выбора активен, вы можете щелкать по частям веб-страницы, чтобы просмотреть соответствующий исходный код. На изображении ниже мы выбрали тот же первый абзац в обычном представлении, и мы <p >снова можем увидеть код на панели ниже.

Изображение 4. Просмотр кода определенного элемента с помощью инструментов разработчика.

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

Загрузка веб-страницы с помощью Python¶

Теперь, когда мы узнали немного больше о том, как веб-страницы создаются в нашем браузере, мы можем начать извлекать их и управлять ими с помощью Python. Поскольку Python не является веб-браузером, мы сможем только извлекать исходный код HTML и управлять им, а не просматривать «нормальное» представление веб-страницы.

Мы сделаем это через Python Repl, используя requests библиотеку. Откройте repl.it и выберите создание нового Python Repl.

Изображение 5: Создать новый Repl

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

Вы можете сделать это с помощью следующих четырех строк Python:

Поместите этот код в main.py файл, который Repl автоматически создает для вас, и нажмите кнопку «Выполнить». После небольшой задержки вы должны увидеть результат на панели вывода — начало исходного кода HTML, аналогично тому, что мы просматривали в нашем веб-браузере выше.

Изображение 6: Загрузка отдельной страницы с помощью Python

Давайте разделим каждую из этих линий.

  • В строке 1 мы импортируем requests библиотеку Python , которая позволяет нам делать веб-запросы.
  • В строке 3 мы определяем переменную, содержащую URL-адрес основного новостного сайта BBC. Вы можете посетить этот URL-адрес в своем веб-браузере, чтобы увидеть домашнюю страницу BBC News.
  • В строке 4 мы передаем URL-адрес, который мы определили, requests.get функции, которая посетит веб-страницу, на которую указывает URL-адрес, и получит исходный HTML-код. Мы загружаем это в новую переменную с именем response .
  • В строке 5 мы получаем доступ к text атрибуту нашего response объекта, который содержит весь исходный код HTML. Мы берем только первые 1000 символов этого и передаем их print функции, которая просто выгружает получившийся текст в нашу панель вывода.

Теперь мы автоматически получили веб-страницу и можем отображать части содержимого. Нам вряд ли будет интересен полный дамп исходного кода веб-страницы (если мы не сохраняем его для архивных целей), поэтому давайте извлечем некоторые интересные части страницы, а не только первые 1000 символов.

Использование BeautifulSoup для извлечения всех URL-адресов¶

Всемирная паутина состоит из страниц, которые ссылаются друг на друга с помощью гиперссылок, ссылок или URL-адресов. (Эти термины используются более или менее взаимозаменяемо).

Предположим, что мы хотим найти все новостные статьи на главной странице BBC News и получить их URL-адреса. Если мы посмотрим на главную страницу ниже, мы увидим, что на главной странице есть куча историй. Наведя курсор мыши на любой из заголовков с помощью инструмента «проверить», мы можем увидеть, что у каждого из них есть уникальный URL-адрес, который ведет нас к этой новости. Например, если навести курсор мыши на основную историю «США и Канада договорились о новой торговой сделке» на изображении ниже, это ссылка на https://www.bbc.com/news/business-45702609.

Если мы проверим этот элемент с помощью инструментов разработчика браузера, мы увидим, что это <a> элемент, который представляет собой HTML для ссылки, с <href> компонентом, указывающим на URL. Обратите внимание, что href раздел идет только до последней части URL-адреса, опуская часть https://www.bbc.com. Поскольку мы уже работаем на BBC, сайт может использовать относительные URL-адреса вместо абсолютных . Это означает, что когда вы нажимаете на ссылку, ваш браузер определит, что URL-адрес неполный, и добавит к нему https://www.bbc.com. Если вы посмотрите исходный код главной страницы BBC, вы найдете как относительные, так и абсолютные URL-адреса, что уже затрудняет очистку всех URL-адресов на странице.

Изображение 7. Просмотр ссылок заголовков с помощью инструментов разработчика.

Мы могли бы попытаться использовать встроенные функции текстового поиска Python, такие как find() или регулярные выражения, для извлечения всех URL-адресов со страницы BBC, но на самом деле это невозможно сделать надежно. HTML — это сложный язык, который позволяет веб-разработчикам делать много необычных вещей. Чтобы узнать, почему нам следует избегать «наивного» метода поиска ссылок, см. Этот очень известный вопрос StackOverflow и первый ответ.

К счастью, существует мощная и простая в использовании библиотека синтаксического анализа HTML под названием BeautifulSoup , которая поможет нам извлечь все ссылки из заданного фрагмента HTML. Мы можем использовать его, изменив код в нашем Repl, чтобы он выглядел следующим образом.

Если вы запустите этот код, вы увидите, что он выводит десятки URL-адресов, по одному в каждой строке. Вы, вероятно, заметите, что выполнение кода теперь занимает немного больше времени, чем раньше — BeautifulSoup не встроен в Python, это сторонний модуль. Это означает, что перед запуском кода Repl должен получить эту библиотеку и установить ее для вас. Последующие пробежки будут быстрее.

Изображение 8: Извлечение всех ссылок из BBC News.

Код похож на тот, что был у нас раньше, с некоторыми дополнениями.

  • В строке 2 мы импортируем библиотеку BeautifulSoup, которая используется для синтаксического анализа и обработки HTML.
  • В одной строке 9 мы превращаем наш HTML в «суп». Это представление BeautifulSoup веб-страницы, которое содержит набор полезных программных функций для поиска и изменения данных на странице. Мы используем параметр «html.parser» для синтаксического анализа HTML, который включен по умолчанию — BeautifulSoup также позволяет вам указать здесь собственный анализатор HTML. Например, вы можете установить и указать более быстрый анализатор, который может быть полезен, если вам нужно обработать много данных HTML.
  • В строке 10 мы находим все a элементы в нашем HTML и извлекаем их в список. Помните, когда мы просматривали URL-адреса с помощью нашего веб-браузера (Изображение 7), мы отметили, что <a> элемент в HTML использовался для определения ссылок, а href атрибут использовался для указания того, куда должна переходить ссылка. Эта строка находит все <a> элементы HTML .
  • В строке 11 мы перебираем все имеющиеся у нас ссылки, а в строке 12 мы распечатываем href раздел.

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

Если мы посмотрим на URL-адреса в панели вывода, мы увидим довольно неоднозначные результаты. У нас есть абсолютные URL-адреса (начинающиеся с «http») и относительные (начинающиеся с «/»). Большинство из них переходят на общие страницы, а не на конкретные новостные статьи. Нам нужно найти шаблон в интересующих нас ссылках (которые переходят к новостным статьям), чтобы мы могли извлечь только те.

Опять же, метод проб и ошибок — лучший способ сделать это. Если мы перейдем на домашнюю страницу BBC News и воспользуемся инструментами разработчика для проверки ссылок, ведущих к новостным статьям, мы обнаружим, что все они имеют схожую структуру. Это относительные URL-адреса, которые начинаются с «/ news» и заканчиваются длинным числом, например /news/newsbeat-45705989

Мы можем внести небольшие изменения в наш код, чтобы выводить только URL-адреса, соответствующие этому шаблону. Замените последние две строки нашего кода Python следующими четырьмя строками:

Здесь мы по-прежнему просматриваем все ссылки, которые BeautifulSoup нашла для нас, но теперь мы извлекаем их href в собственную переменную сразу после. Затем мы проверяем эту переменную, чтобы убедиться, что она соответствует нашим условиям (начинается с «/ news» и заканчивается цифрой), и только если это так, мы распечатываем ее.

Изображение 9: Печать только ссылок на новостные статьи BBC.

Получение всех статей с домашней страницы¶

Теперь, когда у нас есть ссылка на каждую статью на главной странице BBC News, мы можем получить данные для каждой из этих отдельных статей. В качестве игрушечного проекта давайте извлечем из каждой статьи имена собственные (люди, места и т. Д.) И распечатаем самые распространенные, чтобы понять, о чем сегодня идет речь.

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

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

  • Вверху мы добавляем два новых импорта в дополнение к requests библиотеке. Первый новый модуль — string это стандартный модуль Python, содержащий несколько полезных сочетаний слов и букв. Мы будем использовать его, чтобы идентифицировать все заглавные буквы в нашем алфавите. Второй модуль — это Counter часть встроенного collections модуля. Это позволит нам найти наиболее употребительные существительные в списке, как только мы составим список всех существительных.
  • Мы добавили news_urls = [] вверху первого for цикла. Вместо того, чтобы печатать каждый URL-адрес после того, как мы определили его как «URL-адрес новостей», мы добавляем его в этот список, чтобы можно было загрузить каждую страницу позже. Внутри цикла for на две строки ниже мы объединяем корневой домен («http://bbc.com») с каждым атрибутом href, а затем добавляем полный URL-адрес в наш news_urls список.
  • Затем мы переходим к другому циклу for, в котором мы перебираем первые 10 URL-адресов новостей (если у вас есть больше времени, вы можете удалить [:10] часть, чтобы перебирать все страницы новостей, но для эффективности мы просто продемонстрируем первые 10 ).
  • Мы распечатываем URL-адрес, который мы получаем (поскольку загрузка каждой страницы занимает секунду или около того, приятно отображать некоторые отзывы, чтобы мы могли видеть, что программа работает).
  • Затем мы получаем страницу и превращаем ее в суп, как и раньше.
  • С помощью words = soup.text.split() мы извлекаем весь текст со страницы и разбиваем получившийся большой объем текста на отдельные слова. Функция Python split() разбивается на пробелы, что является грубым способом извлечения слов из фрагмента текста, но на данный момент он будет служить нашей цели.
  • Следующая строка проходит через все слова в данной статье и сохраняет только те, которые состоят из цифровых символов и начинаются с заглавной буквы ( string.ascii_uppercase это просто заглавный алфавит). Это также чрезвычайно грубый способ извлечения существительных, и мы получим много слов (например, в начале предложений), которые на самом деле не являются именами собственными, но, опять же, на данный момент это достаточно хорошее приближение.
  • Затем мы добавляем в наш all_nouns список все слова, похожие на существительные, и переходим к следующей статье, чтобы сделать то же самое.
  • Наконец, как только мы загрузили все страницы, мы распечатываем 100 наиболее употребительных существительных и подсчитываем, как часто они появлялись, используя удобный Counter объект Python .

Вы должны увидеть результат, аналогичный показанному на изображении ниже (хотя ваши слова будут другими, поскольку новости меняются каждые несколько часов). У нас есть наиболее распространенные «существительные», за которыми следует подсчет того, как часто это существительное появлялось во всех 10 изученных нами статьях.

Мы видим, что наши грубые методы извлечения и анализа далеки от совершенства — такие слова, как «Twitter» и «Facebook» появляются в большинстве статей из-за ссылок на социальные сети внизу каждой статьи, поэтому их присутствие не означает, что Facebook и сами Twitter сегодня в новостях. Точно так же такие слова, как «From», не являются существительными, и другие слова, такие как «BBC» и «Business», также включены, потому что они появляются на каждой странице, за пределами основного текста статьи.

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

Куда дальше?¶

Мы изучили основы парсинга веб-страниц и рассмотрели, как работает сеть, как извлекать информацию с веб-страниц и как выполнять некоторые самые простые операции извлечения текста. Вы, вероятно, захотите заняться чем-то другим, кроме извлечения слов из BBC! Вы можете разветвить этот Repl из https://repl.it/@GarethDwyer1/beginnerwebscraping и изменить его, чтобы изменить, какой сайт он очищает и какой контент извлекает. Вы также можете присоединиться к Repl Discord Server, чтобы пообщаться с другими разработчиками, которые работают над аналогичными проектами и которые с радостью поделятся с вами идеями или помогут, если вы застрянете.

Мы прошли через очень гибкий метод очистки веб-страниц, но это «быстрый и грязный» способ. Если BBC обновит свой веб-сайт и некоторые из наших предположений (например, что URL-адреса новостей будут заканчиваться цифрами) сломаются, наш веб-скребок также сломается.

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

Некоторые из лучших инструментов для парсинга веб-страниц на Python:

    : фреймворк, используемый людьми, которые хотят очистить миллионы или даже миллиарды веб-страниц. Scrapy позволяет создавать «пауков» — программных роботов, которые перемещаются по сети с высокой скоростью, собирая данные на основе заданных вами правил. : мы затронули вопрос о том, как трудно отделить основной текст новостной онлайн-статьи от всего остального содержимого на странице (верхние и нижние колонтитулы, рекламные объявления и т. Д.). Решить эту проблему невероятно сложно. Газета использует сочетание правил, заданных вручную, и некоторых умных алгоритмов для удаления «шаблонного» или второстепенного текста из каждой статьи. : мы скопировали некоторый базовый контент без использования веб-браузера, и это отлично работает для изображений и текста. Однако многие части современной сети являются динамическими — например, они загружаются только тогда, когда вы прокручиваете страницу достаточно далеко или нажимаете кнопку, чтобы открыть больше контента. Эти динамические сайты сложно очистить, но Selenium позволяет запускать настоящий веб-браузер и управлять им так же, как это сделал бы человек (но автоматически), и это позволяет вам получить доступ к такому типу динамического контента.

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

Парсинг сайта вместе с Python и библиотекой Beautiful Soup: простая инструкция в три шага

Рассказываем и показываем, как запросто вытянуть данные из сайта и «разговорить» его без утюга, паяльника и мордобоя.

Иллюстрация: Катя Павловская для Skillbox Media

Антон Яценко

Для парсинга используют разные языки программирования: Python, JavaScript или даже Go. На самом деле инструмент не так важен, но некоторые языки делают парсинг удобнее за счёт наличия специальных библиотек — например, Beautiful Soup в Python.

В этой статье разберёмся в основах парсинга — вспомним про структуру HTML-запроса и спарсим сведения о погоде с сервиса «Яндекса». А ещё поделимся записью мастер-класса, на котором наш эксперт в веб-разработке покажет, как с нуля написать веб-парсер.

Что такое парсинг и зачем он нужен?

Парсинг (от англ. parsing — разбор, анализ), или веб-скрейпинг, — это автоматизированный сбор информации с интернет-сайтов. Например, можно собрать статьи с заголовками с любого сайта, что полезно для журналистов или социологов. Программы, которые собирают и обрабатывают информацию из Сети, называют парсерами (от англ. parser — анализатор).

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

Существуют различные подходы к парсингу: можно забирать информацию через API, который предусмотрели создатели сервиса, или получать её напрямую из HTML-кода. В любом из этих случаев важно помнить, как вообще мы взаимодействуем с серверами в интернете и как работают HTTP-запросы. Начнём с этого!

HTTP-запросы, XML и JSON

HTTP (HyperText Transfer Protocol, протокол передачи гипертекста) — протокол для передачи произвольных данных между клиентом и сервером. Он называется так, потому что изначально использовался для обмена гипертекстовыми документами в формате HTML.

Для того чтобы понять, как работает HTTP, надо помнить, что это клиент-серверная структура передачи данных․ Клиент, например ваш браузер, формирует запрос (request) и отправляет на сервер; на сервере запрос обрабатывается, формируется ответ (response) и передаётся обратно клиенту. В нашем примере клиент — это браузер.

Запрос состоит из трёх частей:

  • Строка запроса (request line): указывается метод передачи, версия HTTP и сам URL, к которому обращается сервер.
  • Заголовок (message header): само сообщение, передаваемое серверу, его параметры и дополнительная информация).
  • Тело сообщения (entity body): данные, передаваемые в запросе. Это необязательная часть.

Посмотрим на простой HTTP-запрос, которым мы воспользуемся для получения прогноза погоды:

_GET /https://yandex.com.am/weather/ HTTP/1.1_

В этом запросе можно выделить три части:

  • _GET — метод запроса. Метод GET позволяет получить данные с ресурса, не изменяя их.
  • /https://yandex.com.am/weather/ — URL сайта, к которому мы обращаемся.
  • HTTP/1.1_ — указание на версию HTTP.

Ответ на запрос также имеет три части: _HTTP/1.1 200 OK_. В начале указывается версия HTTP, цифровой код ответа и текстовое пояснение. Существующих ответов несколько десятков. Учить их не обязательно — можно воспользоваться документацией с пояснениями.

Сам HTTP-запрос может быть написан в разных форматах. Рассмотрим два самых популярных: XML и JSON.

JSON (англ. JavaScript Object Notation) — простой формат для обмена данными, созданный на основе JavaScript. При этом используется человекочитаемый текст, что делает его лёгким для понимания и написания:

Для того чтобы получить информацию в формате JSON, необходимо подготовить правильный HTTP-запрос:

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

  • var requestURL — переменная с указанием на URL-адреса с необходимой информацией;
  • var request = new XMLHttpRequest () — создание нового экземпляра объекта запроса из конструктора XMLHttpRequest с помощью ключевого слова new;
  • request.open (‘GET’, requestURL) — открытие нового запроса с использованием метода GET. Обязательно указываем нашу переменную с URL-адресом;
  • request.responseType = ‘json’ — явно обозначаем получаемый формат данных как JSON;
  • request.send () — отправляем запрос на получение информации.

XML — язык разметки, который определяет набор правил для кодирования документов, записанных в текстовом формате. От JSON отличается большей сложностью — проще всего увидеть это на примере:

Чтобы получить информацию, хранящуюся на сервере как XML или HTML, потребуется воспользоваться той же библиотекой, как и в случае с JSON, но в качестве responseType следует указать Document.

Какой из форматов лучше выбрать? Кажется, что JSON легче для восприятия. Но выбор между определённым форматом HTTP-запроса зависит и от решаемой задачи. Подробно обсудим это в будущих материалах.

А сегодня разберёмся с основами веб-скрейпинга — используем стандартные библиотеки Python и научимся работать с различными полезными инструментами.

Три этапа парсинга

Самый простой способ разобраться в парсинге — что-то спарсить. Создадим программу, которая будет показывать информацию о погоде в вашем городе.

Для этого пройдём через три последовательных шага:

  • Подключим библиотеки, которые помогут нам спарсить информацию с помощью Python (как установить Python на Windows, macOS и Linux — смотрите в нашей статье).
  • Зайдём на сайт, с которого мы планируем парсить информацию, и изучим его исходный код. Важно будет найти те элементы, которые содержат нужную информацию.
  • Напишем код и спарсим данные.
Шаг 1

Подключаем библиотеки

Подключаем библиотеки

В разных языках программирования есть свои библиотеки для парсинга информации с сайтов. Например, в JavaScript используется библиотека Puppeteer, а на Python популярна библиотека Beautiful Soup. Принципы их работы похожи. Но сначала нужно разобраться с запуском Python на компьютере.

Просто так написать код в текстовом документе не получится. Можно воспользоваться одним из способов:

  • Использовать терминал на macOS или Linux, или воспользоваться командной строкой в Windows. Для этого предварительно потребуется установить Python в систему. Мы подробно писали об этом в отдельном материале.
  • Воспользоваться одним из онлайн-редакторов, позволяющих работать с кодом на Python без его установки: Google Colab, python.org, onlineGDB или другим.

После установки на свой компьютер Python или запуска онлайн-редактора кода можно переходить к импорту библиотек.

BeautifulSoup — библиотека, которая позволяет работать с HTML- и XML-кодом. Подключить её очень просто:

Дополнительно потребуется библиотека requests, которая помогает сделать запрос на нужный нам адрес сайта. Импортируется она в одну строку:

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

Важно! Библиотека Beautiful Soup чаще всего предустановлена в используемой среде разработке или в Jupyter Notebook, но иногда её нет. Если при попытке её импорта вы получаете ошибку, то выполните команду для её установки, а потом повторите запросы на импорт:

Шаг 2

Изучаем исходный код сайта

В качестве источника прогнозы погоды будем использовать сайт «Яндекс.Погода». Перейдём на него и в строке поиска найдём свой город. В нашем случае это будет Москва.

Посмотрите внимательно на адресную строку — она ещё пригодится нам в дальнейшем: https://yandex.com.am/weather/?lat=55.75581741&lon=37.61764526.

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

Теперь посмотрим на исходный код страницы и найдём место, где хранится текущая температура. Нас интересует обведённый на скриншоте сайта блок:

Для просмотра HTML-кода откроем «Инспектор кода». Для этого можно использовать комбинации горячих клавиш: в Google Chrome на macOS — ⌥ + ⌘ + I, на Windows — Сtrl + Shift + I или F12. Инспектор кода выглядит как дополнительное окно в браузере с несколькими вкладками:

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

Теперь найдём блок в коде, где хранится значение температуры. Для этого следует последовательно разворачивать блоки кода, располагающиеся внутри тега <body>. Сделать это можно, нажимая на символ ▶.

Как понять, что мы на правильном пути? Инспектор кода при наведении на блок кода подсвечивает на сайте ту область, за которую он отвечает. Переходим последовательно вглубь HTML-кода и находим нужный нам элемент.

В нашем случае пришлось проделать большой путь: элемент с классом «b‑page__container» → первый элемент с классом «content xKNTdZXiT5r0Tp0FJZNQIGlNu xIpbRdHA» → элемент с классом «xKNTdZXiT5r0vvENJ» → элемент с классом «fact card card_size_big» → элемент с классом «fact__temp-wrap xFNjfcG6O4pAfvHM» → элемент с классом «link fact__basic fact__basic_size_wide day-anchor xIpbRdHA» → элемент с классом «temp fact__temp fact__temp_size_s». Именно последнее название класса нам потребуется на следующем шаге.

Шаг 3

Пишем код и получаем необходимую информацию

Продолжаем писать команды в терминал, командную строку, IDE или онлайн-редактор кода Python. На этом шаге нам остаётся использовать подключённые библиотеки и достать значения температуры из элемента <span=»temp fact__temp fact__temp_size_s»>. Но для начала надо проверить работу библиотек.

Сохраняем в переменную URL-адрес страницы, с которой мы планируем парсить информацию:

Создадим к ней запрос и посмотрим, что вернёт сервер:

В нашем случае получаем ответ:

Отлично. Ответ «200» значит, что библиотека requests работает правильно и сервер отдаёт нам информацию со страницы.

Теперь получим исходный код, используя библиотеку Beautiful Soup и сразу выведем результат на экран:

После выполнения на экране виден код всей страницы полностью:

Но весь код нам не нужен — мы должны выводить только тот блок кода, где хранится значение температуры. Напомним, что это <span=»temp fact__temp fact__temp_size_s»>. Найдём его значение с помощью функции find() библиотеки Beautiful Soup.

Функция find() принимает два аргумента:

  • указание на тип элемента HTML-кода, в котором происходит поиск;
  • наименование этого элемента.

В нашем случае код будет следующим:

И сразу выведем результат на экран с помощью print:

Получилось! Но кроме нужной нам информации есть ещё HTML-тег с классом — а он тут лишний. Избавимся от него и оставим только значения температуры с помощью свойства text:

Всё получилось. Мы смогли узнать текущую температуру в городе с сайта «Яндекс.Погода», используя библиотеку Beautiful Soup для Python. Её можно использовать для своих задач — например, передавая в виджет на своём сайте, — или создать бота для погоды.

Скрапинг веб-сайтов с помощью Python — мастер-класс для новичков

Если вы совсем новичок в веб-скрапинге, но хотите написать свой парсер (например, для автоматической генерации отчётов в Excel), рекомендуем посмотреть вебинар от Михаила Овчинникова — ведущего инженера-программиста из Badoo. Он на понятном примере объясняет основы языка Python и принципы веб-скрапинга. Уже в начале видеоурока вы запустите простой парсер и научитесь читать данные в формате HTML и JSON.

Запись вебинара по скрапингу сайтов с помощью Python и библиотеки Beautiful Soup

Парсинг динамических сайтов c помощью Python и библиотеки Selenium

Бесплатная библиотека Selenium позволяет эмулировать работу веб-браузера — то есть «маскировать» веб-запросы скрипта под действия человека в Google Chrome или Safari. Почему это важно? Сайты умеют распознавать ботов и блокируют IP-адреса, с которых отправляются автоматические запросы.

Избежать «бана» можно двумя способами: изучить HTTP, принципы работы Python с вебом и написать свой эмулятор с нуля или воспользоваться готовым инструментом. Во втором случае Selenium — одно из лучших и самых удобных решений.

О том, как работать с библиотекой, рассказал Михаил Овчинников:

Запись вебинара по сбору данных с помощью библиотек Selenium и Beautiful Soup

Резюме

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

А ещё мы рекомендуем внимательно изучить официальную документацию по библиотекам, которые мы использовали для парсинга. Например, можно углубиться в возможности и нюансы использования библиотеки Beautiful Soup на Python.

Почему стоит научиться «парсить» сайты, или как написать свой первый парсер на Python

image

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

Перейдем к этапам парсинга.

  • Поиск данных
  • Извлечение информации
  • Сохранение данных

И так, рассмотрим первый этап парсинга — Поиск данных.

Так как нужно парсить что-то полезное и интересное давайте попробуем спарсить информацию с сайта work.ua.
Для начала работы, установим 3 библиотеки Python.

pip install beautifulsoup4

Без цифры 4 вы ставите старый BS3, который работает только под Python(2.х).

pip install requests
pip install pandas

Теперь с помощью этих трех библиотек Python, можно проанализировать нашу веб-страницу.

Второй этап парсинга — Извлечение информации.

Попробуем получить структуру html-кода нашего сайта.
Давайте подключим наши новые библиотеки.

И сделаем наш первый get-запрос.

Статус 200 состояния HTTP — означает, что мы получили положительный ответ от сервера. Прекрасно, теперь получим код странички.

Получилось очень много, правда? Давайте попробуем получить названия вакансий на этой страничке. Для этого посмотрим в каком элементе html-кода хранится эта информация.

У нас есть тег h2 с классом «add-bottom-sm», внутри которого содержится тег a. Отлично, теперь получим title элемента a.

Хорошо, мы получили названия вакансий. Давайте спарсим теперь каждую ссылку на вакансию и ее описание. Описание находится в теге p с классом overflow. Ссылка находится все в том же элементе a.

Получаем такой код.

И последний этап парсинга — Сохранение данных.

Давайте соберем всю полученную информацию по страничке и запишем в удобный формат — csv.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *