Парсинг html страниц с выводом информации через JavaScript с использованием Selenium

20.05.20

Интеграция - WEB-интеграция

Есть девочки как девочки, есть мальчики как мальчики, есть сайтики как сайтики, но странички их обманщики. В целях сохранить информацию, от автоматизированного сбора, многие ресурсы пытаются защитить ее. Один из таких способов - вывод информации на странице через JavaScript. При получении такой страницы в 1С, JavaScript не успевает вывести необходимые данные, и в 1с получаем практически пустую страницу. В статье приведу пример разработки, для парсинга таких страниц, без регистрации и смс.

Подготовка

Для реализации данного парсинга нам необходимо:

0. google chrome. Да, нам нужен браузер, открываться он не будет) Все будет происходить в командной строке, но однако сам браузер нам необходим) Я пользовался хромом, и драйверы качал для него. 

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С. На этом вроде и все. Надеюсь, ничего не упустил.

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме. Без существенных изменений типовой конфигурации. Проверено с брендами: Интеграция 1С и GEELY Интеграция 1С и HAVAL Интеграция 1С и KIA Интеграция 1С и FORD Интеграция 1С и LADA ГАРАНТИЯ 100% ВНЕДРЕНИЯ!

36000 руб.

03.08.2020    15655    9    17    

9

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    12809    30    8    

10

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17419    6    15    

13

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25686    9    0    

7

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16253    41    49    

22
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. D_astana 110 21.05.20 05:29 Сейчас в теме
Одни защищают, другие ломают :)) Интересный подход. Плюс однозначно.
platonov.e; +1 Ответить
2. anton.fly7 173 21.05.20 07:43 Сейчас в теме
Привет!
подскажи пожалуйста, возможно ли достать исходный код ру из pserser.exe ?
rabid_otter; +1 Ответить
3. platonov.e 158 21.05.20 07:49 Сейчас в теме
(2) Привет. Исходный код парсера есть в статье в 4 пункте
4. anton.fly7 173 21.05.20 08:39 Сейчас в теме
(3) я имею ввиду способ достать исходник из ехе, другой программы, созданной инталером
5. platonov.e 158 21.05.20 08:43 Сейчас в теме
(4) Не знаю, не углублялся в такие вопросы.
6. Yashazz 4706 21.05.20 13:51 Сейчас в теме
Криво, извратно и не прикольно. С тем же успехом можно плагины Оперы использовать, Драгонфлай ту же.
Опираться в работе на левую внешнюю утилиту - покупать кота в мешке.
7. platonov.e 158 21.05.20 14:25 Сейчас в теме
(6) Извратно и не прикольно ок) А что кривого?) Пример? Он не доносит идею?)
А опираться в работе на любую скачанную, с того же инфостарта, обработку или любую бесплатную утилиту - тоже ведь кот в мешке) И тем не менее много людей этим пользуются, даже опенсорс проекты создают) Так что здесь такого?)
13. Yashazz 4706 21.05.20 15:48 Сейчас в теме
(7) Концепция скрещения ежа с ужом кривая. 1С тем и ценна, что это единая механика на единой платформе, и вендор гарантирует единообразную работу, соответствующую ожиданиям разраба, в большинстве условий. Про 1С известны требования, ограничения, поведение. Сторонняя утилита - всегда фактор "икс", всегда риск. Идея идеей, но есть штатная эксплуатация и поддержка, и там свои нюансы. Поэтому любая с ИС - это та же 1С, риски гораздо ниже, а не-пойми-откуда взятый экзешник, имхо, очевидно более проблемная штука. Так что не путайте тёплое с мягким.

Скажем так - когда вы воплотите идею, сделаете проект, а через полгода в самый неподходящий момент сторонняя утилита перестанет работать - вы познаете мощность удара этих граблей)

Если кому не очевидно: а) никто не предугадает поведения утилиты в разных условиях сети, софта, харда, инфраструктуры; б) малое количество накопленных и доступных знаний по утилите, т.к. не ширпотреб; в) при изменениях ситуации её придётся допиливать, при сбоях чинить, а это нужны навыки сверх 1С. Вывод - нафиг надо.
14. platonov.e 158 21.05.20 16:19 Сейчас в теме
(13) Концепция скрещивания ежа с ужом, порождает то, что не могли сделать еж с ежем) То, что не может сделать 1с, может сделать другая утилита, и пользоваться этим, "кривым" порождением иногда приходится) Знаете как сделать это средствами 1с, не выходя за рамки? Поделитесь? Я последнее время слышу потребность в этом, я нашел выход и поделился идеей с другими)

Можно пойти на риск и взять имеющиеся утилиты, можно разработать свою) Можно купить УНФ, а можно разработать свою. Это все вопрос выбора) Вряд ли те, кто покупал УПП, или КА 1.1 году в 2012, думал, что к концу десятилетия придется покупать другую конфигурацию. И что, они оказались застрахованные на всегда?) А ведь эти конфигурации не из дешевых. И даже в этих конфигурациях куча багов, что никто не предугадает их поведения, с исходным открытым кодом. Допиливать самому или писать в поддержку при наличии ИТС?) Допиливать самому - тратить трудозатраты компании за то, что уже заплатили. Тогда получается все нафиг) И в чем эта философия?
Ну мы что то уже далеко углубились)
chemezov; +1 Ответить
15. Yashazz 4706 21.05.20 19:08 Сейчас в теме
(14)
Знаете как сделать это средствами 1с, не выходя за рамки?
Ну если навскидку, то внутри самой 1С средствами WebKit, или действительно хттп-запросами поиграться. Делал, работало.
8. rusmil 262 21.05.20 14:28 Сейчас в теме
При получении такой страницы в 1С, JavaScript не успевает вывести необходимые данные
А что если просто добавить задержку например 5 секунд, html страница загрузится и потом уже ее парсить? Можете привести пример сайта где такой фокус не пройдет?
9. platonov.e 158 21.05.20 14:31 Сейчас в теме
(8) Попробуйте, хз как http запрос будет держать паузу) Может получится, буду рад если расскажите, такое не сразу гуглится)
Пример сайта есть в статье, мвидио.
11. утюгчеловек 38 21.05.20 14:38 Сейчас в теме
(9) Я делал через WebDriverWait, https://selenium-python.readthedocs.io/waits.html#explicit-waits, но у меня было точно известно чего нужно дожидаться
10. утюгчеловек 38 21.05.20 14:35 Сейчас в теме
Хорошая и жизненная тема, но статья ведь совсем не про 1С.

Не понятно зачем отдавать сырой результат в 1С. Раз ты уже умеешь в парсинг на питоне и уже получил страницу в него - сделай всю грязную работу там и отдай в 1С готовые циферки/буковки. Или я ошибаюсь?
12. platonov.e 158 21.05.20 15:28 Сейчас в теме
(10) Да, конечно можно все сделать в скрипте, можно сделать как хочешь, как видит художник)
Скрипт собирался из комментариев на stackoverflow)) Мне проще было передать сырой результат в 1с, и там работать с ним) Я пытался донести идею как это можно сделать, а каждый уже заточит как ему удобно)
16. starik-2005 3031 22.05.20 15:05 Сейчас в теме
Питон - нормально, только не понятно, зачем компиляция? 99% времени все-равно тратится на ожидание страницы. Я так понимаю, что компиляция нужна, чтобы не ставить на комп питон, так все-равно вызываете его "py скрипт.exe ..."? Так еще и гугловский механизм все-равно придется ставить.

ПОсмотрел сайт MVideo - да, с наскока там не разобраться, т.к. очень мудрено все. Как я понял, скрипт дергает виджеты и вставляет их в контейнеры, поэтому постобработка полностью полученной страницы - вполне нормально. В части скриптов есть сеттаймаут на 1500 мс, так что, полагаю, пятисекундное ожидание может решать вопрос без дополнительных танцев с бубном.
iulyus; platonov.e; +2 Ответить
17. ITSun 25.07.20 22:37 Сейчас в теме
Полезная статья, парсинг на python, но самое главное, что стэк технологий затрагивается.
Плюс однозначно! :)
18. Ibrogim 1311 26.07.20 15:07 Сейчас в теме
(0)
При получении такой страницы в 1С, JavaScript не успевает вывести необходимые данные

у мвидио хотябы загружается в итоге код страницы.
т.е. исходный html можно узреть
main_page = driver.page_source
print(main_page)


А как быть например с такой страницей? может есть идеи ?
19. platonov.e 158 26.07.20 16:13 Сейчас в теме
(18) А в чем там соль?
21. Ibrogim 1311 26.07.20 16:14 Сейчас в теме
(19) Просто странная страница. если в хроме попробовать получить её код, то там нет ничего почти...
22. Ibrogim 1311 26.07.20 16:15 Сейчас в теме
(21) Но вебдрайвер селениума умудрился код страницы получить. Странно
20. Ibrogim 1311 26.07.20 16:13 Сейчас в теме
(18) вопрос снимается более долгий sleep помог
platonov.e; +1 Ответить
23. Ibrogim 1311 07.08.20 13:09 Сейчас в теме
я решил свою задачу с помощью Селениума, однако потом сделал её с помощью типового поля ХТМЛ документа. Суть описана тут https://infostart.ru/1c/articles/1269023

Как мне кажется второй способ куда органичней и быстрей, Автор, что вы об этом думаете?
24. platonov.e 158 07.08.20 13:25 Сейчас в теме
(23) Вероятно, это хороший вариант, для платформ которые поддерживают webkit))
На счет ограничений и скорости не могу чего то сказать. В работе через вебкит, мы наверняка знаем, когда отработает js, в селениуме же мы ожидаем какое то время, чтобы проверить результат. Возможно из за этого, в вебките будет быстрей работать)
25. Ibrogim 1311 07.08.20 16:41 Сейчас в теме
(24)
webkit

я думаю что тут не обязателен webkit учитывая то, что по той же технологии создана публикация https://infostart.ru/public/104630/ от 12 аж года.

На самом деле даже в вебкит в событии ДокументСформирован() часто ещё не все элементы существуют. и приходится делать слип, например как на скриншоте
Прикрепленные файлы:
Оставьте свое сообщение