2015-07-12 2 views
1

Я работаю с Selenium в Python 2.7. Я получаю, что загрузка страницы и подобные вещи занимают гораздо больше времени, чем сырые запросы, потому что имитируют все, включая JS и т. Д.Selenium - разбор страницы занимает слишком много времени

Я не понимаю, что разбор уже загруженной страницы занимает слишком много времени.

Каждый раз, когда страница загружается, я обнаруживаю, что все теги удовлетворяют некоторому условию (около 30 тегов div), а затем я помещаю каждый тег в качестве атрибута в функцию синтаксического анализа. Для разбора я использую css_selectors и аналогичные методы: on.find_element_by_css_selector("div.carrier p").text Насколько я понимаю, когда страница загружена, исходный код этой страницы сохраняется в моей ОЗУ или где-либо еще, так что синтаксический анализ должен выполняться в миллисекундах ,

EDIT: Я уверен, что разбор одного и того же исходного кода с использованием BeautifulSoup будет более чем в 10 раз быстрее, но я не понимаю, почему.

Есть ли у вас какие-либо объяснения? Thanks

ответ

1

Это различные инструменты для различных целей.. Selenium - это инструмент автоматизации браузера, который имеет богатый набор методов для поиска элементов. BeautifulSoup - HTML-парсер. Когда вы находите элемент с Selenium - это не разбор HTML. Другими словами, driver.find_element_by_id("myid") и soup.find(id="myid") очень разные вещи.

Когда вы просите селен, чтобы найти элемент, скажем, с помощью find_element_by_css_selector(), есть HTTP request отправляется в /session/$sessionId/element конечную точку по JSON wire protocol. Затем ваш клиент selenium python получит ответ и вернет вам экземпляр WebElement, если все пойдет без ошибок. Вы можете думать об этом как о реальном времени/динамике, вы получаете настоящий веб-элемент, который «живет» в браузере, вы можете контролировать и взаимодействовать с ним.

С BeautifulSoup, как только вы загрузите источник страницы, больше нет сетевого компонента, нет взаимодействия в режиме реального времени со страницей и элементом, есть только разбор HTML.


На практике, если вы занимаетесь веб-соскоб и вам нужен реальный браузер для выполнения Javascript и обработки AJAX, и вы делаете сложный HTML разборе после этого, было бы целесообразно, чтобы получить желаемый .page_source и подавайте его до BeautifulSoup, или, еще лучше с точки зрения скорости - lxml.html.

Обратите внимание, что в таких случаях, как правило, нет необходимости в полном HTML-источнике страницы. Чтобы ускорить анализ HTML, вы можете подать «внутренний» или «внешний» HTML блока страницы, содержащий нужные данные, в парсер html по выбору. Например:

container = driver.find_element_by_id("container").getAttribute("outerHTML") 
driver.close() 

soup = BeautifulSoup(container, "lxml") 
+0

Спасибо за разъяснения. Таким образом, он не отправляет запросы на настоящую веб-страницу в этом случае? –

+0

@Milan каждый вызов 'find_element_by_ *' приведет к взаимодействию HTTP между вашим клиентом selenium python, сервером selenium и веб-сервером. Это то, что на самом деле замедляет работу. Я немного разъяснил это объяснение. Надеюсь, что все станет понятнее. Спасибо, хороший вопрос! – alecxe

Смежные вопросы