Подготовка
Для реализации данного парсинга нам необходимо:
0. google chrome. Да, нам нужен браузер, открываться он не будет) Все будет происходить в командной строке, но однако сам браузер нам необходим) Я пользовался хромом, и драйверы качал для него.
1. 1с (шутеечка =) ). Проверял на 8.2.19.102, 8.3.15.1656
2. ChromeDriver (искать тут)
3. Python (искать тут)
3.1 pyinstaller
3.2 Selenium
4. Скрипт для связки 1с и ChromeDriver . Напишем сами на Python, и скомпилируем в exe(parser.exe).
Суть работы такая - запускаем из 1с parser.exe, в параметрах передаем ссылку на страницу для парсинга, и путь к файлу, в который сохраним нашу страницу, для парсинга из 1с, и еще кое какие данные. Т.е. фактически мы скачаем эту страницу с уже выведенными данными и будем в 1с работать с ее локальной версией.
Рис.1 - Общие шаги
Теперь подробнее
1. Работа парсера была протестированна на 1с 8.2 и 8.3.
Я передаю одну ссылку, и жду в ответ только одну страницу. Это не очень хорошо, так как лучше передавать весь массив ссылок, и обрабатывать их в скрипте, чтобы не вызывать скрипт на каждую страницу. Рассмотрим именно такой вариант. Но и в в таком режиме можно распараллелить работу - пока скрипт скачивает страницу, 1с обрабатывает предыдущий результат.
&НаКлиенте
Перем КаталогРезультата,
НачалоПарсинга,
ИмяФайлаРезультата;
&НаКлиенте
Процедура Парсинг(Команда)
ПередПарсинг();
КонецПроцедуры
&НаКлиенте
Процедура ПередПарсинг()
url = "https://www.mvideo.ru/televizory-i-cifrovoe-tv-1/televizory-65";
НачатьПарсинг(url);
КонецПроцедуры
&НаКлиенте
Процедура НачатьПарсинг(url)
СкриптПарсинга = "B:\job\parser_site\py\parser.exe"; // Путь до parser.exe
WebDriver = "C:\chromedriver.exe"; // Путь до веб драйвера
КаталогРезультата = КаталогВременныхФайлов();
ИмяФайлаРезультата = Строка(Новый УникальныйИдентификатор) + "_parserres.html";
ФайлРезультата = КаталогРезультата + ИмяФайлаРезультата;
Команда = СкриптПарсинга + " --arurl " + url + " --path " + ФайлРезультата + " --driver ";
НачалоПарсинга = ТекущаяДата();
КомандаСистемы("""" + Команда + """");
ПодключитьОбработчикОжидания("ПослеПарсингаСтраницы", 1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПарсингаСтраницы()
МассивФайлов = НайтиФайлы(КаталогРезультата, ИмяФайлаРезультата, Ложь);
Если ТекущаяДата() - НачалоПарсинга > 120 Тогда
Возврат;
КонецЕсли;
Если МассивФайлов.Количество() = 0 Тогда
ПодключитьОбработчикОжидания("ПослеПарсингаСтраницы", 2, Истина);
Возврат;
КонецЕсли;
Для Каждого Элемент Из МассивФайлов Цикл
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.ОткрытьФайл(Элемент.ПолноеИмя);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеHTML);
КонецЦикла;
КонецПроцедуры
2. WebDriver - это инструмент с открытым исходным кодом для автоматического тестирования веб-приложений во многих браузерах. Он предоставляет возможности для навигации по веб-страницам, ввода данных пользователем, выполнения JavaScript и многого другого. ChromeDriver - это автономный сервер, который реализует стандарт W3C WebDriver . ChromeDriver доступен для Chrome на Android и Chrome на рабочем столе (Mac, Linux, Windows и ChromeOS).
Путь к драйверу передаем в парсер параметром WebDriver.
3. Phyton можно скачать с официального сайта, либо установить через пакетный менеджер. Думаю с этим вопросом не возникнет.
3.1 pyinstaller - утилита для компиляции .py в .exe. Установка:
pip install pyinstaller
Если команда pip не найдена, нужно добавить корневую директорию Phyton и деректорию ./Scripts в переменные окружения Path
Рис.2 - Переменные окружения для Python
3.2 Selenium - собственно он будет делать всю грязную работу с js. Установка:
pip install selenium
4. Parser.exe
Вот мой примера кода парсинга:
import time
import argparse
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('headless')
options.add_argument('window-size=1920x1080')
options.add_argument("disable-gpu")
parser = argparse.ArgumentParser()
parser.add_argument('--arurl' , type=str)
parser.add_argument('--path' , type=str)
parser.add_argument('--driver' , type=str)
args = parser.parse_args()
url = args.arurl
path = args.path
PathWebDriver = args.driver
driver = webdriver.Chrome(PathWebDriver, options=options)
driver.get(url)
time.sleep(5)
html_source = driver.page_source
res = open(path, 'w', encoding='utf-8')
res.write(html_source)
res.close()
driver.quit()
Сохраним его с именем parser.py. Чтобы компилировать его в exe необходимо применить для него команду:
pyinstaller parser.py
В папке со скриптом появится distr. И там появится Parser.exe.
Собственно его мы и будем запускать из 1С. На этом вроде и все. Надеюсь, ничего не упустил.