Экспорт данных с динамического веб-сайта с помощью BS4 Python:

#python #beautifulsoup

#python #beautifulsoup

Вопрос:

Я хочу экспортировать все данные хранилища со следующего веб-сайта в файл Excel:https://www.ybpn.de/ihre-parfuemerien

Проблема: карта «динамическая», поэтому необходимые данные загружаются при вводе почтового индекса.

Необходимые данные хранятся в классе div «storefinder__list-item» с уникальной ссылкой в классе div «storefinder-reference», например: data-storefinder-reference=»132″

Я пытался:

 soup.find("div", {"data-storefinder-reference": "132"})
  

Но результат таков: НЕТ

Я думаю, что эта проблема вызвана тем фактом, что страница динамическая, поэтому необходимые данные загружаются затем, когда вы вводите почтовый индекс. Поэтому, когда я ищу ссылочный идентификатор «132», он «там», но не загружен на веб-сайт, и bs4 не может найти этот идентификатор.

Есть идеи по улучшению кода?

Комментарии:

1. Я думаю, вы можете просто использовать запросы. Можете ли вы поделиться примером почтового индекса и данных, которые вы ожидаете получить?

2. Почтовый индекс: 10365, а затем я получаю 5 div-классов «storefinder__list-item storefinder__list-item-active», в каждом div-классе есть подклассы для нужных мне данных, например: storefinder-item__title или storefinder-item__adress. Но проблема в том, что страница загружает только 5 результатов, их более 1000 — и мне нужен полный список :/

3. Ваша задача вызвана web-scraping . Поэтому я настоятельно рекомендую использовать Scrapy для достижения этой цели. В принципе, Scrapy работает аналогично запросам BS4 Python, но более надежный и зрелый. Если вам нужно обрабатывать динамические элементы, Scrapy-Splash также поможет вам. Проверьте это введение в Scrapy-Splash

4. Спасибо! Да, у меня действительно возникли некоторые проблемы с bs4 selenium. Может быть, лучше попробовать свой путь.

Ответ №1:

Для этого вам может потребоваться изучить такие инструменты, как selenium и / или «firefox-headless».

Особенно selenium позволяет вам «дистанционно управлять» веб-страницами с помощью Python

Вот руководство:https://realpython.com/modern-web-automation-with-python-and-selenium

Комментарии:

1. Итак, я должен «имитировать» действие пользователя «введите почтовый индекс» с помощью selenium — возможно, на основе текстового файла со всеми почтовыми кодами для Германии, чтобы сделать это автоматически?

2. ДА. Это был бы способ сделать это.

3. Но когда я использую selenium, возможно, защита веб-сайта / ddos блокирует действие, если они замечают, что это не «человек», или? Использовать команду «sleep»? Я думаю, что мы получили много почтовых индексов для всей Германии, поэтому скрипту нужно выполнить много действий, чтобы получить полный список.

4. Это возможно, но маловероятно. На всякий случай вы можете добавлять переходы со случайными задержками в каждый вызов. Но более важным является заголовок запроса «user-agent». Когда вы выполняете запрос в Chrome / Firefox, вы увидите значение в заголовках запроса. Просто скопируйте / вставьте это значение и добавьте его в свое приложение в качестве заголовка запроса. Это сделает его «похожим» на человека.

5. Звучит как хороший способ. Я попробую это с selenium и спящим / пользовательским агентом. Спасибо!

Ответ №2:

Если проблема заключается в ожидании загрузки страницы, вы можете сделать это с помощью selenium.

 `result = driver.execute_script('var text = document.title ; return text')`
  

Если на странице есть jquery, это, безусловно, так

 result=driver.execute_script("""
       $(document).ready({
          var $text=$('yourselector').text()
           return $text
           })
          """)
  

Примечание: Для selenium вы можете посмотреть здесь

Комментарии:

1. Да, я думаю, что я должен попробовать это с selenium. Я не знаю, используют ли они jquery. :/

Ответ №3:

Вы могли бы просто открыть страницу в Chrome или ff, открыть консоль веб-отладки и запросить элементы. если вы видите их, они находятся в dom и, следовательно, могут быть запрошены. Но это будет сделано на javascript. если вам повезет, они используют jQuery.

Комментарии:

1. да, я сделал это. Но есть только некоторые «элементы», а не весь список. В классе «storefinder__info» есть строка с информацией: «12 результатов». Я думаю, что они используют javascript, как узнать, используют ли они jquery?

2. я предполагаю, что есть ajax-запросы, просматривающие элементы списка. вы также можете увидеть их на вкладке запросы инструментов разработки. возможно, они отправляют параметр, определяющий число или результаты. в любом случае, вы также можете запросить все это вручную.