@Bjornie
Изучаю Python

Как ускорить парсинг данных с Python/Selenium?

В текущем варианте парсинг осуществляется с chromedriver. Практически имею около 100.000 ссылок, по которым находятся таблицы. У каждой таблицы имеется кнопка "Подробнее", которую сейчас нажимает парсер, копирует содержимое попапа, закрывает его и т.д.
В общем чтобы пропарсить наверное миллион таких строк у меня уйдет месяц непрерывной работы селениума. Ищу способ как-то ускорить это.

Проблема, установил небольшие задержки, которые нужны в аккурат дать подгрузиться попапу и дать ему закрыться, иначе возникают ошибки element is not found.

В общем, спасайте. Подскажите как это реально делается, чтобы ускорить работу хотя бы в 10 раз. (за пол часа он прошел около 400 страниц, спарсив около 2000 строк). Это как пройтись мне самому, нажать на каждую ссылку "Подробнее", но копирование отдать скрипту. Это вряд ли можно назвать полной автоматизацией. тем более с такими объемами (не оцениваю их как большие).

Существуют ли "реальные" бустеры таких операций? Я понимаю, что селениум сделан для тестирования или хотя бы для парсинга страниц, где нет кучи попапов, которые все надо прокликать.

upd: после постинга продолжил гуглить и в одном обсуждении нашел следующее:
javascript tables is exactly why I went with selenium for some sites. However, rather than parsing directly with selenium, I was passing driver.page_source (raw html containing whatever javascript generated) to bs4 and parsing with bs4. I was shocked to find out that this round about method was faster than using selenium.find_element_by_XXXXX methods without ever invoking bs4.

Это действительно так?
  • Вопрос задан
  • 7917 просмотров
Решения вопроса 1
alekciy
@alekciy
Вёбных дел мастер
На 100к ссылок, особенно если требуется их обходить достаточно часто (или на сервере ресурсов мало), есть уже смысл задумать о более кастомных (читай, напилить руками низкоуровневый механизм), но более быстрых механизмах. Как-то запросы на получение AJAX данных через curl. Или если данные получаться в рамтайме на клиенте через замудренный JS, то применить SpiderMonkey, V8 либо другие серверных движки.

В общем чтобы пропарсить наверное миллион таких строк у меня уйдет месяц непрерывной работы селениума

Делал на кластере из PhantomJS парсер который должен был за 15 минут обходит чуть больше 1к страниц и парсить из них разные хитрые таблички. Требовалось что-то около десяти инстансов PhantomJS, 20 Гб ОЗУ и 16 ядер ЦПУ. На таком кластере 100к за сутки переварит реально.
Когда требование по времени ужесточилось до 5 минут, напилил на SpiderMonkey.

element is not found

Нужно использовать wait(). Тогда дальше код будет выполняться когда на странице появиться нужный элемент.

где нет кучи попапов, которые все надо прокликать

Наличие/отсутствие попапов не играет роли. Все, что появляется в DOM, все можно отработать. Регулярно тягаю данные с яндекс ворстата. Много там разных хитрых обработчиков. Но все силами PhantomJS-а через webdriver решается рано или поздно.

Это действительно так?

Возможно. Но так ли это в вашем контексте ни кто кроме эксперимента не скажет. Т.е. берем данное утверждение и проверяем в своей задаче парсинга.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Вместо chromedriver вы можете использовать phantomjs, это ускорит переход по страницам.
Но я практически на сто процентов уверен, что вам не нужен интерпретатор javascript, чтобы спарсить необходимые данные.
Если открывается popup без подгрузки данных (без ajax), значит данные находятся где-то в html и их можно спарить.
Если с подгрузкой, тогда нужно делать запрос напрямую (на тот url откуда загружаются данные).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы