CoderCastrov logo
CoderCastrov
Парсер веб-страниц

Парсинг веб-страниц с помощью Beautiful Soup

Парсинг веб-страниц с помощью Beautiful Soup
просмотров
6 мин чтение
#Парсер веб-страниц
Image By Author

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

Что такое парсинг веб-страниц?

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

Но как осуществляется парсинг веб-страниц?

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

Шаги, вовлеченные в парсинг веб-страниц:

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

Часть установки

Установите Beautiful Soup в Windows и MacOS.

pip install BeautifulSoup4

Если вы используете Linux (Debian), вы можете установить его с помощью следующей команды

# (для Python 2)
`$ apt-get install python-bs4`
# (для Python 3)
`$ apt-get install python3-bs4`

Когда вы устанавливаете его, будь то в Windows, MacOS или Linux, он сохраняется как BS4.

Вы можете импортировать BeautifulSoup из библиотеки BS4 с помощью следующей команды

from bs4 import BeautifulSoup

Парсинг веб-сайта с помощью Beautiful Soup

Используйте свой Jupyter Notebook.

Далее импортируйте необходимые библиотеки:

from bs4 import BeautifulSoup
import requests

Сначала давайте посмотрим, как работает библиотека requests:

from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com')
print(website)

Когда вы запускаете код выше, он возвращает статус 200, указывающий, что ваш запрос успешен. В противном случае вы получаете статус 400 или другие статусы ошибок, указывающие на неудачный GET-запрос.

Не забудьте всегда заменять URL веб-сайта в скобках на ваш целевой URL.

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

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

from bs4 import BeautifulSoup
import requests

website = requests.get('http://somewebpages.com')
soup = BeautifulSoup(website.content, 'html.parser')

print(soup)

Код выше возвращает всю DOM-структуру веб-страницы со всем ее содержимым.

Вы также можете получить более выровненную версию DOM-структуры, используя метод prettify. Вы можете попробовать это, чтобы увидеть его вывод:

from bs4 import BeautifulSoup
import requests

website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')

print(soup.prettify())

Вы также можете получить чистое содержимое веб-страницы без загрузки ее элементов с помощью метода .text или .string:

from bs4 import BeautifulSoup
import requests

website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')

print(soup.text)
print(soup.string)

Как парсить содержимое веб-страницы по имени тега

Вы также можете парсить содержимое веб-страницы по конкретному тегу с помощью Beautiful Soup. Для этого вам нужно указать имя целевого тега в запросе парсера Beautiful Soup.

Например, давайте посмотрим, как получить содержимое тегов h2 на веб-странице.

from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
print(soup.h2)

В приведенном выше коде soup.h2 возвращает первый элемент h2 на веб-странице и игнорирует остальные. Чтобы загрузить все элементы h2, вы можете использовать встроенную функцию find_all и цикл for в Python:

from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
h2tags = soup.find_all('h2')
for soups in h2tags:
print(soups)

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

from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')

h2tags = soup.find_all('h2')

for soups in h2tags:
print(soups.string)

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

Однако вы также можете парсить больше тегов, передавая список тегов в метод find_all. Например, следующий блок кода парсит содержимое тегов a, h2 и title:

from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
tags = soup.find_all(['a', 'h2', 'title'])
for soups in tags:
print(soups.string)

Как парсить веб-страницу, используя идентификатор и имя класса

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

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

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

from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
id = soup.find(id = 'введите сюда целевой идентификатор')

print(id.text)

Для класса замените id на class. Однако написание class напрямую приводит к синтаксической путанице, так как Python видит это как ключевое слово. Чтобы избежать этой ошибки, вам нужно написать подчеркивание перед class, например: class_.

По сути, строка, содержащая идентификатор, становится:

my_classes = soup.find(class_ = 'введите сюда имя целевого класса')
print(my_classes.text)

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

data = soup.find_all('div', class_ = 'введите сюда имя целевого класса')
print(data)

Шаг 1: Установка

Beautiful Soup можно установить с помощью команды pip. Вы также можете попробовать pip3, если pip не работает.

pip install requests

pip install beautifulsoup4

Модуль requests используется для получения HTML-контента.

Шаг 2: Изучение исходного кода

Следующим шагом является изучение веб-сайта, который вы хотите спарсить. Начните с открытия сайта в браузере. Пройдитесь по структуре сайта и найдите часть веб-страницы, которую вы хотите спарсить. Затем изучите сайт с помощью инструментов разработчика, перейдя в "Еще инструменты">"Инструменты разработчика". Наконец, откройте вкладку "Элементы" в инструментах разработчика.

Шаг 3: Получение HTML-контента

Далее получим HTML-контент с веб-страницы. Для этой задачи мы используем модуль requests. Вызываем функцию "get", передавая URL веб-страницы в качестве аргумента этой функции, как показано ниже:

# импортируем библиотеку requests
import requests
# URL веб-сайта
url_link = "https://ru.wikipedia.org/wiki/Список_штатов_США"
result = requests.get(url_link).text
print(result)

В приведенном выше коде мы отправляем HTTP GET-запрос на указанный URL. Затем мы сохраняем полученные сервером данные HTML в объекте Python. Атрибут .text позволяет вывести HTML-данные.

Шаг 4: Парсинг HTML-страницы с помощью Beautiful Soup

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

from bs4 import BeautifulSoup
# импортируем библиотеку requests
import requests
# URL веб-сайта
url_link = "https://en.wikipedia.org/wiki/List_of_states_and_territories_of_the_United_States"
result = requests.get(url_link).text
doc = BeautifulSoup(result, "html.parser")
print(doc.prettify())

Функция prettify() позволяет нам выводить HTML-контент в виде вложенной структуры, которую легко читать и которая поможет извлечь доступные теги, которые нам нужны. Есть два метода для поиска тегов: find и find_all().Find(): Этот метод находит первый совпадающий элемент.Find_all(): Этот метод находит все совпадающие элементы.

Поиск элементов по ID:

Мы все знаем, что каждому элементу в HTML-странице присваивается уникальный атрибут ID. Давайте теперь попробуем найти элемент, используя значение атрибута ID. Например, я хочу найти элемент с атрибутом ID, у которого значение "content", как показано ниже:

<Image
  src="/blogs/3166e3414c.jpg"
  width="700"
  height="258"
  alt=""
  sizes="100vw"
/>

res = doc.find(id = "content")
print(res)

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

Вы можете обратиться к документации для получения более подробной информации: https://www.crummy.com/software/BeautifulSoup/bs4/doc/

Beautiful Soup: Создание веб-скрепера с помощью Python — Real Python

Документация Beautiful Soup — Beautiful Soup 4.4.0 documentation (beautiful-soup-4.readthedocs.io)


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