#vba #selenium #web-scraping
Вопрос:
Я создал сценарий vba в сочетании с selenium, чтобы соскрести цену $8.97
с этой веб-страницы. Скрипт действительно извлекает содержимое, если я запускаю его в безголовом режиме. Однако мое намерение состоит в том, чтобы захватить контент в безголовом режиме. Я знаю, что могу использовать их api для получения цены, но сам api блокируется после 4/5 запросов, поэтому я намеренно выбрал этот маршрут.
Я пробовал с (работает в безголовом режиме):
Sub GrabWalmartContent()
Const Url$ = "https://www.walmart.ca/en/ip/terra-delyssa-tunisian-extra-virgin-olive-oil/6000196167258"
Dim driver As Object
Set driver = CreateObject("Selenium.ChromeDriver")
' driver.AddArgument "--headless"
driver.get Url
Debug.Print driver.FindElementByCss("span[data-automation='buybox-price']", Timeout:=5000).Text
End Sub
Как я могу получить цену с веб-страницы, используя vba в сочетании с selenium в безголовом режиме?
Комментарии:
1. В чем заключается ошибка броска в безголовом режиме ?
2.
NoSuchElementError
указывая на строку debug.print @cruisepandey.
Ответ №1:
Добро пожаловать в всегда веселый мир веб-скребка. Вы всегда должны помнить об одном правиле: если ваш скребок работает в головном режиме, но не работает в безголовом режиме, скорее всего, сайт, который вы очищаете, блокирует безголовые браузеры.
В качестве теста я открыл вашу страницу в chrome без головы (с помощью puppeteer) и сделал снимок экрана. Результат:
Таким образом, Walmart не обязательно нравятся браузеры без головы, и они предприняли некоторые шаги, чтобы обнаружить и заблокировать их. Владельцы сайтов могут многое сделать для обнаружения безголовых браузеров, самым простым из которых является проверка заголовка пользовательского агента запроса.
Я изменил пользовательский агент на свою текущую версию chrome для рабочего стола: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36
, и повторно запустил скребок. Результат:
Так что, поскольку это сработало, похоже, что Walmart блокирует безголовых агентов пользователей, но не более того. Следующий код добавляет только одну строку к вашему исходному коду и раскомментирует аргумент без головы. Он напечатает 8,97 доллара в ближайшем окне, как вы и ожидали:
Sub GrabWalmartContent()
Const Url$ = "https://www.walmart.ca/en/ip/terra-delyssa-tunisian-extra-virgin-olive-oil/6000196167258"
Dim driver As Object
Set driver = CreateObject("Selenium.ChromeDriver")
driver.AddArgument "--user-agent=""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36"""
driver.AddArgument "--headless"
driver.get Url
Debug.Print driver.FindElementByCss("span[data-automation='buybox-price']", Timeout:=5000).Text
End Sub
Комментарии:
1. Да, верно, ты @Дмитрий. Похоже, нам не нужны эти дополнительные кавычки » при определении
user-agent
. Если быть точным, это то, что я имел в виду"--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36"
. Спасибо.
Ответ №2:
Вам также нужно правильно подождать, чтобы получить текст, даже если ваш css выглядит хорошо.
Или вы можете установить тайм-аут при загрузке страницы :
driver.Timeouts.PageLoad = 20000
а затем получите цену точно так же, как вы это делаете.
Комментарии:
1. В этой строке уже есть тайм-аут, который выдает эту ошибку. Однако, похоже, вы предлагаете мне увеличить это, верно? Хорошо, я попробую сейчас.
2. Я считаю, что это для webelement, я говорю для всей страницы laoding
3. Извините, он снова не удался даже с этим
20000
таймаутом. Я попыталсяdriver.AddArgument "--disable-blink-features=AutomationControlled"
, что в большинстве случаев работает, когда я запускаю любой сценарий без головы, но здесь потерпел неудачу.4. О, я понимаю. Хорошо, постарайтесь выполнить это сейчас.
5. Это тоже не удалось.