Парсер сайтов на Python
0
06.05.202012:4906.05.2020 12:49:12
Сегодня мы напишем с вами парсер сайтов на Python
Задача:
С сайта
https://www.sds-group.ru/ загрузить изображения товаров в формате артикул_товара.jpg и описание товаров в формате артикул_товара.txt для последующей загрузки в 1С.
Файл Excel с артикулами которые нужно загрузить прилагается(в файле две колонки первая - артикула, вторая - наименование товара).
[spoiler]
Для этой задачи нам понадобятся дополнительные библиотеки BeautifulSoup, requests, openpyxl и стандартная библиотека re, установим недостающее библиотеки:
pip install beautifulsoup4
pip install requests
pip install openpyxl
|
Для начала напишем загрузку картинок, создаем файл img.py и в начале файла импортируем нужные нам библиотеки:
from bs4 import BeautifulSoup
import requests
import re
import openpyxl
import urllib.request
|
При анализе сайта выясняем что поиск на сайте работает через GET параметр search, и URL поиска будет выглядеть как
https://www.sds-group.ru/search.htm?search=сюда_можно_подставить_артикул , занесем переменные в наш скрипт
# URL страницы поиска
url_src = 'https://www.sds-group.ru/search.htm?search='
# Файл артикулов
file = "sds-group.xlsx"
|
Считываем значения колонок файла sds-group.xlsx
# Инициализируем библиотеку для работы с Excel и считываем значения колонок
wb_obj = openpyxl.load_workbook(file)
sheet_obj = wb_obj.active
m_row = sheet_obj.max_row
|
Пишем цикл поиска товаров по артикулам на сайте из файла sds-group.xlsx и скачиванием картинок, я постарался максимально снабдить комментариями этот цикл:
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_src + значение ячейки
url = url_src + str(cell_obj.value)
# Делаем http запрос библиотекой requests и помещаем ответ сервера в переменную r
r = requests.get(url)
# Инициализируем парсер 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)
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')
# Изображение находится в div с классом product-img, находим его и получаем прямую ссылку на картинку
img_item = soup2.find("div", {"class": "product-img"})
img = img_item.img['src']
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('Не получилось сохранить файл')
|
Парсер текстового описание товаров выглядит аналогично, но с небольшими особенностями, я сделал его отдельным файлом - txt.py
Полный код парсера, со всеми файлами вы можете скачать в репозитории
https://github.com/Nikovit/parser_site
06.05.202012:4906.05.2020 12:49:12