8.х ОБМЕН Парсинг сайта через COM IE 11

Тема в разделе "Обмен данными в "1С:Предприятие 8"", создана пользователем Sagot_63, 28 апр 2016.

  1. TopicStarter Overlay
    Sagot_63
    Offline

    Sagot_63

    Регистрация:
    25 июн 2015
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Доброго времени суток.!
    Вопрос до боли известный, необходимо забрать инфу с сайта. Но есть нюансы:
    1. Нет возможности зайти сразу на страницу авторизации (сначала заходим на домашнюю страницу, нажимаем ссылку LogIn, получаем форму авторизации и только потом логинимся).
    2. На сайте нужно через поисковую строку искать данные, далее читать их и искать еще (данные могут быть на русском и английском, т.е. если данные для поиска на русском, то искать нужно в "русской версии" сайта, а это еще один переход по ссылке на другую страницу. С английским такая же тема).

    В итоге:
    - заходим на домашнюю страницу - логинимся - ищем данные - (переходим на др. версию сайта, если нужно) - забираем их.

    Проблема:
    Не считываются данные в свойство "document" при переходе по ссылке.
    Возникает в двух моментах:
    - когда переходим по ссылке, чтобы залогиниться (это не кнопка, а просто ссылка);
    - когда меняем язык на сайте (тоже ссылка).

    Примечание
    Если перед переходом по ссылке на этапе авторизации получить ссылку, закрыть ком и открыть снова с переходом через метод IE.navigate("ссылка"), тогда данные в свойство "document" ложатся нормально. Но проделать тоже самое при смене языка на сайте уже не получится, т.к. нужно логиниться снова и плюс не хотелось бы вот именно так решать эту задачку.

    Вот код:
    Код:
    [CODE]&НаКлиенте
    Процедура УстановитьОжиданиеИЕ(IE, ВторойВызов=Ложь)
        Если НЕ IE.Busy Тогда
            Д = ТекущаяДата() + 3;
            Пока Д >= ТекущаяДата() Цикл
                Если IE.Busy Тогда Прервать; КонецЕсли;  
            КонецЦикла;
        КонецЕсли;
     
        Пока IE.Busy Цикл КонецЦикла;
        Пока IE.ReadyState < 4 Цикл КонецЦикла;
        Попытка
            Если IE.Document.ReadyState = Null Тогда
                IE.Refresh(); УстановитьОжиданиеИЕ(IE);
            КонецЕсли;
            Пока IE.Document.ReadyState <> "complete" Цикл КонецЦикла;
        Исключение
            Если ВторойВызов Тогда
                Возврат;
            Иначе
                Ссылка = IE.LocationURL; IE.Quit();
                IE = ПолучитьCOM("InternetExplorer.Application");
                IE.Navigate(Ссылка); УстановитьОжиданиеИЕ(IE, Истина);
            КонецЕсли;
        КонецПопытки;
    КонецПроцедуры
    
    &НаКлиенте
    Функция ВыполнитьАвторизациюПользователя(IE, Ссылка, Логин, Пароль, Авторизован=Ложь, СЧ=0)
        Попытка
            Elements = IE.Document.GetElementsByName("username");
            Если Elements.Length = 1 Тогда
                Для Каждого El Из Elements Цикл
                    El.Value = Логин;
                КонецЦикла;
            КонецЕсли;
         
            Elements = IE.Document.GetElementsByName("password");
            Если Elements.Length = 1 Тогда
                Для Каждого El Из Elements Цикл
                    El.Value = Пароль;
                КонецЦикла;
            КонецЕсли;
         
            IE.Document.GetElementById("ID").Click();
            УстановитьОжиданиеИЕ(IE); Авторизован = Истина;
        Исключение
            Если СЧ > 3 Тогда Возврат Ложь; КонецЕсли;
            IE.Quit(); IE.Navigate(Ссылка); УстановитьОжиданиеИЕ(IE); СЧ = СЧ + 1;
            Если ВыполнитьАвторизациюПользователя(IE, Ссылка, Логин, Пароль,, СЧ) Тогда
                Возврат Истина; 
            КонецЕсли;
        КонецПопытки;
        Возврат Авторизован;
    КонецФункции
    
    &НаКлиенте
    Процедура Закачать(Команда)
        СпТаблиц = ПолучитьСписокТаблицДляЗагрузки();
        Если СпТаблиц = Ложь Тогда Возврат; КонецЕсли;
        IE = ПолучитьCOM("InternetExplorer.Application");
     
        Для Каждого Строка Из СпТаблиц.SOURCE_LIST Цикл
            РА = Строка.ID; Ресурс = Строка.RESOURCE; IE.Navigate(Ресурс); УстановитьОжиданиеИЕ(IE);
         
            Попытка
                Если Строка.NEW_PAGE_IN_LOGIN = 1 Тогда
                    Classes = IE.Document.GetElementsByClassName("ИмяКласса"); 
                    Если Classes.Length = 1 Тогда
                        Для Каждого Class Из Classes Цикл
                            Ресурс = Class.All(0).Href; Прервать;
                        КонецЦикла;
                        Попытка
                            IE.Quit(); IE = IE.Navigate(Ресурс); УстановитьОжиданиеИЕ(IE);
                        Исключение
                            Сообщить("Подключение к сайту «" +Строка.NAME + "» не удалось!"); Прервать;
                        КонецПопытки;
                    Иначе
                        Сообщить("Подключение к сайту «" +Строка.NAME + "» не удалось!"); Прервать;
                    КонецЕсли;
                КонецЕсли;
             
                Если НЕ ВыполнитьАвторизациюПользователя(IE, Ресурс, Строка.LOGIN, Строка.PASSWORD) Тогда
                    Сообщить("Авторизация пользователя на сайте «" + Строка.NAME + "» не выполнена!"); Прервать;
                КонецЕсли;
             
                Ресурс = IE.LocationURL; СписокЛиц = СпТаблиц.FACE_CODES.НайтиСтроки(Новый Структура("SOURCE", РА)); СписокНеНайденных = Новый Массив;
                Для Каждого Лицо Из СписокЛиц Цикл
                    ИмяЛица = Лицо.NAME_IN_SITE; ЭтоРусский = КодСимвола(ИмяЛица, 1) >= 1040;
                    ТекРесурс = ?(ЭтоРусский, СтрЗаменить(Ресурс, "en_US", "ru_RU"), СтрЗаменить(Ресурс, "ru_RU", "en_US"));
                    Если ТекРесурс <> IE.LocationURL Тогда
                        RootClasses = IE.Document.GetElementsByClassName("ИмяКласса");
                        Если RootClasses.Length = 1 Тогда
                            Для Каждого RootClass Из RootClasses Цикл
                                Classes = RootClass.Children; Прервать;
                            КонецЦикла;
                            AmGroup = False; RuGroup = False;
                            Для Каждого Class Из Classes Цикл
                                Если НРег(Class.ClassName) = "dropdown-header" Тогда
                                    AmGroup = Найти(Class.InnerText, "Americans") > 0;
                                    RuGroup = Найти(Class.InnerText, "Europe") > 0;
                                ИначеЕсли НРег(Class.ClassName) <> "selected" Тогда
                                    Если AmGroup И Найти(Class.All(0).InnerText, "English") > 0 ИЛИ
                                         RuGroup И Найти(Class.All(0).InnerText, "Russia") > 0 Тогда
                                        IE.Navigate(Class.All(1).Href); УстановитьОжиданиеИЕ(IE); Прервать;
                                    КонецЕсли;
                                КонецЕсли;
                            КонецЦикла;
                        КонецЕсли;
                    КонецЕсли;
                 
                    IE.Document.GetElementById("ИД").Value = ИмяЛица;
                    FindButton = IE.Document.GetElementById("ИД");
                    FindButton.Focus(); FindButton.Click();
                    Попытка
                        УстановитьОжиданиеИЕ(IE);
                        //Обход полученных данных
                    Исключение
                        СписокНеНайденных.Добавить(Лицо); Продолжить; 
                    КонецПопытки;
                КонецЦикла;
            Исключение
                Сообщить("Ошибка:" + Символы.ПС + ОписаниеОшибки());
                Прервать; 
            КонецПопытки;
        КонецЦикла;
        IE.Quit();
    КонецПроцедуры
    Последнее редактирование модератором: 29 апр 2016
  2. TopicStarter Overlay
    Sagot_63
    Offline

    Sagot_63

    Регистрация:
    25 июн 2015
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    слишком тихо..
  3. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.988
    Симпатии:
    398
    Баллы:
    104
    Тема очень интересная, но вот лично у меня, к сожалению, нет ни опыта, ни даже возможности хоть как то разобраться в этой проблеме. Если сможете раздобыть информацию на эту тему, то поделитесь ей пожалуйста.
    --- Объединение сообщений, 29 апр 2016 ---
    Я так понимаю доступа к SQl базе нет?
    --- Объединение сообщений, 29 апр 2016 ---
    Ну хотя если парсинг, то какой доступ :)
Похожие темы
  1. Fakir
    Ответов:
    7
    Просмотров:
    1.963
  2. JohnConnor
    Ответов:
    3
    Просмотров:
    1.217
  3. Peroman
    Ответов:
    13
    Просмотров:
    617
Загрузка...

Поделиться этой страницей