Николаев Виталий
Блог веб-разработчика: Битрикс, PHP, Python, Linux и SEO
Python Python
06.05.2020

Парсер сайтов на Python

Парсер сайтов на Python

В этой статье разберем пример парсера сайта на Python. Задача — собрать изображения и описания товаров с сайта sds-group.ru для последующей загрузки данных в 1С.

На входе у нас есть Excel-файл с артикулами товаров. В файле две колонки:

  • первая колонка — артикул товара;
  • вторая колонка — наименование товара.

В результате работы скрипта нужно получить:

  • изображения товаров в формате артикул_товара.jpg;
  • описания товаров в формате артикул_товара.txt.

Установка библиотек

Для парсера понадобятся библиотеки:

  • BeautifulSoup — для разбора HTML;
  • requests — для HTTP-запросов;
  • openpyxl — для чтения Excel-файла;
  • re — стандартная библиотека Python для работы с регулярными выражениями;
  • urllib — для скачивания изображений.

Устанавливаем недостающие библиотеки:

pip install beautifulsoup4
pip install requests
pip install openpyxl

Импорт библиотек

Создаем файл img.py и подключаем необходимые библиотеки:

from bs4 import BeautifulSoup
import requests
import re
import openpyxl
import urllib.request

Настройка URL поиска и Excel-файла

При анализе сайта видно, что поиск работает через GET-параметр search. URL поиска выглядит так:

https://www.sds-group.ru/search.htm?search=АРТИКУЛ

Занесем адрес поиска и имя Excel-файла в переменные:

# URL страницы поиска
url_src = 'https://www.sds-group.ru/search.htm?search='

# Файл с артикулами
file = "sds-group.xlsx"

Чтение Excel-файла с артикулами

Теперь считываем Excel-файл и получаем количество строк:

# Открываем Excel-файл
wb_obj = openpyxl.load_workbook(file)

# Выбираем активный лист
sheet_obj = wb_obj.active

# Получаем количество строк
m_row = sheet_obj.max_row

Поиск товаров по артикулам

Далее запускаем цикл по строкам Excel-файла. Из первой колонки берем артикул, подставляем его в URL поиска и отправляем запрос на сайт.

for i in range(1, m_row + 1):

    # Считываем артикул из первой колонки
    cell_obj = sheet_obj.cell(row=i, column=1)

    print('-------------------------')
    print('Артикул: ' + str(cell_obj.value))

    # Формируем URL поиска
    url = url_src + str(cell_obj.value)

    # Делаем HTTP-запрос
    r = requests.get(url)

    # Разбираем HTML через BeautifulSoup
    soup = BeautifulSoup(r.text, 'html.parser')

Получение ссылки на карточку товара

В результатах поиска ссылка на детальную страницу товара находится внутри элемента с классами flex-3 m-flex t-left.

# Находим блок со ссылкой на товар
url_item = soup.find_all(class_='flex-3 m-flex t-left')

url_item_str = str(url_item)

# Получаем href через регулярное выражение
item = re.findall('href=[\'"]?([^\'" >]+)', url_item_str)

Если товар по артикулу не найден, переходим к следующей строке Excel-файла:

try:
    item_href = str(item[0])
    print('https://www.sds-group.ru' + item_href)

except IndexError:
    print('Артикул на сайте не найден')
    continue

Переход на страницу товара

Если товар найден, открываем его детальную страницу:

r = requests.get('https://www.sds-group.ru' + item_href)

soup2 = BeautifulSoup(r.text, 'html.parser')

Получение изображения товара

Изображение товара находится в блоке с классом product-img. Находим этот блок и получаем ссылку на картинку:

# Находим блок с изображением
img_item = soup2.find("div", {"class": "product-img"})

# Получаем путь к изображению
img = img_item.img['src']

# Формируем полный URL изображения
img_src = 'https://www.sds-group.ru' + img

print(img_src)

Скачивание изображения

Сохраняем изображение в папку img с именем файла по артикулу товара:

try:
    urllib.request.urlretrieve(
        img_src,
        './img/' + str(cell_obj.value) + '.jpg'
    )

except:
    print('Не получилось сохранить файл')

Полный код парсера изображений

from bs4 import BeautifulSoup
import requests
import re
import openpyxl
import urllib.request

# URL страницы поиска
url_src = 'https://www.sds-group.ru/search.htm?search='

# Файл с артикулами
file = "sds-group.xlsx"

# Открываем Excel-файл
wb_obj = openpyxl.load_workbook(file)

# Выбираем активный лист
sheet_obj = wb_obj.active

# Получаем количество строк
m_row = sheet_obj.max_row

for i in range(1, m_row + 1):

    # Считываем артикул из первой колонки
    cell_obj = sheet_obj.cell(row=i, column=1)

    print('-------------------------')
    print('Артикул: ' + str(cell_obj.value))

    # Формируем URL поиска
    url = url_src + str(cell_obj.value)

    # Делаем HTTP-запрос
    r = requests.get(url)

    # Разбираем HTML
    soup = BeautifulSoup(r.text, 'html.parser')

    # Находим блок со ссылкой на товар
    url_item = soup.find_all(class_='flex-3 m-flex t-left')

    url_item_str = str(url_item)

    # Получаем href
    item = re.findall('href=[\'"]?([^\'" >]+)', url_item_str)

    # Проверяем, найден ли товар
    try:
        item_href = str(item[0])
        print('https://www.sds-group.ru' + item_href)

    except IndexError:
        print('Артикул на сайте не найден')
        continue

    # Переходим на детальную страницу товара
    r = requests.get('https://www.sds-group.ru' + item_href)

    soup2 = BeautifulSoup(r.text, 'html.parser')

    # Получаем изображение товара
    img_item = soup2.find("div", {"class": "product-img"})

    img = img_item.img['src']

    img_src = 'https://www.sds-group.ru' + img

    print(img_src)

    # Скачиваем изображение
    try:
        urllib.request.urlretrieve(
            img_src,
            './img/' + str(cell_obj.value) + '.jpg'
        )

    except:
        print('Не получилось сохранить файл')

Парсер описаний товаров

Парсер текстовых описаний товаров работает по похожему принципу:

  • берем артикул из Excel;
  • ищем товар на сайте;
  • переходим в карточку товара;
  • получаем нужный блок с описанием;
  • сохраняем текст в файл артикул.txt.

Для удобства я вынес парсер описаний в отдельный файл txt.py.

Репозиторий с кодом

Полный код парсера со всеми файлами можно посмотреть в репозитории:

https://github.com/Nikovit/parser_site

Итог

В результате получается простой Python-парсер, который берет артикулы из Excel-файла, ищет товары на сайте и скачивает изображения для дальнейшей загрузки в 1С.

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

25 просмотров

Комментарии

Где заказы?
Почему у одних компаний очередь из клиентов, а у других пустой сайт и тишина?
Телеграм канал «Где заказы?» — про продажи, сайты и ошибки бизнеса на реальных примерах. Подписаться