Как сохранить извлечённую информацию?
Для того, чтобы сохранять извлечённую информацию, нужно немного знать о форматах хранения результатов:
CSV – один из самых популярных форматов для хранения табличных данных. Он представляет собой текстовый файл, где каждая строка соответствует одной записи, а значения разделены запятыми. Преимущества данного формата: поддерживается большинством программ для обработки данных, включая Excel, легко читается и редактируется с помощью текстовых редакторов. Недостатки: ограниченные возможности для хранения сложных структур данных (например, вложенных данных). Проблемы с экранированием запятых и специальных символов.
JSON – это текстовый формат обмена данными, который удобно использовать для представления структурированных данных. Он широко используется в веб-разработке. Плюсы: поддерживает вложенные и иерархические структуры данных; хорошо поддерживается большинством языков программирования; легко читается и людьми, и машинами. JSON подходит для хранения данных, которые могут потребовать передачи через API. Минусы: JSON-файлы могут быть больше по размеру по сравнению с CSV; медленнее обрабатывается по сравнению с CSV из-за более сложной структуры.
XLS – предназначен для таблиц Excel, где хранятся данные о ячейках, форматировании и формулах. Он часто используется для хранения баз данных. Чтобы работать с XLS в Python, нужны сторонние библиотеки, например, pandas. Этот формат позволяет хранить данные в удобочитаемом и презентабельном виде. Основной недостаток — необходимость в дополнительных библиотеках, что увеличивает нагрузку на сервер и время обработки данных.
XML – это язык разметки, который используется для хранения и передачи данных. Он поддерживает вложенные структуры и атрибуты. Плюсы: структурированность, позволяет хранить сложные структуры данных, хорошо поддерживается различными стандартами и системами. Минусы: XML-файлы могут быть громоздкими и сложными для обработки; обработка XML может быть медленной из-за его структуры.
Базы данных используются для хранения больших объёмов структурированных данных. Примеры включают MySQL, PostgreSQL, MongoDB, SQLite. Плюсы: поддержка больших объемов данных и быстрый доступ; легко организовывать и связывать данные; поддержка транзакций и восстановления данных. Минус: требует дополнительных усилий для настройки и обслуживания.
Для наших скраперов выберем формат CSV, потому что извлечённые данные носят табличный характер (текст цитаты и автор, названия товаров и ссылки к ним) и объём данных относительно небольшой, без вложенных структур. Дополнительную информацию о том, как читать и записывать информацию в данном формате, можно узнать здесь. Добавим в наш код с цитатами импорт CSV, создадим объект writer, запишем данные цитат (сами цитаты и их авторов):
with open('quotes.csv', 'w', newline='', encoding='utf-8') as csvfile:
csvwriter = csv.writer(csvfile)
csvwriter.writerow(['Цитата', 'Автор'])
for quote in quotes[:3]:
text = quote.select_one('.text').get_text(strip=True)
author = quote.select_one('.author').get_text(strip=True)
csvwriter.writerow([text, author])
Также добавим дополнительные выводы в консоль и обработку возможных ошибок:
print("Данные успешно записаны в quotes.csv")
except requests.RequestException as e:
print(f'Ошибка при запросе страницы: {e}')
except Exception as e:
print(f'Произошла ошибка: {e}')
Код полностью:
import requests
from bs4 import BeautifulSoup
import csv
# URL целевой страницы
url = 'https://quotes.toscrape.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36'
}
try:
# Отправляем GET-запрос на страницу с пользовательским агентом
response = requests.get(url, headers=headers)
response.raise_for_status() # Проверка на HTTP ошибки
# Создаем объект BeautifulSoup для парсинга HTML
soup = BeautifulSoup(response.text, 'html.parser')
# Ищем все блоки с цитатами
quotes = soup.select('.quote')
# Открываем CSV файл для записи
with open('quotes.csv', 'w', newline='', encoding='utf-8') as csvfile:
# Создаем объект writer
csvwriter = csv.writer(csvfile)
# Записываем заголовки
csvwriter.writerow(['Цитата', 'Автор'])
# Записываем данные цитат
for quote in quotes[:3]:
# Извлекаем текст цитаты
text = quote.select_one('.text').get_text(strip=True)
# Извлекаем имя автора
author = quote.select_one('.author').get_text(strip=True)
# Записываем в CSV файл
csvwriter.writerow([text, author])
print("Данные успешно записаны в quotes.csv")
except requests.RequestException as e:
print(f'Ошибка при запросе страницы: {e}')
except Exception as e:
print(f'Произошла ошибка: {e}')
Аналогичные действия проделаем и со вторым скрапером:
from playwright.sync_api import sync_playwright
import csv
# URL целевой страницы
url = 'https://parsemachine.com/sandbox/catalog/'
def scrape_with_playwright():
try:
with sync_playwright() as p:
# Запуск браузера Chromium
browser = p.chromium.launch(headless=False) # Поменяйте на True, если нужен безголовый режим
try:
# Открытие новой вкладки
page = browser.new_page()
# Переход на целевую страницу
page.goto(url)
# Ищем все карточки продуктов
product_cards = page.query_selector_all('.card.product-card')
# Открываем CSV файл для записи
with open('products.csv', 'w', newline='', encoding='utf-8') as csvfile:
# Создаем объект writer
csvwriter = csv.writer(csvfile)
# Записываем заголовки
csvwriter.writerow(['Название', 'Ссылка'])
# Извлекаем данные из карточек продуктов и записываем в CSV
for card in product_cards:
# Извлекаем название товара
title_tag = card.query_selector('.card-title .title')
title = title_tag.inner_text() if title_tag else 'Нет названия'
# Ссылка на страницу товара
product_link = title_tag.get_attribute('href') if title_tag else 'Нет ссылки'
# Если ссылка относительная, добавляем базовый URL
if product_link and not product_link.startswith('http'):
product_link = f'https://parsemachine.com{product_link}'
# Записываем данные в CSV файл
csvwriter.writerow([title, product_link])
# Выводим информацию о продукте
print(f'Название: {title}, Ссылка: {product_link}')
print("Данные успешно записаны в products.csv")
except Exception as e:
print(f'Ошибка при работе с Playwright: {e}')
finally:
# Закрытие браузера
browser.close()
print("Браузер закрыт.")
except Exception as e:
print(f'Ошибка при запуске Playwright: {e}')
scrape_with_playwright()