8 мая 2013 г.

Python, Selenium, Firefox: Некоторые мелочи

Изменение юзер агента:
from selenium.webdriver import Firefox, FirefoxProfile 
ff_profile = FirefoxProfile()
ff_profile.set_preference('general.useragent.override', ' нужный user agent ')
browser = Firefox(firefox_profile=ff_profile)
browser.get('http://www.whatsmyuseragent.com/')
Изменение прокси:
from selenium.webdriver import Firefox
from selenium.webdriver.common import proxy, desired_capabilities
 
ff_proxy = proxy.Proxy({ 'proxyType'  :   proxy.ProxyType().MANUAL,
                                   'httpProxy'   :   ' нужный прокси ' 
})
modif_capabilities = desired_capabilities.DesiredCapabilities().FIREFOX
ff_proxy.add_to_capabilities(modif_capabilities)
browser = Firefox(capabilities=modif_capabilities)
browser.get('http://hideme.ru/ip/')
Изменения accept-languages:
from selenium.webdriver import Firefox, FirefoxProfile  
ff_profile = FirefoxProfile()
ff_profile.set_preference('intl.accept_languages', 'ru') # ru/en
browser = Firefox(firefox_profile=ff_profile)
browser.get('http://www.vk.com') 
Изменение директории для cache:
from selenium.webdriver import Firefox, FirefoxProfile  
ff_profile = FirefoxProfile()
ff_profile.set_preference('browser.cache.disk.parent_directory', '  путь ')
browser = Firefox(firefox_profile=ff_profile)
browser.get('http://www.vk.com') 

10 комментариев:

  1. Спасибо. Как вывести данные полученные не подскажешь?)

    ОтветитьУдалить
  2. И вам спасибо.

    В каком смысле вывести?
    Для получения данных с одного элемента можно использовать метод get_attribute('value')

    Например при одном элементе, или просто нахождении первого:
    print browser.find_element_by_xpath('//input').get_attribute('value')

    Можно пропустить все через итерацию, используя цикл for и методы selenium - find_elements_by_...

    Также можно использовать модуль lxml для построения/анализа dom и получать тело документа через browser.page_source

    ОтветитьУдалить
  3. не подскажите как HTTP_ACCEPT_LANGUAGE(заголовок) изменить?

    ОтветитьУдалить
    Ответы
    1. Этот заголовок вы можете изменять, пропуская все запросы через прокси-сервер, который будет их модифицировать.

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

      Удалить
    2. Спасибо большое. Чувствуется опыт=)
      Еще у меня проблема возникла с tmp, которые плодятся в разделе /tmp, а там всего 1гб, а разбивать раздел заново это ну нереально можно сказать. В общем как перенести временные файлы в другой раздел, наука нашла ответ?
      И еще не могу поймать ошибку, чтобы при ошибке корректно закрыть браузер.

      пробовал
      try:
      # Код
      except WebDriverException as e:
      driver.quit()

      Но ошибка видимо не та.

      Удалить
    3. Добавил в статью способ изменения директории для cache.

      По ошибке смотрите в логах, там должно быть типа:
      selenium.common.exceptions.NoSuchElementException вот здесь и содержится класс ошибки. Потому просто его импортируете и используете в коде.

      Вы также можете все пропустить через глобальный except:
      try:
      #действие
      except:
      driver.close()

      Вряд ли там выскочат значительные внешние ошибки, которые смогут повлиять на логику работы...

      Удалить
    4. Спасибо=) ваши советы очень помогают. А хром экономнее лисы и в чем? Озу или ЦП? Лиса озу не много ест, но вот ЦП нагружает.

      Удалить
    5. Вы правы, firefox больше грузит cpu, в chrome - упор идет на память.

      В связке с selenium, мне chrome намного больше нравится. Особенно это заметно на скриптах, цель которых работать по несколько часов. Например у меня есть реализация многопочного скрипта, который работает с очень сложным сайтом. ff - убивает рабочий ноут в 4 потока, а chrome работает стабильно в 10+ потоков...

      К тому же я заметил, что ff иногда криво строит dom-дерево, опять же при длительной работе. И это вываливается в ошибки, когда нужно по xpath получить часть данных. Конечно это все можно пропустить через try/except, но иногда нужно получать данные точно.

      Правда даже с этими минусами, все равно использую чаще firefox :) Реализация функционала для selenium намного шире и это уже зависит не от selenium, а от самого браузера, который предоставляет намного больше возможностей для драйвера.

      Удалить
    6. Спасибо за детальный ответ.
      А реализация изменения браузера и прокси в хроме имеется?
      Документация вообще скудная.

      Удалить