L o a d i n g
Создание парсера данных с сайта: Пошаговое руководство Linux Ubuntu

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

Основные этапы разработки парсера

1. Импорт необходимых библиотек

Первым шагом было импортирование библиотек, необходимых для парсинга веб-страниц:

import requests
from bs4 import BeautifulSoup
import csv

  • requests: позволяет отправлять HTTP-запросы к веб-страницам.
  • BeautifulSoup: используется для парсинга HTML и XML документов.
  • csv: модуль для работы с файлами CSV (в данном коде он не используется, но его можно добавить для сохранения данных).

2. Определение базового URL

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

base_url = 'https://www.chitai-gorod.ru/catalog/books/komiksy-110063'

Этот URL указывает на раздел сайта с книгами, которые я хотел проанализировать.

3. Получение числа страниц

Для того чтобы пройтись по всем страницам раздела, мне нужно было узнать, сколько всего страниц доступно. Я написал функцию number_str, которая делает запрос к базовому URL, парсит HTML и извлекает номер последней страницы:

def number_str(base_url):
    html = requests.get(base_url).text
    soup = BeautifulSoup(html, 'html.parser')
    nums = soup.find_all('span', class_='pagination__text')
    last_nums_pages = None
    
    for nums_links in nums:
        last_nums_pages = nums_links
        nums_pages = last_nums_pages.get_text(strip=True)
        
    return nums_pages

Функция number_str находит элемент с классом pagination__text, который содержит номер последней страницы, и возвращает это число.

4. Парсинг данных с нескольких страниц

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

def parser_boock(nums_pages, base_url):
    for pages in range(1, int(nums_pages) + 1):
        base_url_patterns = base_url + '?page=' + str(pages)
        print(base_url_patterns)
        
        html = requests.get(base_url_patterns).text
        soup = BeautifulSoup(html, 'html.parser')
        articls = soup.find_all('article', class_='product-card product-card product')
        
        for i, items in enumerate(articls):
            url = items.get("href")
            title = soup.find_all('div', class_='product-title__head')[i]
            title_book = title.get_text(strip=True)
            img = soup.find_all('img', class_='product-picture__img')[i]
            img_book = img.get('data-srcset')
            img_str_link = img_book.split('?width=400&height=560&fit=bounds 2x')[0] if img_book else img.get('src')
            
            old_prices = items.find('div', class_='product-price__old')
            old_prices_text = old_prices.get_text(strip=True) if old_prices else ''
            
            sale_prices = items.find('div', class_='product-price__value')
            sale_prices_text = sale_prices.get_text(strip=True) if sale_prices else ''
            
            autor = items.find('div', class_='product-title__author')
            autor_text = autor.get_text(strip=True) if autor else 'Автор не указан'
            
            print(title_book, old_prices_text, sale_prices_text, autor_text)

В этом коде я проанализировал каждую страницу, извлек информацию о книгах (название, старую и новую цену, автора) и распечатал её. Я также обработал URL изображения, чтобы получить правильную ссылку.

Заключение

Создание парсера данных с сайта — это отличное упражнение для понимания работы с веб-технологиями и обработки данных. На примере создания парсера для сайта я узнал, как обходить страницы, извлекать нужные данные и обрабатывать HTML-документы. Этот опыт будет полезен для дальнейшей работы с веб-данными и создания более сложных парсеров.

Написать комментарий

Вы можете оставить комментарий автору статьи Обязательные поля помечены *