Ответы пользователя по тегу Selenium
  • Как ускорить парсинг данных с Python/Selenium?

    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 решается рано или поздно.

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

    Возможно. Но так ли это в вашем контексте ни кто кроме эксперимента не скажет. Т.е. берем данное утверждение и проверяем в своей задаче парсинга.
    Ответ написан
    3 комментария
  • Как парсить многоуровневые формы?

    alekciy
    @alekciy
    Вёбных дел мастер
    Значения для Select2 зависят от выбранного option в Select1? Значения Select3 зависят от выбранного option в Select2? Можно тупо методом банального перебора.
    Ответ написан
    Комментировать
  • Где и каким образом лучше всего хранить тестовые данные для проекта Selenium (Java)?

    alekciy
    @alekciy
    Вёбных дел мастер
    А как это соотноситься с Selenium?
    Варианты хранения: файлы, база, память.
    Ответ написан
    Комментировать
  • Как авторизоваться в gmail через SeleniumWebDriver?

    alekciy
    @alekciy
    Вёбных дел мастер
    Открыли страницу - сделали скрин. Ввели логин - сделали скрин. Ввели пароль - сделали скрин. Отправили форму - сделали скрин. Т.е. скриним каждый шаг. Потом смотрим пачку получившихся скринов и думаем, на каком шаге возникла проблема.
    Ответ написан
  • Как исправить ошибку с ssl у chromedriver?

    alekciy
    @alekciy
    Вёбных дел мастер
    Возможных причины 2. Браузер не смог договориться с сервером о применяемых схемах и хэндшейк фейлиться. Вероятнее всего сервер к которую обращаемся достаточно новый, а браузер достаточно старый. Быстро решается обновлением браузера.

    Второй вариант - на сервере самоподписанный сертификат. Тогда копать куда-то сюда: stackoverflow.com/questions/5933871/handling-untru...

    Вообще рекомендовал бы привести все 10 узлов к одиному системного окружению. Если это конечно возможно. Если это разные ОС/версии_браузера, то возможна ситуация, что они слишком старые и в принципе не смогут договориться с сервером. Если сервер вам подконтролен, можно поиграться с настройками SSL на самом сервере. Если нет и эти 2 ноды обновить нельзя, то решения могут быть только костыльные в духе хитрых проксей и танцев с бубнами. Но я бы десять раз подумал, прежде чем прибегать к таким методам.
    Ответ написан
    Комментировать
  • Реально сделать многопоточный запуск PhantomJS через Selenium Webdriver?

    alekciy
    @alekciy
    Вёбных дел мастер
    Многопоточность PhantomJS это вопрос к исходникам. Одна нода PhantomJS-а способна принимать по Webdriver запросы по загрузке разных страниц. Т.е. работать с несколькими сайтами одновременно в рамках одного запущенного PhantomJS возможно. С одним сайтом под одним аккаунтом проблематично. Поэтому если нужно работать с одним сайтом под одним аккаутом параллельно, то проще всего запускать несколько экземпляров PhantomJS, а потом из приложения разруливать запросы на разные ноды.

    Лично сам делаю так из PHP. В приложении пишется запускалка нод, а так же роутер запросов. В принципе что-то готовое на Java есть, нужно смотреть в сторону Selenium Grid (вариант от Яндекса). Но сам не использовал, у меня нет смысла размывать стек явой.
    Ответ написан
    Комментировать
  • Многопроцессорный парсер теряет ссылки при паринге (selenium+PhantomJS+ProcessPoolExecutor)?

    alekciy
    @alekciy
    Вёбных дел мастер
    Наверное уже не очень актуально, но оставлю ремарку для истории. Потеря страниц на парсенге - ситуация штатная. Обилие JS, падения кода при работе с DOM, сетевые проблемы, все может привести к генерации исключения и фейлу получения данных. Так что при разработке стоит сразу заклываться на штатность такой ситуации и просто отлавливать неразобранные страницы и отправлять на повторный парсинг.

    1000 страниц за 1 час более чем реальная задача. Сам получал скорость в 1000 за 15 минут. Достигается просто поднятием кластера. Требует много ресурсов (у меня выходило что-то около 10 узлов на каждый до 5Гб ОЗУ).
    Ответ написан
    Комментировать
  • Аналоги selenium для python?

    alekciy
    @alekciy
    Вёбных дел мастер
    Внесу небольшую ремарку все же. Нужно различать 1) скорость отработки одной страницы 2) скорость отработки Х страниц в секунду. Обычно под "более быстрый" понимают второе, т.к. на практике у нас много страниц и мы хотим от как можно быстрее пропарсить. Так, вот, если задача поднять именно п. 2, то делать это можно и на selenium, просто придется запустить целый кластер из нод. Что обычно выливается в большие требования по ресурсам. И если selenium все устраивает и есть такие ресурсы, то есть смысл оставаться в его рамках.
    Ответ написан
  • Как открывать https сайты, не имеющие доверенного сертификата, без подтверждения вручную в firefox или phantomjs?

    alekciy
    @alekciy
    Вёбных дел мастер
    Нужно запускать PhantonJS с опцией --ignore-ssl-errors=true Command Line Interface и это работает и решит проблему (если проблема конечно именно с сертификатом). То, что это делается через опции самого драйвера python совершенно не значит, что он запускает PhantonJS именно с этой опцией (обычно можно проверить через strace). Я бы рекомендовал запустить PhantomJS из командной строки руками и коннектиться из питона уже к нему.

    За Firefox с ходу не скажу, но подозреваю, что там это будет сделать сложнее.
    Ответ написан
    Комментировать
  • Почему selenium требует так много оперативной памяти?

    alekciy
    @alekciy
    Вёбных дел мастер
    Разные версии сервера, разные ОС, разное системное окружение и настройки, магнитная буря на Луне или щепаная буря на Марсе... Все это не важно, т.к. что-то подкрутить врятли получится. Примите как данность и продолжайте работать с тем что есть.

    P.S. 400 метров не так много. Сам использую немного другое ПО - PhantomJS. В процессе работы 2-5Гб ОЗУ на один истанс вполне себе норма.
    Ответ написан
  • Как с помощью WebElement.findElements(By.xpath .. сделать поиск только по дочерним узлам?

    alekciy
    @alekciy
    Вёбных дел мастер
    делать поиск только по дочерним элементам, а не по всей странице

    Дописать ось работы с потомками.
    Хотя из описание не очень понятно, какие элементы родительские а какие дочерние. Какая структура поддерева "родитель-ребенок"?
    Ответ написан
  • Написание ботов для сайтов с AJAX, с помощью Selenium или PhantomJS. Как отслеживать изменения, вносимые в DOM уже JSом (либо сами AJAX-запросы)?

    alekciy
    @alekciy
    Вёбных дел мастер
    1) А зачем для такого выкосоуровнего инструмента отслеживать такую низкоуровневость как изменение DOM? Максимум что нужно это XPath для вытаскивания данных и wait() для ожидания появления данных вычисляемых через JS или подтягиваемых через AJAX.
    2) На сколько я помню ни каких. Банально даже статуст HTTP ответа получить нельзя.

    Нужно просто понимать, что Selenium и webdriver в частности писались для тестирования, а не написания ботов. То, что он используется и для ботов, просто побочный эффект. Поэтому что-то как ни крути придется допиливать руками. В контексте PhantomJS к примеру дописать для него JS скрипты (как вариант, стоит ознакомиться к CasperJS в котором какой-то набор JS уже написан) которые дополнят недостающий функционал.
    Ответ написан
    1 комментарий
  • Есть ли аналоги у Selenium?

    alekciy
    @alekciy
    Вёбных дел мастер
    Если и есть, то наверное что-то специфичное только. Т.е. в целом по больничке можно считать, что вот прямо так готового коробочного аналога webdriver нет. Наверное допишу по недостаткам:
    - невозможно сохранить файл через диалоговое окно браузера.

    Пожалуй дополню/уточню имеющиеся:
    - поведение отличается да, но в принципе все варианты описаны в документации, где-что будет работать, а где не будет, к сожалению ситуация неизбежна;
    - возможно неточный XPath (как вариант, поиск в DOM данных которые должны подгружаться в момент Х, но на момент запроса их еще нет)? Активно работаю с XPath и проблем не замечал;
    - нестабильный это да, может просто большая нагрузка на одну ноду? Есть смысл посмотреть в сторону прокси от Яндекса, они там в опенсорц запили свой вариант.

    В целом если нужно "как человек", то как ни крути, нужно использовать PhantomJS, дописать нужное поведение к нему на JavaScript и запускать его в режиме webdriver. Это не очень подходит для тестов (т.к. по сути работа сайта не проверяется в ХХ браузерах), но может неплохо отработать для бота.
    Ответ написан
    7 комментариев