Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2010, 20:21   #1
sp3ctr3
 
Регистрация: 21.05.2010
Сообщений: 3
По умолчанию Импортирование данных в эксель из интернета

Нужно импортировать данные из протокола содержащегося в интернете на нескольких страницах.

Урл страницы выглядит следующим образом:
http://www.site.ru/id=НОМЕР&page_id=1
На странице после шапки и номеров страниц лога
1 | 2 | 3 | 4 | 5 | >>
идет 50 строк с информацией, которую собственно и нужно импортировать в эксель.

При использовании встроенного экселевского механизма "Получить внешние данные Из Веба" столкнулся с рядом проблем:

1. Отдельно "50 строк с информацией" импортировать отказывается (нет стрелочки на которую нажимать), поэтому приходится главную таблицу импортировать - полностью страницу.

2. При импортировании на выходе получаю таблицу без форматирования, а мне нужно чтобы форматирование текста цветом сохранилось, на базе этого форматирования будет осуществляться дальнейший анализ.

3. Как сделать чтобы можно было сразу импортировать много страниц? В идеале задать глубину запроса для части урла page_id=1 и до 50 например, задать НОМЕР в урле (он для разных ситуация разный может быть), и еще задать интервал с которым можно обращаться к следующей странице (если очень быстро все страницы запрашивать сайт забанит айпи).

4. Можно ли сразу при импортировании отсекать ненужные строки, строки которые не содержат например заранее заданную подстроку "superpuper"? Я при обработке данных пользуюсь таким приемом [=ЕСЛИ((ПРАВСИМВ(A1;10))="superpuper ";1;0)], зная что искомая подстрока всегда находится в конце текста и занимает ровно 10 символов, а потом фильтрую единички по этому столбцу. Мне не очень удобно потом с таблицей с фильтром работать, есть ли способ более красиво создать новую таблицу содержащую только строки с текстом "superpuper"?

Хотелось бы разобраться с этими нюансами в комплексе, но если будут какие-то отдельные советы по пунктам, то тоже буду очень рад.
sp3ctr3 вне форума Ответить с цитированием
Старый 22.05.2010, 01:32   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Для начала, не помешает взглянуть на этот сайт - сообщите настоящий адрес ресурса.

Цитата:
Как сделать чтобы можно было сразу импортировать много страниц?
В общем случае - никак.
Но с некоторых сайтов можно скачать и всё сразу - бывает, что можно в строку адреса добавить параметр, указывающий на количество информации, выводимой на одну страницу.

Попробуйте вручную (путём подбора параметров в адресной строке) добиться вывода ВСЕЙ нужной информации.
Если не получится - придётся перебирать страницы в цикле.

Цитата:
Отдельно "50 строк с информацией" импортировать отказывается (нет стрелочки на которую нажимать), поэтому приходится главную таблицу импортировать - полностью страницу.
Это не так уж и страшно - обычно достаточно 10-15 строк кода, чтобы выдрать с листа только нужные данные.

Цитата:
если очень быстро все страницы запрашивать сайт забанит айпи
Это точно известно, или это ваше предположение?
Обычно страницы грузятся не очень быстро, так что между загрузками отдельных страниц проходит 1-3 секунды.
Проворный юзер с быстрым интернетом вручную прощелкает все страницы ещё быстрее...

Цитата:
При импортировании на выходе получаю таблицу без форматирования, а мне нужно чтобы форматирование текста цветом сохранилось, на базе этого форматирования будет осуществляться дальнейший анализ.
Вот это - ключевой момент.
Есть несколько вариантов, например:
1) получаем html - код страницы, и парсим её
2) сохраняем страницу в файл htm, открываем этот файл Word-ом (при помощи макроса), далее работаем с объектами Word - перебираем таблицы, анализируем цвета...
3) изучаем DOM, и работаем с объектной моделью веб-страницы

Примеры кода можно глянуть здесь: http://www.planetaexcel.ru/forum.php/?thread_id=12478

Цитата:
Можно ли сразу при импортировании отсекать ненужные строки
Это уже мелочи.
Если вам удастся написать макрос, который быстро и безошибочно выкачает все страницы с нужного вам сайта, то с удалением лишних строк вы и подавно справитесь.
Конкретный способ зависит от выбранного метода получения информации с сайта.
EducatedFool вне форума Ответить с цитированием
Старый 22.05.2010, 12:50   #3
sp3ctr3
 
Регистрация: 21.05.2010
Сообщений: 3
По умолчанию

Цитата:
Для начала, не помешает взглянуть на этот сайт - сообщите настоящий адрес ресурса.
Протокол можно посмотреть если только зайти на сайт, я зарегистрировал специально аккаунт, чтобы можно было посмотреть
сайт: ganjawars.ru
логин: msexcel
пароль: msexcel123
пример протокола: http://www.ganjawars.ru/info.warstats.php?id=729668

Цитата:
Попробуйте вручную (путём подбора параметров в адресной строке) добиться вывода ВСЕЙ нужной информации.
Вряд ли так получится.

Цитата:
Если не получится - придётся перебирать страницы в цикле.
Не подскажите как это можно реализовать?

Цитата:
Это не так уж и страшно - обычно достаточно 10-15 строк кода, чтобы выдрать с листа только нужные данные.
На готовое решения, я так понимаю, глупо было надеяться?

Цитата:
Это точно известно, или это ваше предположение?
Это точно известно. Если открыть 50 страниц с интервалом 1-3 секунды, то с большое вероятностью часа 2-3 будешь отдыхать потом без сайта...

Цитата:
Есть несколько вариантов, например:
1) получаем html - код страницы, и парсим её
2) сохраняем страницу в файл htm, открываем этот файл Word-ом (при помощи макроса), далее работаем с объектами Word - перебираем таблицы, анализируем цвета...
3) изучаем DOM, и работаем с объектной моделью веб-страницы
1. в этом я ничего не понимаю (
2. это ясно, но мне проще тогда сразу ктрл+ц ктрл+в в эксель сразу сделать...
3. ну уж не такая и важная задача чтобы сразу изучать DOM. скорее баловство.
sp3ctr3 вне форума Ответить с цитированием
Старый 22.05.2010, 18:49   #4
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Цитата:
Не подскажите как это можно реализовать?
Примерно так:
Код:
for i=1 to 50
url="http://..." & f(i) ' некоторая функция от i
...
next i
Цитата:
На готовое решения, я так понимаю, глупо было надеяться?
Да, особенно если там надо специально входить на страницу как-то.
Цитата:
Если открыть 50 страниц с интервалом 1-3 секунды
Ну можно поставить какой-нибудь sleep в промежутке...
motorway вне форума Ответить с цитированием
Старый 24.05.2010, 18:41   #5
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

посмотрите.может пригодится.Интервал 20 секунд.Без проблем взял все данные.Они на листе5
Вложения
Тип файла: rar Инструкция.rar (387.1 Кб, 155 просмотров)
Тип файла: rar Лист11.rar (111.0 Кб, 131 просмотров)
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 29.05.2010, 19:10   #6
sp3ctr3
 
Регистрация: 21.05.2010
Сообщений: 3
По умолчанию

doober
Спасибо. Работает.
sp3ctr3 вне форума Ответить с цитированием
Старый 03.06.2010, 20:16   #7
maksim_serg
Форумчанин
 
Аватар для maksim_serg
 
Регистрация: 25.03.2010
Сообщений: 417
По умолчанию

а если для того что бы скачать не обходимо сперва ввести логин и пароль. как такое реализовать?
maksim_serg вне форума Ответить с цитированием
Старый 03.06.2010, 20:28   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Сообщение от maksim_serg Посмотреть сообщение
необходимо сперва ввести логин и пароль. как такое реализовать?
Примерно так:
Код:
Sub test()
    NavStr = "https://my.kyivstar.ua/tbmb/login/show.do"
    IE.Navigate NavStr
    While IE.busy Or (IE.readyState <> 4): DoEvents: Wend

    Set ieDoc = IE.Document
    If ieDoc.Title Like "Ошибка сертификата*" Or ieDoc.Title Like "Certificate Error*" Then
        ieDoc.Links(1).Click
        While IE.busy Or (IE.readyState <> 4): DoEvents: Wend
        Set ieDoc = IE.Document
    End If

    With ieDoc
        .all("user").Value = "СюдаПишемЛогин"
        .all("password").Value = "СюдаПишемПароль"
        .all("Submit").Click
        For i = 1 To 1000: DoEvents: Next
        While IE.busy Or (IE.readyState <> 4): DoEvents: Wend
    End With
    
    NavStr = "https://my.kyivstar.ua/tbmb/addressbook/pab-send-sms.do"
    IE.Navigate NavStr
    
    For i = 1 To 20000: DoEvents: Next
    While IE.busy Or (IE.readyState <> 4): DoEvents: Wend

    Set ieDoc = IE.Document
    With ieDoc.forms(2)
        .all(9).Value = "+79125846578"
        .all(16).Value = "Проверка отправки СМС при помощи макроса"
        For i = 1 To 1000: DoEvents: Next
        .all(32).Click
    End With
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 03.06.2010, 20:40   #9
maksim_serg
Форумчанин
 
Аватар для maksim_serg
 
Регистрация: 25.03.2010
Сообщений: 417
По умолчанию

Код:
IE.Navigate NavStr
вызывает ошибку 424
object required
maksim_serg вне форума Ответить с цитированием
Старый 03.06.2010, 20:47   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Ну так это была лишь часть кода...

Надо было проявить немного фантазии, и, либо добавить на форму компонент WebBrowser, либо дописать в коде строку типа
Код:
Set IE = CreateObject("InternetExplorer.Application")
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
макрос обновления данных из интернета Legame Microsoft Office Excel 14 01.10.2015 09:26
импорт данных из интернета peq Microsoft Office Excel 7 30.04.2010 09:12
Макрос для экспорта данных в таблицу эксель scythe Microsoft Office Excel 2 21.02.2010 22:18
Эксель + Интернет ( экспорт данных) ShamanK Microsoft Office Excel 1 16.10.2009 13:23