Парсер сайтов на 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С.
Такой подход удобно использовать для подготовки каталогов, наполнения интернет-магазинов, обновления карточек товаров и автоматизации рутинной работы с прайсами.
Комментарии