CoderCastrov logo
CoderCastrov
Питон

Как парсить веб с помощью Python

Как парсить веб с помощью Python
просмотров
6 мин чтение
#Питон

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

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

Если у вас есть 40 ресторанов, выполнение задачи вручную осуществимо. Однако что происходит, когда их 4000? В этом случае необходимо автоматизировать задачу каким-либо образом, и это и является целью парсера: автоматическое и более быстрое извлечение данных, чем вручную.

Существует множество библиотек для парсинга на Python, но для целей этого руководства мы будем использовать BeautifulSoup4. Мы выбрали эту библиотеку, потому что она интуитивно понятна и легка в использовании.

После выбора технологии, которую мы будем использовать, нам нужно выбрать данные для парсинга, поэтому в этом руководстве мы будем парсить команду Geoblink! Вы можете найти всю информацию для извлечения по этому URL-адресу:

https://www.geoblink.com/es/sobre-geoblink/

Настройка окружения

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

Здесь, в Geoblink, мы используем Poetry для установки зависимостей. Как вы можете себе представить, Poetry - это программное обеспечение для упаковки и управления зависимостями Python. С помощью всего одной команды строки он устанавливает все программное обеспечение, необходимое для работы вашего приложения. Он также заботится о том, чтобы установить версию зависимостей, которую вы выбираете в файле конфигурации, чтобы не сломать ваше приложение и обеспечить совместимость между всеми сторонними зависимостями. Вы можете узнать больше о Poetry по этой ссылке.

Однако, для простоты и ради этого руководства мы будем использовать pip.

pip install beautifulsoup4

Мы собираемся использовать еще одну библиотеку Python под названием "requests". Requests - это библиотека HTTP, которая позволяет нам делать HTTP-запросы. Эта библиотека стала популярной благодаря своей простоте, и она является предпочтительной библиотекой, когда нам нужно делать HTTP-запросы. Конкретно нам нужно использовать ее для выполнения GET-запроса к URL-адресу, где находятся данные. Поскольку это сторонняя библиотека, нам нужно установить ее с помощью pip.

pip install requests

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

pip install lxml

Наконец, для экспорта данных в файл csv мы будем использовать pandas. Для этого требуется установить библиотеку pandas

pip install pandas

Теперь у нас установлены все необходимые пакеты на нашем компьютере, и следующий шаг для настройки - импортировать их в наш скрипт

import requests
from bs4 import BeautifulSoup
import pandas as pd

Парсинг данных

После установки и импорта всех необходимых библиотек, нам нужно отправить GET-запрос на URL, где находятся данные, и передать содержимое конструктору BeautifulSoup, который вернет объект BeautifulSoup.

r = requests.get('https://www.geoblink.com/es/sobre-geoblink/')
soup = BeautifulSoup(r.text, 'lxml')

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

Чтобы идентифицировать селектор, мы открываем инструменты разработчика в Google Chrome и выбираем часть веб-страницы, где находятся данные. С первого взгляда мы приходим к выводу, что информация хранится в блоках HTML div, все с классом "col__3".

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

  • Имя сотрудника имеет селектор ".title-cn"
  • Должность сотрудника имеет селектор ".position-cn"
  • Описание сотрудника имеет селектор ".descripction-cn"

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

for div in soup.select(".col__3 .Academy-item"):

Мы добавили дополнительный селектор ".Academy-item", потому что селектор ".col__3" сам по себе возвращал другие контейнеры с веб-страницы, поэтому нам нужно было быть более конкретными. Изучив HTML, мы поняли, что каждые данные о сотруднике находятся внутри div с классом ".col__3", и каждый из этих div, в свою очередь, находится внутри другого div с классом ".Academy-item". Добавление дополнительного селектора решило нашу проблему, и теперь цикл итерируется по правильным данным.

Следующим шагом является извлечение имени, должности и описания сотрудника для каждой итерации. Мы будем использовать метод .find() библиотеки BeautifulSoup. Поскольку нам нужно извлечь содержимое элемента, мы не можем использовать метод .select(), потому что он возвращает объект resultSet без атрибута "text". Вместо этого метод find позволяет нам легко извлечь данные внутри элемента.

Каждая строка данных будет сохранена в массиве. Мы создадим матрицу, где каждый столбец содержит разные данные, а каждая строка содержит разных сотрудников.

data = []
data.append([div.find("strong", class_="title-cn").text, div.find("small", class_="position-cn").text, div.find("div", class_="descripction-cn").text])

После создания массива массивов мы создадим объект pandas dataframe, используя переменную data.

df = pd.DataFrame(data, columns=['Имя', 'Должность', 'Описание'])

После того, как у нас есть все данные в dataframe, следующий и последний шаг - экспортировать dataframe в объект csv. Благодаря pandas это задание можно легко выполнить с помощью следующей строки кода.

df.to_csv('geoblink_employees.csv', encoding='utf-8', index=False)

Мы добавили параметр encoding=utf-8, чтобы не иметь проблем с испанскими буквами и акцентами.

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

import requests
import pandas as pd
from bs4 import BeautifulSoup

r = requests.get('https://www.geoblink.com/es/sobre-geoblink/')
soup = BeautifulSoup(r.text, 'lxml')

data = []
for div in soup.select(".col__3 .Academy-item"):
    data.append([div.find("strong", class_="title-cn").text, div.find("small", class_="position-cn").text, div.find("div", class_="descripction-cn").text])

df = pd.DataFrame(data, columns=['Имя', 'Должность', 'Описание'])
df.to_csv('geoblink_employees.csv', encoding='utf-8', index=False)

Результат нашего парсинга можно увидеть на следующем скриншоте:

Как мы делаем это в Geoblink

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

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

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

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

Заключение

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

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

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

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