парсинга товаров интернет-магазина с BeautifulSoup

Пример парсинга товаров интернет-магазина с BeautifulSoup в Python

Рассмотрим пример парсинга интернет-магазина. Для этого я нашел специальный сайт-магазин созданный специально для тренировки парсинга - http://books.toscrape.com/. Он выполнен в виде магазина книг, как раз то, что нам нужно.

Напишем парсер с помощью BeautifulSoup, который парсит, к примеру, первые 50 книг и сохраняет в csv название книги и ее стоимость.

Анализ структуры сайта

Откроем страницу в веб-браузере и с помощью инструментов разработчика (обычно доступны через правый клик -> "Inspect" или F12) найдем теги и классы, которые содержат нужные данные.

У нас это:

  1. Название книг - <h3><a href="catalogue/olio_984/index.html" title="Olio">Olio</a></h3>
  2. Цена книги - <p class="price_color">£23.88</p>
  3. Пагинация - <li class="next"><a href="catalogue/page-2.html">next</a></li> (нужна для того, чтобы перейти на следующую страницу и там продолжить парсинг)

Шаг 1: Подготовка к парсингу

Импорт библиотек:
Импортируем необходимые библиотеки: requests для выполнения HTTP-запросов, BeautifulSoup для парсинга HTML и csv для сохранения результатов.

import requests
from bs4 import BeautifulSoup
import csv

Шаг 2: Функция для парсинга одной страницы

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

book_count = 0

Функция парсинга страницы:
Создаем функцию, которая принимает URL страницы и извлекает названия книг и их цены.

def parse_page(url, book_count):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')

    books = soup.find_all('h3')
    prices = soup.find_all('p', class_='price_color')

    book_data = []
    for book, price in zip(books, prices):
        if book_count >= 50:
            break  # Прерываем цикл, если достигнуто 50 книг

        title = book.find('a')['title']
        price = price.get_text()
        book_data.append((title, price))
        book_count += 1

    return book_data, book_count

Шаг 3: Пагинация и парсинг всех страниц с сохранением в csv

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

Открытие файла для записи:
Мы откроем файл для записи и будем добавлять в него данные по мере их парсинга.

Запись данных:
Используем цикл для перебора всех страниц и записи данных в файл.

base_url = "http://books.toscrape.com/catalogue/"
current_page = "page-1.html"

with open('books_data.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(['Название книги', 'Цена'])  # Заголовки столбцов

    current_page = "page-1.html"
    while current_page and book_count < 50:
        print(f"Парсинг страницы: {current_page}")
        page_data, book_count = parse_page(base_url + current_page, book_count)
        for book in page_data:
            writer.writerow(book)

        if book_count >= 50:
            break  # Прерываем цикл, если достигнуто 50 книг

        response = requests.get(base_url + current_page)
        soup = BeautifulSoup(response.text, 'html.parser')
        next_button = soup.find('li', class_='next')
        if next_button:
            current_page = next_button.find('a')['href']
        else:
            break

Таким образом, парсер будет собирать данные о книгах до тех пор, пока не наберется 50 записей, после чего прекратит работу.

Код парсера

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

import requests
from bs4 import BeautifulSoup
import csv

# Инициализация счетчика книг
book_count = 0

# Функция для парсинга одной страницы
def parse_page(url, book_count):
    # Отправка запроса и получение HTML-кода страницы
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')

    # Находим все элементы с информацией о книгах
    books = soup.find_all('h3')
    prices = soup.find_all('p', class_='price_color')

    # Список для хранения данных о книгах
    book_data = []
    for book, price in zip(books, prices):
        # Прерываем цикл, если количество книг достигло 50
        if book_count >= 50:
            break

        # Получаем название и цену книги, добавляем в список
        title = book.find('a')['title']
        price = price.get_text()
        book_data.append((title, price))
        book_count += 1

    return book_data, book_count

# Базовый URL и начальная страница
base_url = "http://books.toscrape.com/catalogue/"
current_page = "page-1.html"

# Открытие файла для записи данных
with open('books_data.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    # Запись заголовков столбцов
    writer.writerow(['Название книги', 'Цена'])

    # Основной цикл парсинга
    while current_page and book_count < 50:
        print(f"Парсинг страницы: {current_page}")
        # Получение данных о книгах со страницы
        page_data, book_count = parse_page(base_url + current_page, book_count)
        # Запись данных о каждой книге в CSV-файл
        for book in page_data:
            writer.writerow(book)

        # Прерываем цикл, если количество книг достигло 50
        if book_count >= 50:
            break

        # Получение следующей страницы
        response = requests.get(base_url + current_page)
        soup = BeautifulSoup(response.text, 'html.parser')
        next_button = soup.find('li', class_='next')
        # Обновление текущей страницы, если есть ссылка на следующую
        if next_button:
            current_page = next_button.find('a')['href']
        else:
            break

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

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

Содержание: