Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Office Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7   вперед  Ctrl      все
 VBA и WEB  [new]
ferzmikk
Member

Откуда:
Сообщений: 1886
Здравствуйте!

Есть задача: написать макрос, который автоматизирует выгрузку данных из сайта.

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

Есть вопросы. Скажите,
1. Для выгрузки данных какой лучше использовать объект: CreateObject("MSXML2.XMLHTTP") или CreateObject("Microsoft.XMLHTTP")? Или лучше использовать какой то другой объект?
2. Как выдергивать список? Только через полученный исходный код как текст, и потом через цикл и как то по тегам выдергивать элементы? Или есть специальная команда для выдергивании списков?
3. Если список разделен на страницы, то получится выгрузить сразу все страницы? Или только по странично? Если выгружать по странично, то важно учесть, что может быть такое, что какой то элемент списка в какой то момент времени может удалиться, добавиться или переместиться. Возможно ли это учесть?
9 июл 19, 19:46    [21923763]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
iMrTidy
Member

Откуда:
Сообщений: 773
ferzmikk,

1. Говорят, что MSXML2 более новый namespace, и вроде рекомендуют его.
2. Для кролинга/скрапинга лучше воспользоваться HTMLDocument, и далее при помощи его функционала выдергивать, что нужно. Не помню, но возможно, там даже есть XPath, что существенно облегчит жизнь.
3. Что значит "список разделен на страницы"? Посмотрите как выглядит html и, исходя из этого, парсите.
9 июл 19, 23:22    [21923858]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
ferzmikk
Member

Откуда:
Сообщений: 1886
iMrTidy
ferzmikk,

1. Говорят, что MSXML2 более новый namespace, и вроде рекомендуют его.
Файлы скачивает?
10 июл 19, 00:09    [21923866]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
ferzmikk
Member

Откуда:
Сообщений: 1886
iMrTidy
2. Для кролинга/скрапинга лучше воспользоватьсяHTMLDocument, и далее при помощи его функционала выдергивать, что нужно. Не помню, но возможно, там даже есть XPath, что существенно облегчит жизнь.
Возникает вопрос как это все реализовывать в VBA. В интернете мало инфо на эту тему.
10 июл 19, 17:24    [21924327]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 552
ferzmikk,
именно потому что у vba нет соответствующих возможностей вы и создаете объект
CreateObject("MSXML2.XMLHTTP")
и пользуетесь его свойствами и методами.
10 июл 19, 22:27    [21924442]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
ferzmikk
Member

Откуда:
Сообщений: 1886
Объект "MSXML2.XMLHTTP" относится к JavaScript?
10 июл 19, 23:11    [21924455]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20656
ferzmikk
Объект "MSXML2.XMLHTTP" относится к JavaScript?
нет


на форуме полно примеров, которые легко находятся по словам MSXML2.XMLHTTP
11 июл 19, 00:06    [21924464]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
court
Member

Откуда:
Сообщений: 1804
ferzmikk
1. Для выгрузки данных какой лучше использовать объект: CreateObject("MSXML2.XMLHTTP") или CreateObject("Microsoft.XMLHTTP")? Или лучше использовать какой то другой объект?

Экселем парси, - "дешево и сердито"
11 июл 19, 12:55    [21924807]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
ferzmikk
Member

Откуда:
Сообщений: 1886
iMrTidy
3. Что значит "список разделен на страницы"? Посмотрите как выглядит html и, исходя из этого, парсите.

Первая страница http://aaaaa.ru/bbbbb/
Вторая страница http://ааааа.ru/bbbbb/?page=2

Как определить всего таких страниц?
11 июл 19, 20:56    [21925249]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
ferzmikk
Member

Откуда:
Сообщений: 1886
В VBA использую объекты InternetExplorer и HTMLDocument. В объекте пока не нахожу метода, который определяет количество всего таких страниц.
11 июл 19, 21:33    [21925262]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
ferzmikk
Member

Откуда:
Сообщений: 1886
В коде страницы это количество находится здесь
<span class="dots">...</span> <a href="/aaaaa/?page=15000">15000</a>

Я правильно понимаю, что надо вытаскивать после page= и ">?
11 июл 19, 21:34    [21925263]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
iMrTidy
Member

Откуда:
Сообщений: 773
ferzmikk,

Судя по вопросам, Вам для начала стоит подтянуть знания про HTML и протокол HTTP(S). И даже, возможно, написать Hello World веб-страничку.
12 июл 19, 03:14    [21925368]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
court
Member

Откуда:
Сообщений: 1804
iMrTidy
подтянуть знания про HTML и протокол HTTP(S)
бгггы ! Картинка с другого сайта.
а чё не сразу TCP/IP какое-нибудь ? :)
ТСу нужно распарсить какую-то несчастную страничку, а ты его сразу посылаешь "куда по дальше" "протоколы учить" :)

-------------------------------------------

ТС,

разбирать HTML DOM - дело предельно неблагодарное !
Редко когда повезёт, и DOM будет валидным XML-ем и его можно загрузить XMLDOMDocument и разобрать "по-человечески" каким-нибудь XPath-ем :)
Разве что это будет сайт в строгом соответствии стандарту HTML5 (?)

В лучшем случае, это "выкусить" строковыми функциями требуемый "кусок" DOM-а, который будет валидным, и разбирать его в XMLDOMDocument-е

По этому, ещё раз, может не дошло сразу: попробуй открыть свою ссылку в Экселе (Файл-Открыть-заряжаешь свою ссылку на страницу-"Открыть") и посмотреть на результат.
"Бегать" по ячейкам, всё-таки, на порядок проще, чем парсить строковыми функциями "кривой" DOM
12 июл 19, 09:44    [21925454]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
ferzmikk
Member

Откуда:
Сообщений: 1886
court
попробуй открыть свою ссылку в Экселе (Файл-Открыть-заряжаешь свою ссылку на страницу-"Открыть") и посмотреть на результат.
"Бегать" по ячейкам, всё-таки, на порядок проще, чем парсить строковыми функциями "кривой" DOM

Открывает долго. Вывелось по ячейкам.
12 июл 19, 13:56    [21925725]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
court
Member

Откуда:
Сообщений: 1804
ferzmikk
Открывает долго.
не дольше чем полная загрузка в ИЕ
ferzmikk
Вывелось по ячейкам.
Ну ? Дальше алгоритм понятен ?
1. Ходишь по нужным ячейкам - собираешь лут нужные данные, сохраняешь нужные данные
2. Ходишь по другим нужным ячейкам - собираешь ссылки ("В каждой строке в определенной колонке есть ссылка")
3. Ходишь по собранным ссылкам и повторяешь пп.1,2
4. ...
5. PROFIT

Всё это, разумеется, программно, через автоматизацию Экселя
12 июл 19, 14:23    [21925741]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
ferzmikk
Member

Откуда:
Сообщений: 1886
court
Ну ? Дальше алгоритм понятен ?
1. Ходишь по нужным ячейкам - собираешь лут нужные данные, сохраняешь нужные данные
2. Ходишь по другим нужным ячейкам - собираешь ссылки ("В каждой строке в определенной колонке есть ссылка")
3. Ходишь по собранным ссылкам и повторяешь пп.1,2
4. ...
5. PROFIT

Всё это, разумеется, программно, через автоматизацию Экселя

Сама идея понятна. Как вариант. Учитывая, что нужная ячейка имеет свою координату (например, заголовок таблицы, название первого столбца таблицы, значение первой строки первой колонки таблицы и т.д.) и после обновления могут быть сдвиги. В качестве ориентира тогда нужно брать, например заголовок колонки и последующие шаги по строкам. В ячейках (значения строк таблицы) присутствуют перенос строк и выводит несколько ячеек, а остальные ячейки объединяются. Поэтому такой момент надо учитывать.
12 июл 19, 14:44    [21925768]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
ferzmikk
Member

Откуда:
Сообщений: 1886
Есть такой фрагмент работающего кода.
Dim IE As Object, Html As Object
Set IE = CreateObject("InternetExplorer.Application")
Set Html = IE.Document
'Вытаскиваем таблицу
Html.querySelectorAll("table tr")
'Вытаскиваем столбцы строки N
Html.querySelectorAll("table tr").Item(N).querySelectorAll("th,td")
'Вытаскиваем значения каждого столбца строки N
Html.querySelectorAll("table tr").Item(N).querySelectorAll("th,td").Item(I).innertext

Если вместо объекта "InternetExplorer.Application" использовать объект "MSXML2.XMLHTTP", то пишем такой код
Set XMLHTTP = CreateObject("MSXML2.XMLHTTP")
Set Html = CreateObject("htmlFile")
XMLHTTP.Open "GET", URL, False
XMLHTTP.SEND
If XMLHTTP.Status = 200 Then
    Html.body.innerHTML = XMLHTTP.responseText
    Html.querySelectorAll("table tr")    'Здесь возникает ошибка

Выдает ошибку "Object doesn't support this property or method".

Как из объекта "MSXML2.XMLHTTP" вытащить Document, чтобы присвоить переменной Html?
12 июл 19, 16:07    [21925868]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
Konst_One
Member

Откуда:
Сообщений: 11487
XMLHTTP.responseText

вы его смотрели?
12 июл 19, 16:40    [21925919]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
ferzmikk
Member

Откуда:
Сообщений: 1886
Konst_One
XMLHTTP.responseText

вы его смотрели?

Если Вы про возвращаемые типы, то у обоих объектов Html.body.innerHTML и XMLHTTP.responseText возвращаемый тип Variant/String.

Если Вы про возвращаемое значение XMLHTTP.responseText
<!DOCTYPE html>
<html         lang="ru">
<head>
<link rel="stylesheet" type="text/css" href="/media/aaaaa/css/font-awesome.min.css">
<link type="text/css" href="/media/aaaaa/lib/jquery-ui/jquery-ui.css" rel="stylesheet">
<link type="text/css" href="/media/aaaaa/lib/swiper/swiper.css" rel="stylesheet">
<meta charset="windows-1251">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Заголовк</title>
...
12 июл 19, 17:35    [21925962]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
court
Member

Откуда:
Сообщений: 1804
ferzmikk
    Html.body.innerHTML = XMLHTTP.responseText
    Html.querySelectorAll("table tr")    'Здесь возникает ошибка


что-то типа
Html.write XMLHTTP.responseText

должно быть
12 июл 19, 17:36    [21925963]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
ferzmikk
Member

Откуда:
Сообщений: 1886
court
что-то типа
Html.write XMLHTTP.responseText

должно быть
'Html.body.innerHTML = XMLHTTP.responseText
Html.write XMLHTTP.responseText
Html.querySelectorAll("table tr")    'Выдает диалоговое окно. Если нажать на "Да" или "Нет", то потом возникает та же ошибка.


К сообщению приложен файл. Размер - 21Kb
12 июл 19, 18:47    [21926000]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5211
ferzmikk,

а я бы php взял, удобнее гораздо
12 июл 19, 20:09    [21926030]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
ferzmikk
Member

Откуда:
Сообщений: 1886
kealon(Ruslan)
ferzmikk,

а я бы php взял, удобнее гораздо

php не знаю. Пока использую VBA
12 июл 19, 20:32    [21926035]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5211
ferzmikk,

там очень удобный и достаточно надёжный преобразователь html в xml

        $c = file_get_contents($url);
        $doc = new DOMDocument();
        $doc->loadHTML($c);

ну а дальше довольно тривиально ищется что нужно

$doc->getElementsByTagName('a');
13 июл 19, 00:18    [21926076]     Ответить | Цитировать Сообщить модератору
 Re: VBA и WEB  [new]
ferzmikk
Member

Откуда:
Сообщений: 1886
ferzmikk
'Html.body.innerHTML = XMLHTTP.responseText
Html.write XMLHTTP.responseText
Html.querySelectorAll("table tr")    'Выдает диалоговое окно. Если нажать на "Да" или "Нет", то потом возникает та же ошибка.

Почему отображается такое диалоговое окно и почему показывает ошибку? Как правильно написать?
13 июл 19, 01:22    [21926084]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7   вперед  Ctrl      все
Все форумы / Microsoft Office Ответить