Простой пример парсинга товаров с сайта, по входящему файлу с логом. Суть простая: у нас есть файл с артикулом поставщика, по которому будет производиться поиск и внутренним названием товара. Например, первая строка с файла: 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.