Простой пример парсинга товаров с сайта, по входящему файлу с логом. Суть простая: у нас есть файл с артикулом поставщика, по которому будет производиться поиск и внутренним названием товара. Например, первая строка с файла: 24317,videx-24317.
Для работы парсера, импортируем следующие модули:
import urllib.request import os import time from bs4 import BeautifulSoup
Непосредственно для парсинга, будем использовать Beautiful Soup. Именно от отвечает за синтаксический разбор HTML/XML файлов. Документация на русском: http://wiki.python.su/BeautifulSoup. urllib.request отправляет запросы к сайту, os используем для формирования пути сохранения картинок, а time записывает в название документа с логом коректное время.
Парсинг происходит через строку поиска:
url = "{}/search/word={}/".format(host, data[0])
Если находим товар, переходим в карточку товара и достаем ссылку на фото. Само фото с внутренним названием сохраняем в папку images:
path = "{}/images/{}.{}".format(dir, sku, name)
Полный код парсера:
import urllib.request import os import time from bs4 import BeautifulSoup time = time.strftime("%Y-%m-%d-%H-%M") dir = os.path.dirname(os.path.abspath(__file__)) #Прописываем хост сайта, который будем парсить host = 'http://videx.ua' #Определяем название файла с логом file = open("log-{}.csv".format(time), "w") for line in open("products.txt"): data = line.split(",") sku = data[1].strip() #Параметры строки поиска на сайте url = "{}/search/word={}/".format(host, data[0]) print(url) url = urllib.request.urlopen(url) if url.getcode() == 200: soup = BeautifulSoup(url, "lxml") #Достаем ссылку на товар в результатах поиска product_link = soup.find('a', attrs={'class': 'i'}) if product_link: product_link = "{}{}".format(host, product_link.get('href')) print(product_link) product_url = urllib.request.urlopen(product_link) if product_url.getcode() == 200: #Разбираем страницу товара soup = BeautifulSoup(product_url, "lxml") data = soup.find('a', attrs={'class': 'all popupLink popupWindow-popupGallery'}).get('href') href = "{}{}".format(host, data) #Отладочный принт print(href) img = urllib.request.urlopen(href).read() #Обрабатываем имя картинки. чтобы сохранить в коректном формате name = href[href.rfind(".")+1:].strip() #Формируем путь для сохранения картинок path = "{}/images/{}.{}".format(dir, sku, name) f = open(path, "wb") f.write(img) f.close() else: print("Не удалось открыть страницу товара {}".format(data[1])) else: print("{} не найден на сайте".format(sku), file=file) else: print("Не получен HTTP ответ 200")
Все данные можно найти в репозитории: https://github.com/HoloborodkoBohdan/python-site-parser-with-logs.