Рассмотрим пример парсинга интернет-магазина. Для этого я нашел специальный сайт-магазин созданный специально для тренировки парсинга - http://books.toscrape.com/. Он выполнен в виде магазина книг, как раз то, что нам нужно.
Напишем парсер с помощью BeautifulSoup, который парсит, к примеру, первые 50 книг и сохраняет в csv название книги и ее стоимость.
Откроем страницу в веб-браузере и с помощью инструментов разработчика (обычно доступны через правый клик -> "Inspect" или F12) найдем теги и классы, которые содержат нужные данные.
У нас это:
<h3><a href="catalogue/olio_984/index.html" title="Olio">Olio</a></h3>
<p class="price_color">£23.88</p>
<li class="next"><a href="catalogue/page-2.html">next</a></li>
(нужна для того, чтобы перейти на следующую страницу и там продолжить парсинг)Импорт библиотек:
Импортируем необходимые библиотеки: requests для выполнения HTTP-запросов, BeautifulSoup для парсинга HTML и csv для сохранения результатов.
import requests
from bs4 import BeautifulSoup
import csv
Так как мы хотим парсить только 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
Обработка пагинации:
Для перехода по страницам используем цикл, который будет проверять наличие ссылки на следующую страницу и загружать её содержимое.
Открытие файла для записи:
Мы откроем файл для записи и будем добавлять в него данные по мере их парсинга.
Запись данных:
Используем цикл для перебора всех страниц и записи данных в файл.
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-файл, что удобно для дальнейшей обработки и анализа.
Содержание: