Использование библиотеки beautifulsoup в Python

Использование библиотеки Beautifulsoup в Python

Это руководство для начинающих по использованию библиотеки beautifulsoup для парсинга данных с веб сайтов.

Введение

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

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

Он также известен как веб скрейпинг или веб паук.

Цели

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

  • Мониторинг изменения цен в режиме онлайн.
  • Сбор списка недвижимости.
  • Извлечение последних новостей с новостного сайта.
  • Мониторинг погодных данных.
  • Исследование чего-либо.
  • Извлечение большого объема данных для интеллектуального анализа данных и так далее.

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

Инструменты

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

Beautifulsoup это лучший выбор при запуске веб-скрейпинга в Python, поэтому мы будем использовать BeautifulSoup4 и библиотеку запросов Python для Web Scraping.

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

Реализация

Есть всего три шага в очистке веб-страницы:

  1. Проверка веб-страницы.
  2. Извлечение веб-страницы.
  3. Простая очистка веб-страницы.

Сбор заголовков последних технических новостей

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

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

Итак, вы должны иметь некоторые базовые знания HTML. Чтобы ознакомиться с веб-страницей habr.com, сначала посетите ее сайт habr.com, затем в вашем браузере нажмите CTRL + U, чтобы просмотреть исходный код веб-страницы. Просматриваемый исходный код это тот же самый код, из которого мы будем собирать наши данные.

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

Извлечение веб-страницы

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

Компьютеры видят и понимают веб-страницы как код, то есть исходный код, который мы видим, когда просматриваем исходный код в браузере, нажимая CTRL + U, как мы это делали при проверке веб-страницы.

Чтобы получить веб-страницу с помощью Python, я буду использовать библиотеку requests, которую вы можете установить с помощью pip:

pip install requests

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

import requests
response = requests.get("https://www.habr.com/")

print(response.status_code)
print(response.content)

Переменная response содержит ответ, который мы получаем после отправки запроса на https://www.habr.com/.

response.status_code возвращает код ответа, указывающий, был ли запрос успешным или нет. Код состояния 200 указывает на то, что запрос был успешным, 4** означает ошибку клиента (ошибку с вашей стороны) и 5** означает ошибку сервера.

response.content возвращает содержимое ответа, которое является исходным кодом веб-страницы, и это тот же исходный код, который доступен вам при просмотре его в веб-браузере.

Использование BeautifulSoup

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

Beautiful Soup это библиотека Python для извлечения данных из HTML-и XML-файлов. Я буду использовать ее для извлечения необходимых нам данных из нашего исходного кода HTML.

Устанавливаем BeautifulSoup через pip:

pip install beautifulsoup4

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

import requests
from bs4 import BeautifulSoup

response = requests.get("https://www.habr.com/")
soup = BeautifulSoup(response.content, "html.parser")

Класс BeautifulSoup требует двух аргументов: исходного кода HTML страницы, который хранится в response.content, и HTML-parser.

HTML-parser это простой модуль синтаксического анализа HTML, встроенный в Python и BeautifulSoup, который нужен для разбора response.content (исходный код HTML).

Извлечение заголовка и тела страницы

После синтаксического анализа с помощью BeautifulSoup анализируемый HTML-код хранится в переменной Soup, которая является основой всего извлечения, которое мы собираемся сделать. Давайте начнем с извлечения заголовка страницы, элементов head и body:

import requests
from bs4 import BeautifulSoup

response = requests.get("https://www.habr.com/")
soup = BeautifulSoup(response.content, "html.parser")
title = soup.title
print(title)

head = soup.head
print(head)

body = soup.body
print(body)

soup.title возвращает элемент title веб-страницы в формате html(…). Аналогично soup.head и soup.body возвращают элементы head и body веб-страницы.

Поиск HTML-элементов

Выборка только заголовков, head и body веб-страницы по-прежнему дает нам слишком много нежелательных данных. Нам нужны только некоторые данные из тела HTML, такие как поиск определённых HTML-элементов, например, div, a, p, footer, img, и так далее. Моя цель собрать заголовки новостей с веб-страницы. Когда я проводил проверку, вы заметили, что новостные статьи хранились с разбивкой по тегам. Давайте посмотрим, будет ли полезно найти все элементы a на веб-странице:

import requests
from bs4 import BeautifulSoup

response = requests.get("https://www.habr.com/")
soup = BeautifulSoup(response.content, "html.parser")
a_elements = soup.find_all('a')   
print(a_elements)

Поиск всех тэгов a это еще один шаг ближе к цели, но мне все равно нужно быть более конкретным и находить только те элементы a с нужными нам данными.

Как вы можете видеть выше, заголовки новостей находятся в элементах a с именем класса post__title_link, то есть:

<a class='post__title_link'>...</a>

Таким образом, нам нужно будет найти только элементы a с классом post__title_link.

Поиск HTML-элементов по имени класса

Чтобы найти все элементы a с классом post__title_link, я пишу следующий код:

import requests 
from bs4 import BeautifulSoup 

response = requests.get("https://www.habr.com/") 
print(response.status_code) 

soup = BeautifulSoup(response.content, 'html.parser') 
a_title = soup.find_all('a', class_="post__title_link")

Строка

soup.find_all('a', class_="post__title_link") 

ищет все элементы a названием класса post__title_link и возвращает их списком.

Затем мы перебираем возвращенный список и извлекаем из него все элементы, поскольку он содержит искомый текст:

import requests 
from bs4 import BeautifulSoup 

r = requests.get("https://www.technewsworld.com/") 

soup = BeautifulSoup(r.content, 'html.parser') 

div_title = soup.find_all('div', class_="title") 

for element in a_title:
    print(element)

Вывод программы:

<a class="post__title_link" href="https://habr.com/ru/post/545144/">Idewavecore. Ретроспектива</a>
<a class="post__title_link" href="https://habr.com/ru/post/545148/">Создаём компанию мечты: мастер-данные и интеграция</a>
<a class="post__title_link" href="https://habr.com/ru/post/545150/">Регулярные выражения (regexp) — основы</a>
<a class="post__title_link" href="https://habr.com/ru/company/citymobil/blog/545004/">Читаем EXPLAIN на максималках</a>
<a class="post__title_link" href="https://habr.com/ru/post/545146/">Делаем гибкую печатную плату</a>
<a class="post__title_link" href="https://habr.com/ru/company/lightmap/blog/544182/">Как мы «вырастили» и победили читеров в своем онлайн-шутере</a>
<a class="post__title_link" href="https://habr.com/ru/post/544944/">Root Cause Analysis как метод предотвращения багов</a>
<a class="post__title_link" href="https://habr.com/ru/company/madrobots/blog/542898/">Пять сувениров с Земли к 8 Марта. Почти текстовой квест на движке Хабра</a>
<a class="post__title_link" href="https://habr.com/ru/post/545132/">Удобный вид для проверки результатов сканирования Nmap</a>
<a class="post__title_link" href="https://habr.com/ru/company/skillfactory/blog/544850/">Обнаружение эмоций на лице в браузере с помощью глубокого обучения и TensorFlow.js. Часть 2</a>
<a class="post__title_link" href="https://habr.com/ru/company/englishdom/blog/545114/">Разбираем английскую лексику из посадки марсохода Perseverance</a>
<a class="post__title_link" href="https://habr.com/ru/company/itsoft/blog/545118/">Где разместить оборудование для майнинга</a>
<a class="post__title_link" href="https://habr.com/ru/company/epam_systems/blog/545040/">Использование code-style плагина ktlint в Kotlin проекте. Краткая инструкция для backend-разработчика</a>
<a class="post__title_link" href="https://habr.com/ru/company/pvs-studio/blog/545116/">PVS-Studio вступает в битву с захардкоженными паролями</a>
<a class="post__title_link" href="https://habr.com/ru/company/accenture/blog/543744/">Внедрять или не внедрять</a>
<a class="post__title_link" href="https://habr.com/ru/company/group-ib/blog/545104/">Анастасия Тихонова: «Нам крупно повезло, что атаки APT пока еще не привели к массовым человеческим жертвам»</a>
<a class="post__title_link" href="https://habr.com/ru/post/545110/">Почему учетная система не может заменить PIM в e-commerce</a>
<a class="post__title_link" href="https://habr.com/ru/post/545106/">Еще одно объяснение эффекта Мпембы (это про прочему кипяток замерзает быстрее холодной воды)</a>
<a class="post__title_link" href="https://habr.com/ru/company/typeable/blog/544848/">Сравнение Elm и Reflex</a>
<a class="post__title_link" href="https://habr.com/ru/company/ruvds/blog/545096/">Продолжая про ГМО человека: как создать человеко-свиной гибрид</a>

Мы почти закончили, у меня есть список элементов <а> с нашими новостными заголовками в них. Мы должны извлечь их из HTML-элемента (извлечь текст из элементов).

Извлечение текста из HTML-элементов

В BeautifulSoup для извлечения текста мы используем атрибут .text для получения текстовых данных из HTML-элемента:

import requests
from bs4 import BeautifulSoup


response = requests.get("https://www.habr.com/")
print(response.status_code)

soup = BeautifulSoup(response.content, "html.parser")
a_title = soup.find_all("a", class_="post__title_link")
for element in a_title:
    print(element.text

Вывод программы:

Снова о автономной Arduino-метеостанции на батарейках
Idewavecore. Ретроспектива
Создаём компанию мечты: мастер-данные и интеграция
Регулярные выражения (regexp) — основы
Читаем EXPLAIN на максималках
Делаем гибкую печатную плату
Как мы «вырастили» и победили читеров в своем онлайн-шутере
Root Cause Analysis как метод предотвращения багов
Пять сувениров с Земли к 8 Марта. Почти текстовой квест на движке Хабра
Удобный вид для проверки результатов сканирования Nmap
Обнаружение эмоций на лице в браузере с помощью глубокого обучения и TensorFlow.js. Часть 2
Разбираем английскую лексику из посадки марсохода Perseverance
Где разместить оборудование для майнинга
Использование code-style плагина ktlint в Kotlin проекте. Краткая инструкция для backend-разработчика
PVS-Studio вступает в битву с захардкоженными паролями
Внедрять или не внедрять
Анастасия Тихонова: «Нам крупно повезло, что атаки APT пока еще не привели к массовым человеческим жертвам»
Почему учетная система не может заменить PIM в e-commerce
Еще одно объяснение эффекта Мпембы (это про прочему кипяток замерзает быстрее холодной воды)

Ура! Мы спарсили последние заголовки новостей из technewsworld.com. Обратите внимание, что ваши заголовки новостей будут отличаться от моих, так как главная страница всегда обновляется последними новостями.

Заключение

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

Егор Егоров

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

Ссылка на мой github есть в шапке. Залетай.

Оцените автора
Егоров Егор
Добавить комментарий

  1. Анастасия

    Как получить

    Ответить
  2. Александр

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

    Ответить
    1. Егор Егоров автор

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

      Символы убирать можно, да, существует метод у строк — replace.

      Ответить