powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / VBA и WEB
25 сообщений из 169, страница 1 из 7
VBA и WEB
    #39835679
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

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

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

Есть вопросы. Скажите,
1. Для выгрузки данных какой лучше использовать объект: CreateObject("MSXML2.XMLHTTP") или CreateObject("Microsoft.XMLHTTP")? Или лучше использовать какой то другой объект?
2. Как выдергивать список? Только через полученный исходный код как текст, и потом через цикл и как то по тегам выдергивать элементы? Или есть специальная команда для выдергивании списков?
3. Если список разделен на страницы, то получится выгрузить сразу все страницы? Или только по странично? Если выгружать по странично, то важно учесть, что может быть такое, что какой то элемент списка в какой то момент времени может удалиться, добавиться или переместиться. Возможно ли это учесть?
...
Рейтинг: 0 / 0
VBA и WEB
    #39835740
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

1. Говорят, что MSXML2 более новый namespace, и вроде рекомендуют его.
2. Для кролинга/скрапинга лучше воспользоваться HTMLDocument, и далее при помощи его функционала выдергивать, что нужно. Не помню, но возможно, там даже есть XPath, что существенно облегчит жизнь.
3. Что значит "список разделен на страницы"? Посмотрите как выглядит html и, исходя из этого, парсите.
...
Рейтинг: 0 / 0
VBA и WEB
    #39835745
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidyferzmikk,

1. Говорят, что MSXML2 более новый namespace, и вроде рекомендуют его.Файлы скачивает?
...
Рейтинг: 0 / 0
VBA и WEB
    #39836046
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidy2. Для кролинга/скрапинга лучше воспользоватьсяHTMLDocument, и далее при помощи его функционала выдергивать, что нужно. Не помню, но возможно, там даже есть XPath, что существенно облегчит жизнь.Возникает вопрос как это все реализовывать в VBA. В интернете мало инфо на эту тему.
...
Рейтинг: 0 / 0
VBA и WEB
    #39836114
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,
именно потому что у vba нет соответствующих возможностей вы и создаете объект
CreateObject("MSXML2.XMLHTTP")
и пользуетесь его свойствами и методами.
...
Рейтинг: 0 / 0
VBA и WEB
    #39836122
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объект "MSXML2.XMLHTTP" относится к JavaScript?
...
Рейтинг: 0 / 0
VBA и WEB
    #39836128
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkОбъект "MSXML2.XMLHTTP" относится к JavaScript?нет


на форуме полно примеров, которые легко находятся по словам MSXML2.XMLHTTP
...
Рейтинг: 0 / 0
VBA и WEB
    #39836315
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk1. Для выгрузки данных какой лучше использовать объект: CreateObject("MSXML2.XMLHTTP") или CreateObject("Microsoft.XMLHTTP")? Или лучше использовать какой то другой объект?
Экселем парси, - "дешево и сердито"
...
Рейтинг: 0 / 0
VBA и WEB
    #39836571
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidy3. Что значит "список разделен на страницы"? Посмотрите как выглядит html и, исходя из этого, парсите.
Первая страница http://aaaaa.ru/bbbbb/
Вторая страница http://ааааа.ru/bbbbb/?page=2

Как определить всего таких страниц?
...
Рейтинг: 0 / 0
VBA и WEB
    #39836579
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В VBA использую объекты InternetExplorer и HTMLDocument . В объекте пока не нахожу метода, который определяет количество всего таких страниц.
...
Рейтинг: 0 / 0
VBA и WEB
    #39836580
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В коде страницы это количество находится здесь
<span class="dots">...</span> <a href="/aaaaa/?page=15000">15000</a>

Я правильно понимаю, что надо вытаскивать после page= и "> ?
...
Рейтинг: 0 / 0
VBA и WEB
    #39836625
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

Судя по вопросам, Вам для начала стоит подтянуть знания про HTML и протокол HTTP(S). И даже, возможно, написать Hello World веб-страничку.
...
Рейтинг: 0 / 0
VBA и WEB
    #39836672
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidyподтянуть знания про HTML и протокол HTTP(S)бгггы !

а чё не сразу TCP/IP какое-нибудь ? :)
ТСу нужно распарсить какую-то несчастную страничку, а ты его сразу посылаешь "куда по дальше" "протоколы учить" :)

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

ТС,

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

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

По этому, ещё раз, может не дошло сразу: попробуй открыть свою ссылку в Экселе (Файл-Открыть-заряжаешь свою ссылку на страницу-"Открыть") и посмотреть на результат.
"Бегать" по ячейкам, всё-таки, на порядок проще, чем парсить строковыми функциями "кривой" DOM
...
Рейтинг: 0 / 0
VBA и WEB
    #39836839
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
courtпопробуй открыть свою ссылку в Экселе (Файл-Открыть-заряжаешь свою ссылку на страницу-"Открыть") и посмотреть на результат.
"Бегать" по ячейкам, всё-таки, на порядок проще, чем парсить строковыми функциями "кривой" DOM
Открывает долго. Вывелось по ячейкам.
...
Рейтинг: 0 / 0
VBA и WEB
    #39836850
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkОткрывает долго.не дольше чем полная загрузка в ИЕ
ferzmikkВывелось по ячейкам.Ну ? Дальше алгоритм понятен ?
1. Ходишь по нужным ячейкам - собираешь лут нужные данные, сохраняешь нужные данные
2. Ходишь по другим нужным ячейкам - собираешь ссылки ("В каждой строке в определенной колонке есть ссылка")
3. Ходишь по собранным ссылкам и повторяешь пп.1,2
4. ...
5. PROFIT

Всё это, разумеется, программно, через автоматизацию Экселя
...
Рейтинг: 0 / 0
VBA и WEB
    #39836868
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
courtНу ? Дальше алгоритм понятен ?
1. Ходишь по нужным ячейкам - собираешь лут нужные данные, сохраняешь нужные данные
2. Ходишь по другим нужным ячейкам - собираешь ссылки ("В каждой строке в определенной колонке есть ссылка")
3. Ходишь по собранным ссылкам и повторяешь пп.1,2
4. ...
5. PROFIT

Всё это, разумеется, программно, через автоматизацию Экселя
Сама идея понятна. Как вариант. Учитывая, что нужная ячейка имеет свою координату (например, заголовок таблицы, название первого столбца таблицы, значение первой строки первой колонки таблицы и т.д.) и после обновления могут быть сдвиги. В качестве ориентира тогда нужно брать, например заголовок колонки и последующие шаги по строкам. В ячейках (значения строк таблицы) присутствуют перенос строк и выводит несколько ячеек, а остальные ячейки объединяются. Поэтому такой момент надо учитывать.
...
Рейтинг: 0 / 0
VBA и WEB
    #39836905
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой фрагмент работающего кода.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
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", то пишем такой код
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
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?
...
Рейтинг: 0 / 0
VBA и WEB
    #39836938
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLHTTP.responseText

вы его смотрели?
...
Рейтинг: 0 / 0
VBA и WEB
    #39836970
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One XMLHTTP.responseText

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

Если Вы про возвращаемое значение XMLHTTP.responseText
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<!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>
...
...
Рейтинг: 0 / 0
VBA и WEB
    #39836971
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
Код: vbnet
1.
2.
    Html.body.innerHTML = XMLHTTP.responseText
    Html.querySelectorAll("table tr")    'Здесь возникает ошибка



что-то типа
Код: vbnet
1.
Html.write XMLHTTP.responseText


должно быть
...
Рейтинг: 0 / 0
VBA и WEB
    #39836993
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
courtчто-то типа
Код: vbnet
1.
Html.write XMLHTTP.responseText


должно быть
Код: vbnet
1.
2.
3.
'Html.body.innerHTML = XMLHTTP.responseText
Html.write XMLHTTP.responseText
Html.querySelectorAll("table tr")    'Выдает диалоговое окно. Если нажать на "Да" или "Нет", то потом возникает та же ошибка.
...
Рейтинг: 0 / 0
VBA и WEB
    #39837005
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

а я бы php взял, удобнее гораздо
...
Рейтинг: 0 / 0
VBA и WEB
    #39837007
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)ferzmikk,

а я бы php взял, удобнее гораздо
php не знаю. Пока использую VBA
...
Рейтинг: 0 / 0
VBA и WEB
    #39837032
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

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

Код: php
1.
2.
3.
        $c = file_get_contents($url);
        $doc = new DOMDocument();
        $doc->loadHTML($c);


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

Код: php
1.
$doc->getElementsByTagName('a');
...
Рейтинг: 0 / 0
VBA и WEB
    #39837039
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
Код: vbnet
1.
2.
3.
'Html.body.innerHTML = XMLHTTP.responseText
Html.write XMLHTTP.responseText
Html.querySelectorAll("table tr")    'Выдает диалоговое окно. Если нажать на "Да" или "Нет", то потом возникает та же ошибка.


Почему отображается такое диалоговое окно и почему показывает ошибку? Как правильно написать?
...
Рейтинг: 0 / 0
25 сообщений из 169, страница 1 из 7
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / VBA и WEB
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]