Вопрос или проблема
Я вручную зашел на веб-страницу wantrich.chinatimes.com/tw-market/listed/stock/3167, и график загружается полностью без каких-либо проблем. Однако, когда я использую Selenium для доступа к той же странице, график не виден и показывает “undefined”.
динамический график отображает undefined
обновление: На сайте есть ограничения на selenium. Как их обойти??
Dim Mychorme As Selenium.ChromeDriver
Sub Take_ScreenShot_Entirepage_Cropped()
Dim wdh As Integer
Dim hght As Integer
Dim topOffset As Integer
Dim bottomOffset As Integer
Dim filePath As String
topOffset = 500 '
bottomOffset = 500 '
filePath = ThisWorkbook.Path
Set Mychorme = New Selenium.ChromeDriver
With Mychorme
.Timeouts.ImplicitWait = 5000
.Start
.Get "https://wantrich.chinatimes.com/tw-market/listed/stock/3167"
wdh = .ExecuteScript("return document.body.scrollWidth")
hght = .ExecuteScript("return document.body.scrollHeight")
.Window.SetSize wdh, hght - topOffset - bottomOffset
.ExecuteScript "window.scrollTo(0, " & topOffset & ");"
Application.Wait (Now + TimeValue("0:00:03"))
.TakeScreenshot.SaveAs filePath & "\screenCapture_Entirepage_Cropped.png"
.Quit
End With
End Sub
Ответ или решение
Решение проблемы с отсутствием графика в Selenium для VBA
Когда вы сталкиваетесь с ситуацией, когда график, отображаемый на веб-странице, не загружается и вместо этого показывает "undefined" при использовании Selenium в VBA, это может быть обусловлено несколькими причинами. В данной статье мы рассмотрим возможные пути решения данной проблемы, а также методы обхода ограничений, установленных на веб-странице.
1. Суть проблемы
При открытии страницы вручную график загружается корректно. Однако, при использовании Selenium для автоматизации, возникают трудности, и график не отображается должным образом. Это может быть связано с особой реализацией JavaScript на сайте, которая определяет, как и когда графики загружаются.
Общие причины:
- Динамическая загрузка: График может подгружаться асинхронно и требует времени для инициализации, что может быть пропущено в автоматическом сценарии.
- Блокировка Selenium: Некоторые веб-сайты имеют механизмы для детекции автоматизированных инструментов и могут блокировать их доступ или модифицировать контент.
2. Как обойти ограничения при использовании Selenium
Улучшение скрипта
- Увеличьте время ожидания:
Убедитесь, что вы даете достаточно времени для полной загрузки всех компонентов страницы. Рассмотрите возможность использованияExplicit Wait
, чтобы ожидать появления конкретного элемента на странице.
Dim Wait As Selenium.Wait
Set Wait = Mychorme.Wait
Wait.ForElementByCss(".class_of_chart_element", 10000) ' Укажите ожидаемый селектор графика
- Обновите пользовательский агент:
Замените пользовательский агент браузера на более обычный, чтобы сайт не распознал вас как бот.
Mychorme.AddArgument "--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
- Используйте JavaScript для инициирования графика:
Некоторые графики могут требовать вызов определенных функций для их отрисовки. Можно использоватьExecuteScript
для инициализации графика, если известна функция.
Mychorme.ExecuteScript "initializeChart();" ' замените на фактическую функцию
3. Работа с динамической загрузкой
Поскольку страницы могут загружать контент с задержкой, стоит обдумать использование Sleep
или ожидание загрузки определенных элементов.
Application.Wait Now + TimeValue("0:00:05") ' Задержка в 5 секунд
Также, проверьте, загружается ли график в фрейме. Если это так, необходимо сначала получить доступ к этому фрейму.
4. Пример доработанного скрипта
Ниже представлен доработанный пример вашего скрипта с учетом предложенных рекомендаций:
Dim Mychorme As Selenium.ChromeDriver
Dim Wait As Selenium.Wait
Sub Take_ScreenShot_Entirepage_Cropped()
Dim wdh As Integer
Dim hght As Integer
Dim topOffset As Integer
Dim bottomOffset As Integer
Dim filePath As String
topOffset = 500
bottomOffset = 500
filePath = ThisWorkbook.Path
Set Mychorme = New Selenium.ChromeDriver
With Mychorme
.Timeouts.ImplicitWait = 5000
.AddArgument "--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
.Start
.Get "https://wantrich.chinatimes.com/tw-market/listed/stock/3167"
' Ожидание загрузки графика
Set Wait = Mychorme.Wait
Wait.ForElementByCss(".class_of_chart_element", 10000)
wdh = .ExecuteScript("return document.body.scrollWidth")
hght = .ExecuteScript("return document.body.scrollHeight")
.Window.SetSize wdh, hght - topOffset - bottomOffset
.ExecuteScript "window.scrollTo(0, " & topOffset & ");"
Application.Wait (Now + TimeValue("0:00:03"))
.TakeScreenshot.SaveAs filePath & "\screenCapture_Entirepage_Cropped.png"
.Quit
End With
End Sub
Заключение
Использование Selenium для автоматизации браузера может быть сложным и часто требует нескольких попыток для настройки. Однако, с правильными ожиданиями, пользовательскими агентами и обработкой динамической загрузки, вы сможете успешно обойти ограничения и получить доступ к всем элементам веб-страницы, включая графики. Если вы столкнулись с дополнительными трудностями, рассмотрите возможность использования прокси-серверов или других методов обхода ограничений веб-сайтов.