Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft Office |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7 вперед Ctrl→ все |
ferzmikk Member Откуда: Сообщений: 2188 |
Здравствуйте! Есть задача: написать макрос, который автоматизирует выгрузку данных из сайта. Особенности: - Выгружает основной список с колонками. В каждой строке в определенной колонке есть ссылка - Если зайти на эту ссылку, то выходим на новую страницу этого же элемента: на таблицу со всеми свойствами. В другой закладке этой же страницы элемента есть дочерний список. Есть ссылка для скачивание файла. - Основной список разделен на страницы, присутствует фильтрация. Есть вопросы. Скажите, 1. Для выгрузки данных какой лучше использовать объект: CreateObject("MSXML2.XMLHTTP") или CreateObject("Microsoft.XMLHTTP")? Или лучше использовать какой то другой объект? 2. Как выдергивать список? Только через полученный исходный код как текст, и потом через цикл и как то по тегам выдергивать элементы? Или есть специальная команда для выдергивании списков? 3. Если список разделен на страницы, то получится выгрузить сразу все страницы? Или только по странично? Если выгружать по странично, то важно учесть, что может быть такое, что какой то элемент списка в какой то момент времени может удалиться, добавиться или переместиться. Возможно ли это учесть? |
9 июл 19, 19:46 [21923763] Ответить | Цитировать Сообщить модератору |
iMrTidy Member Откуда: Сообщений: 775 |
ferzmikk, 1. Говорят, что MSXML2 более новый namespace, и вроде рекомендуют его. 2. Для кролинга/скрапинга лучше воспользоваться HTMLDocument, и далее при помощи его функционала выдергивать, что нужно. Не помню, но возможно, там даже есть XPath, что существенно облегчит жизнь. 3. Что значит "список разделен на страницы"? Посмотрите как выглядит html и, исходя из этого, парсите. |
9 июл 19, 23:22 [21923858] Ответить | Цитировать Сообщить модератору |
ferzmikk Member Откуда: Сообщений: 2188 |
|
||
10 июл 19, 00:09 [21923866] Ответить | Цитировать Сообщить модератору |
ferzmikk Member Откуда: Сообщений: 2188 |
|
||
10 июл 19, 17:24 [21924327] Ответить | Цитировать Сообщить модератору |
alecko Member Откуда: Башкирия Сообщений: 778 |
ferzmikk, именно потому что у vba нет соответствующих возможностей вы и создаете объект CreateObject("MSXML2.XMLHTTP") и пользуетесь его свойствами и методами. |
10 июл 19, 22:27 [21924442] Ответить | Цитировать Сообщить модератору |
ferzmikk Member Откуда: Сообщений: 2188 |
Объект "MSXML2.XMLHTTP" относится к JavaScript? |
10 июл 19, 23:11 [21924455] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22202 |
на форуме полно примеров, которые легко находятся по словам MSXML2.XMLHTTP |
||
11 июл 19, 00:06 [21924464] Ответить | Цитировать Сообщить модератору |
court Member Откуда: Сообщений: 2241 |
Экселем парси, - "дешево и сердито" |
||
11 июл 19, 12:55 [21924807] Ответить | Цитировать Сообщить модератору |
ferzmikk Member Откуда: Сообщений: 2188 |
Первая страница http://aaaaa.ru/bbbbb/ Вторая страница http://ааааа.ru/bbbbb/?page=2 Как определить всего таких страниц? |
||
11 июл 19, 20:56 [21925249] Ответить | Цитировать Сообщить модератору |
ferzmikk Member Откуда: Сообщений: 2188 |
В VBA использую объекты InternetExplorer и HTMLDocument. В объекте пока не нахожу метода, который определяет количество всего таких страниц. |
11 июл 19, 21:33 [21925262] Ответить | Цитировать Сообщить модератору |
ferzmikk Member Откуда: Сообщений: 2188 |
В коде страницы это количество находится здесь <span class="dots">...</span> <a href="/aaaaa/?page=15000">15000</a> Я правильно понимаю, что надо вытаскивать после page= и ">? |
11 июл 19, 21:34 [21925263] Ответить | Цитировать Сообщить модератору |
iMrTidy Member Откуда: Сообщений: 775 |
ferzmikk, Судя по вопросам, Вам для начала стоит подтянуть знания про HTML и протокол HTTP(S). И даже, возможно, написать Hello World веб-страничку. |
12 июл 19, 03:14 [21925368] Ответить | Цитировать Сообщить модератору |
court Member Откуда: Сообщений: 2241 |
![]() а чё не сразу TCP/IP какое-нибудь ? :) ТСу нужно распарсить какую-то несчастную страничку, а ты его сразу посылаешь ------------------------------------------- ТС, разбирать HTML DOM - дело предельно неблагодарное ! Редко когда повезёт, и DOM будет валидным XML-ем и его можно загрузить XMLDOMDocument и разобрать "по-человечески" каким-нибудь XPath-ем :) Разве что это будет сайт в строгом соответствии стандарту HTML5 (?) В лучшем случае, это "выкусить" строковыми функциями требуемый "кусок" DOM-а, который будет валидным, и разбирать его в XMLDOMDocument-е По этому, ещё раз, может не дошло сразу: попробуй открыть свою ссылку в Экселе (Файл-Открыть-заряжаешь свою ссылку на страницу-"Открыть") и посмотреть на результат. "Бегать" по ячейкам, всё-таки, на порядок проще, чем парсить строковыми функциями "кривой" DOM |
||
12 июл 19, 09:44 [21925454] Ответить | Цитировать Сообщить модератору |
ferzmikk Member Откуда: Сообщений: 2188 |
Открывает долго. Вывелось по ячейкам. |
||
12 июл 19, 13:56 [21925725] Ответить | Цитировать Сообщить модератору |
court Member Откуда: Сообщений: 2241 |
1. Ходишь по нужным ячейкам - собираешь 2. Ходишь по другим нужным ячейкам - собираешь ссылки ("В каждой строке в определенной колонке есть ссылка") 3. Ходишь по собранным ссылкам и повторяешь пп.1,2 4. ... 5. PROFIT Всё это, разумеется, программно, через автоматизацию Экселя |
||||
12 июл 19, 14:23 [21925741] Ответить | Цитировать Сообщить модератору |
ferzmikk Member Откуда: Сообщений: 2188 |
Сама идея понятна. Как вариант. Учитывая, что нужная ячейка имеет свою координату (например, заголовок таблицы, название первого столбца таблицы, значение первой строки первой колонки таблицы и т.д.) и после обновления могут быть сдвиги. В качестве ориентира тогда нужно брать, например заголовок колонки и последующие шаги по строкам. В ячейках (значения строк таблицы) присутствуют перенос строк и выводит несколько ячеек, а остальные ячейки объединяются. Поэтому такой момент надо учитывать. |
||
12 июл 19, 14:44 [21925768] Ответить | Цитировать Сообщить модератору |
ferzmikk Member Откуда: Сообщений: 2188 |
Есть такой фрагмент работающего кода.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] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11562 |
XMLHTTP.responseText вы его смотрели? |
12 июл 19, 16:40 [21925919] Ответить | Цитировать Сообщить модератору |
ferzmikk Member Откуда: Сообщений: 2188 |
Если Вы про возвращаемые типы, то у обоих объектов 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] Ответить | Цитировать Сообщить модератору |
court Member Откуда: Сообщений: 2241 |
что-то типа Html.write XMLHTTP.responseText должно быть |
||
12 июл 19, 17:36 [21925963] Ответить | Цитировать Сообщить модератору |
ferzmikk Member Откуда: Сообщений: 2188 |
'Html.body.innerHTML = XMLHTTP.responseText Html.write XMLHTTP.responseText Html.querySelectorAll("table tr") 'Выдает диалоговое окно. Если нажать на "Да" или "Нет", то потом возникает та же ошибка. К сообщению приложен файл. Размер - 21Kb |
||
12 июл 19, 18:47 [21926000] Ответить | Цитировать Сообщить модератору |
kealon(Ruslan) Member Откуда: Нижневартовск Сообщений: 6255 |
ferzmikk, а я бы php взял, удобнее гораздо |
12 июл 19, 20:09 [21926030] Ответить | Цитировать Сообщить модератору |
ferzmikk Member Откуда: Сообщений: 2188 |
php не знаю. Пока использую VBA |
||
12 июл 19, 20:32 [21926035] Ответить | Цитировать Сообщить модератору |
kealon(Ruslan) Member Откуда: Нижневартовск Сообщений: 6255 |
ferzmikk, там очень удобный и достаточно надёжный преобразователь html в xml $c = file_get_contents($url); $doc = new DOMDocument(); $doc->loadHTML($c); ну а дальше довольно тривиально ищется что нужно $doc->getElementsByTagName('a'); |
13 июл 19, 00:18 [21926076] Ответить | Цитировать Сообщить модератору |
ferzmikk Member Откуда: Сообщений: 2188 |
Почему отображается такое диалоговое окно и почему показывает ошибку? Как правильно написать? |
||
13 июл 19, 01:22 [21926084] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7 вперед Ctrl→ все |
Все форумы / Microsoft Office | ![]() |