Парсинг 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    15725    10    17    

11

Интеграция 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    17540    6    15    

13

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

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

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

12000 руб.

02.02.2021    16350    42    49    

23

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

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

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

8400 руб.

01.02.2019    25735    9    0    

7

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

Обмен с ГосИС WEB-интеграция Платформа 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    88569    160    215    

318
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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 4709 21.05.20 13:51 Сейчас в теме
Криво, извратно и не прикольно. С тем же успехом можно плагины Оперы использовать, Драгонфлай ту же.
Опираться в работе на левую внешнюю утилиту - покупать кота в мешке.
7. platonov.e 158 21.05.20 14:25 Сейчас в теме
(6) Извратно и не прикольно ок) А что кривого?) Пример? Он не доносит идею?)
А опираться в работе на любую скачанную, с того же инфостарта, обработку или любую бесплатную утилиту - тоже ведь кот в мешке) И тем не менее много людей этим пользуются, даже опенсорс проекты создают) Так что здесь такого?)
13. Yashazz 4709 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 4709 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 3033 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 аж года.

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