Не удается собрать цену с веб-страницы с помощью vba/selenium в безголовом режиме

#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. Это тоже не удалось.