Введение
Веб-скрейпинг — это техника, используемая для автоматического извлечения данных с сайтов с помощью программного обеспечения. Это чрезвычайно важный инструмент для сбора информации из сети, который находит множество применений при анализе данных на основе машинного обучения. Популярным языком программирования для веб-скрейпинга является Python благодаря простым в использовании библиотекам и инструментам. В этом руководстве мы рассмотрим, как шаг за шагом начать работу с Python для проведения веб-скрейпинга.
Дисклеймер. Эта статья написана исключительно в образовательных целях. Мы не призываем никого скрейпить сайты, особенно те, согласно условиям которых подобные действия запрещены.
Предварительные условия
Прежде чем воспользоваться самим руководством, важно иметь базовое представление о концепциях программирования на языке Python. Если вы новичок в Python, возможно, вам стоит пройти краткое обучение или специальный курс для начала работы с веб-скрейпингом. Вам также потребуется установить Python на компьютер.
Шаг 1. Установка библиотек
Python снабжен несколькими библиотеками для веб-скрейпинга, такими как BeautifulSoup, Scrapy и Requests. В этом руководстве мы будем использовать BeautifulSoup, поскольку она удобна для начинающих и проста в освоении. Чтобы установить BeautifulSoup, можно воспользоваться менеджером пакетов pip, открыв командную строку или терминал и введя следующую команду:
pip install beautifulsoup4
Так вы установите BeautifulSoup на компьютер.
Шаг 2. Изучение веб-страниц
Прежде чем приступить к веб-скрейпингу сайта, необходимо понять его структуру. Это можно сделать, изучив веб-страницу с помощью инструментов разработчика веб-браузера. Чтобы открыть инструменты разработчика в Google Chrome, щелкните правой кнопкой мыши в любом месте веб-страницы и выберите “Inspect”.
Открыв инструменты разработчика, вы можете навести курсор на элементы страницы, чтобы увидеть их HTML-теги и атрибуты. Это поможет определить, из какого элемента нужно извлечь данные.
Шаг 3. Скрейпинг данных с сайта
Начнем со скрейпинга данных с простого сайта, например Википедии. Мы извлечем название сайта и выведем его на консоль.
Для начала импортируем необходимые библиотеки:
import requests
from bs4 import BeautifulSoup
Затем отправим GET-запрос на сайт, используя библиотеку requests
:
url = "https://en.wikipedia.org/wiki/Main_Page"
response = requests.get(url)
Далее проведем парсинг HTML-содержимого сайта с помощью BeautifulSoup:
soup = BeautifulSoup(response.content, "html.parser")
Теперь можем извлечь название сайта, найдя тег <title>
:
title = soup.find("title")
Выводим заголовок в консоль:
print(title.string)
Когда вы запустите этот код, вы увидите название сайта, выведенное в консоль.
Шаг 4. Извлечение данных с нескольких страниц
Теперь, когда мы знаем, как извлекать данные с одной веб-страницы, попробуем получить данные с нескольких страниц. В качестве примера будем использовать IMDB — сайт, на котором перечислены 250 лучших фильмов всех времен.
Для начала импортируем необходимые библиотеки:
import requests
from bs4 import BeautifulSoup
Затем отправим GET-запрос на первую страницу сайта, используя библиотеку requests
:
url = "https://www.imdb.com/chart/top"
response = requests.get(url)
Далее проведем парсинг HTML-содержимого сайта с помощью BeautifulSoup:
soup = BeautifulSoup(response.content, "html.parser")
Теперь можем извлечь названия фильмов и их рейтинговые места, найдя соответствующие HTML-теги:
titles = soup.select(".titleColumn a")
ratings = soup.select(".imdbRating strong")
Метод select()
возвращает список всех элементов, соответствующих селектору CSS. Мы выбираем все теги <a>
внутри элементов <td class="titleColumn">
, которые содержат названия фильмов, и все теги <strong>
внутри элементов <td class="ratingColumn imdbRating">
, которые содержат рейтинговые места.
Теперь можем пройти через список названий и рейтинговых мест фильмов и вывести их в консоль:
for i in range(len(titles)):
print(f"{i+1}. {titles[i].text} - {ratings[i].text}")
Функция range()
генерирует последовательность чисел от 0 до значения длины списка titles
, которую мы используем для индексации списков titles
и ratings
. Атрибут text
элемента возвращает текстовое содержимое тега.
Код целиком выглядит следующим образом:
import requests
from bs4 import BeautifulSoup
url = "https://www.imdb.com/chart/top"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
titles = soup.select(".titleColumn a")
ratings = soup.select(".imdbRating strong")
for i in range(len(titles)):
print(f"{i+1}. {titles[i].text} - {ratings[i].text}")
При запуске этого кода вы увидите список из 250 лучших фильмов всех времен, выведенный в консоль, а также их рейтинговые места.
Заключение
Вы изучили основы веб-скрейпинга с помощью Python и BeautifulSoup. Владея этими навыками, вы можете приступить к извлечению с сайтов любых данных, от цен на товары до новостных статей.
Но помните, что веб-скрейпинг — это мощный инструмент, который следует использовать ответственно и этично. Всегда соблюдайте условия сайта и помните о том, какое влияние скрейпинг может оказать на его работу.
Теперь, когда вы освоили основы, пора приступить к изучению более продвинутых методов веб-скрейпинга и испытать навыки на практике.
Читайте также:
- Сферы применения Python
- Автоматизация создания стикеров с помощью веб-скрейпинга и обработки изображений в Python
- Создаем веб-сканер страниц с помощью Python
Читайте нас в Telegram, VK и Дзен
Перевод статьи SPX: Web Scraping with Python and BeautifulSoup