Страницы: 1
RSS
Получение данных из таблицы на сайте в интернете, Получение многостраничных данных
 
Добрый день уважаемые!

Есть некий сайт, с которого необходимо периодически «выдергивать таблицу», сам запрос я сделал через «Данные»-«Получить внешние данные из вэба», но дело в том, что сайт выдает не более 30 позиций на страницу, а потом необходимо сменить страницу, при этом запрос изменится с
index.php?action_mlist_sort_registered_start_0_desc
на
index.php?action_mlist_sort_registered_start_30_desc
потом
index.php?action_mlist_sort_registered_start_60_desc и так далее…
как можно выдернуть всю таблицу? вручную не вариант все запросы делать, т.к. таблица постоянно увеличивается и на сегодня там уже 1792 страницы по 30 записей…
Изменено: edkudin - 20.05.2019 07:30:51
 
ну если нет возможности получить все данные одним махом, то макросом менять в цикле строку запроса (Сonnection), только вот не понятно как определить последнюю страницу.
По вопросам из тем форума, личку не читаю.
 
На самом сайте есть информация какая страница последняя, как вариант можно сначала в браузере открывать эту страницу, смотреть какая страница на текущий момент последняя, вручную вносить это число в ячейку документа и потом запускать макрос с циклом от 0 до этой страницы.
А вот как сам запрос прописать в макрос?
макрорекордером что-то ужасное получилось: (имя сайта я специально изменил)
Код
Sub запрос()
    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;http://www.qqq.qq/SMF/index.php?action=mlist;sort=registered;start=0;desc" _
        , Destination:=Range("$A$1"))
        .Name = "index.php?action=mlist;sort=registered;start=0;desc"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlSpecifiedTables
        .WebFormatting = xlWebFormattingNone
        .WebTables = "3"
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With
End Sub
Изменено: edkudin - 20.05.2019 12:12:05
 
Цитата
edkudin написал:
можно сначала в браузере открывать эту страницу,
а потом, как вариант, руками скопировать нужные данные... и все готово!

никто Вам не подскажет как взять данные с некоего сайта, пока не узнает адрес этого некоего сайта, не поймет как оттуда взять нужные данные руками и только после этого сможет написать макрос, который сможет делать это автоматически
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Увы но дать такую информацию я не могу, сайт узкоспецифичный, вход по логин\пароль и передавать его я не имею права.
Вы лучше помогите советом в сторону каких команд мне смотреть и как мне пусть даже такой дурацкий запрос как выше "засунуть в цикл", что-бы каждый последующий запрос добавлял данные к таблице на листе а не затирал их.
 
Сделали Query руками на промежуточном листе, можно и макросом, это на любителя, я сторонник меньше кода, больше встроенных инструментов.
QueryTables.BackgroundQuery=False - запретили фоновой обновление. это можно делать и прямо в интерфейсе.
Если можно посмтреть количество листов то QueryTables.connection =  URL где это количество
QueryTables.Refresh - перезапросили информацию
Посмотрели в нужной ячейке это количество и цикл
QueryTables.connection - менять в цикле "index.php?action_mlist_sort_registered_start_0_desc" на то что нужно
QueryTables.Refresh - перезапросили информацию
далее скпировали то что получили
QueryTables.ResultRange в итоговый лист и повторили цикл иначе никак.
можно наверно пошаманить с Destination, но стоит ли?
Изменено: БМВ - 20.05.2019 12:44:08
По вопросам из тем форума, личку не читаю.
 
Спасибо, я сейчас как раз"с циклами играюсь", вопрос а как можно в макросе циклически с step=30 менять числовое значение в строке
index.php?action_mlist_sort_registered_start_0_desc
на
index.php?action_mlist_sort_registered_start_30_desc
потом
index.php?action_mlist_sort_registered_start_60_desc и так далее
 
Цитата
edkudin написал:
и так далее
в макросах не разбираюсь вообще, но может быть так?
Код
Sub dddd()
    
   For i = 0 To 500 Step 30
    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;http://www.qqq.qq/SMF/index.php?action=mlist;sort=registered;start=" & i & ";desc" _
        , Destination:=Range("$A$1"))
        .Name = "index.php?action=mlist;sort=registered;start=0;desc"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlSpecifiedTables
        .WebFormatting = xlWebFormattingNone
        .WebTables = "3"
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With
   Next i

End Sub
Изменено: artyrH - 20.05.2019 13:41:48
 
artyrH, c циклом да, все так, а вот внутри
Код
QueryTables.Add(Connection:= _
        "URL;http://www.qqq.qq/SMF/index.php?action=mlist;sort=registered;start=" & i & ";desc" _
        , Destination:=Range("$A$1"))

Тут получится что каждый раз добавляем Еще один новый запрос, что плохо. Как уже писал, лучше до цикла создать запрос а в цикле менять Connection типа так,
Код
 QueryTables(1).Connection= _
        "URL;http://www.qqq.qq/SMF/index.php?action=mlist;sort=registered;start=" & i & ";desc" 
По вопросам из тем форума, личку не читаю.
 
Запрос сделал, не могу понять почему если раскомментировать запрет обновления экрана то таблица остается пустой, а с "апострофами" всё работает как надо.
Код
Sub запрос()
'Application.ScreenUpdating = False
 Dim j As Integer, i As Integer
 i = Range("C1")
 For j = 0 To i Step 30
    With ActiveSheet.QueryTables.Add(Connection:="URL;http://www.qqq.qq/SMF/index.php?action=mlist;sort=registered;start=" & j & ";desc", Destination:=Cells(2, 1))
        .Name = ""
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlSpecifiedTables
        .WebFormatting = xlWebFormattingNone
        .WebTables = "3"
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With
    Sheets("Лист1").Select: Range("A3:K32").Select: Selection.Copy: Sheets("Лист2").Select
      endLastRow = Columns("B:K").Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
      Range(Cells(endLastRow + 1, 1), Cells(endLastRow + 1, 4)).Select: ActiveSheet.Paste
        Sheets("Лист1").Select
        Rows("2:32").Select
        Selection.QueryTable.Delete
        Selection.ClearContents
        Range("A2").Select
   Next j
   'Application.ScreenUpdating = True
End Sub
 
Цитата
БМВ написал:
новый запрос, что плохо. Как уже писал, лучше до цикла создать запрос а в цикле менять Connection
пока тяжело...
не въеду...
 
edkudin, Если удалять каждый раз то ок, но без лишней дергатни
Код
Sub запрос()
Application.ScreenUpdating = False
 Dim j As Integer, i As Integer
 i = Range("C1")
 'Set qt = ActiveSheet.QueryTables.Add(Connection:="URL;http://www.qqq.qq/SMF/index.php?action=mlist;sort=registered;start=" & j & ";desc", Destination:=Cells(2, 1))
  Set qt = ActiveSheet.QueryTables.Add(Connection:="URL;https://yandex.ru", Destination:=Cells(2, 1))
 With qt
        .Name = "Query1"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlEntirePage
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
    End With

 For j = 0 To i Step 30
'        qt.Connection = "URL;http://www.qqq.qq/SMF/index.php?action=mlist;sort=registered;start=" & j & ";desc"
        qt.Connection = "URL;https://yandex.ru"
        qt.Refresh
    With Sheets("Лист2")
      endLastRow = Sheets("Лист2").Columns("B:K").Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
      .Range(.Cells(endLastRow + 1, 1), .Cells(endLastRow + 1, 4)).Resize(30, 11).Value = Range("A3:K32").Value
    End With
   Next j
   qt.ResultRange.Delete
   ThisWorkbook.Connections(1).Delete
   Application.ScreenUpdating = True
End Sub
 
По вопросам из тем форума, личку не читаю.
 
БМВ прикольно ваш код работает, он почему-то не одну из таблиц (нужную) выдергивает, а вообще всё что есть на этой вэб-странице, начиная с левого верхнего угла с записи " На портал" до самых нижних "мелких строчек "SMF 2.0.15 | SMF © 2011, Simple Machines | SimplePortal 2.3.3 © 2008-2010, SimplePortal Страница сгенерирована за 0.043 секунд. Запросов: 22."
Почему так? не знаете?
естесственно на второй лист он не те строки переносит, но я это поправлю...
И мой вопрос остался открытым- если использую "Application.ScreenUpdating = False/True" то всё пусто, если их нет то всё ОК
 
edkudin, был бы полноценный пример, можно б было посмотреть и даже автоматезировать извлечение этого количества страниц, а так, при условии отсутствия доступа к ресурсу …...
По вопросам из тем форума, личку не читаю.
 
вопрос решился, правда когда 1700 страниц тянул я успел пива с рыбкой "упиться" но данные вытянул, удалил параметр "desc"" в "php?action=mlist;sort=registered;start=0;desc"" и теперь сортировка таблицы идет не с "конца в начало" а с "начала в конец" и теперь нужно будет просто периодически выдергивать 1-2 последние странички и смотреть что изменилось, а само "тело" остаётся без изменений.
Всем спасибо!
Страницы: 1
Наверх