Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Руководство по Selenium: Web Scraping с Selenium и Python

2 апреля 2017 г. Archy Просмотров: 51832 RSS 8 , , , ,

Web Scraping с Selenium и Python

Представьте, какие возможности откроются перед вами, если вы автоматизируете всю нудную деятельность в интернете, такую как ежедневная проверка первых результатов в Google по ключевым запросам, или загрузка кучи разных файлов с разных сайтов. В данном разделе мы научимся пользоваться Selenium вместе с Python. Selenium – это инструмент для веб скрейпинга, имитирующий деятельность пользователя в интернете. К примеру, вы можете использовать Selenium для автоматических запросов в Google и чтения результатов, или заходить в ваши аккаунты в социальных сетях, имитировать пользователя для теста ваших веб приложений. А также многое другое, что вам нужно постоянно делать в интернете. Возможности безграничны!

Важно: Каждый код в этом разделе был протестирован на Python 2.7 и Python 3.4.

Установка и использование Selenium

Selenium – это пакет Python который может быть установлен при помощи pip. Рекомендую установить его в виртуальной среде (используя virtualenv и virtualenvwrapper).

Чтобы установить Selenium, вам нужно ввести следующее:

pip install selenium

В этом разделе мы инициализируем драйвер Firefox, вы можете установить его, скачав исходники geckodriver. Если вы хотите работать в Chrome или IE, вы найдете всю нужную информацию у них на github.

Установка geckodriver драйвер для Firefox

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

Первым делом скачиваем исходники драйвера geckodriver в моем случае это "geckodriver-v0.15.0-linux64.tar.gz" у меня Ubuntu.

wget https://github.com/mozilla/geckodriver/releases/download/v0.15.0/geckodriver-v0.15.0-linux64.tar.gz
tar -xvzf geckodriver-v0.15.0-linux64.tar.gz
sudo chmod +x geckodriver
sudo mv geckodriver /usr/local/bin

Более подробно про установку можно прочитать на английском сайте документации. Там и список всех доступных драйверов под разные браузеры.

Начнем работу!

После установки Selenium и Firefox(geckodriver), создайте файл Python под названием selenium_script.py. Теперь приступаем к инициализации браузера при помощи Selenium:

import time
from selenium import webdriver
 
driver = webdriver.Firefox()
time.sleep(5)
driver.quit()

Таким образом, код инициализировал браузер Firefox, и закрывает его спустя 5 секунд.

Что если мы перейдем в Google и поищем что-нибудь?

Web Scraping в Google при помощи Selenium

Давайте создадим скрипт, который загружает главную страницу Google, и создает запрос "Selenium":

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
 
 
def init_driver():
    driver = webdriver.Firefox()
    driver.wait = WebDriverWait(driver, 5)
    return driver
 
 
def lookup(driver, query):
    driver.get("http://www.google.com")
    try:
        box = driver.wait.until(EC.presence_of_element_located(
            (By.NAME, "q")))
        button = driver.wait.until(EC.element_to_be_clickable(
            (By.NAME, "btnK")))
        box.send_keys(query)
        button.click()
    except TimeoutException:
        print("Box or Button not found in google.com")
 
 
if __name__ == "__main__":
    driver = init_driver()
    lookup(driver, "Selenium")
    time.sleep(5)
    driver.quit()

Что есть в данном коде:

1. Функция init_driver инициализирует экземпляр драйвера;

- Создает экземпляр драйвера;

- Добавляет функцию WebDriverWait в качестве атрибута драйвера, так что доступ к нему станет намного проще. Эта функция используется для того, чтобы дать драйверу подождать 5 секунд, перед следующим действием;

2. Функция lookup берет два аргумента: драйвер и запрос (строка);

- Это открывает поисковую страницу Google;

- Затем ждет, пока будет найден элемент окна запроса, а также кнопку для нажатия. Обратите внимание на то, что мы используем функцию WebDriverWait именно для того, чтобы дождаться появления этих элементов;

- Оба элементы были обнаружены по наименованию. Другими вариантами их поиска были бы ID, XPATH, TAG_NAME, CLASS_NAME, CSS_SELECTOR.

- Далее, запрос отправляется в элемент окна запроса, после чего кнопка поиска нажимается;

- Если окно запроса или кнопка небыли найдены, в пределах наших пяти секунд, возникает TimeoutException;

3. Следующий оператор является условным выражением, которое истинно только тогда, когда скрипт запускается напрямую. Это предотвращает запуск следующих операторов при импорте этого файла;

- Далее драйвер инициализируется и запускается функция lookup, которая будет искать в Google слово "Selenium";

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

И наконец, запустите свой код с:

python selenium_script.py

Сработало? Если у вас появилась ошибка ElementNotVisibleException, читайте далее.

Как выявить ElementNotVisibleException

Недавно был изменен поиск Google, поэтому вначале Google показывает эту страницу:

Web Scraping с Selenium и Python

И после того, как вы начали вводить свой запрос, кнопка запроса смещается в верхнюю часть окна:

Web Scraping с Selenium и Python

Что ж, на самом деле она не двигается. Старая кнопка стала невидимой, а новая все еще видна (по этой причине и возникает ошибка, когда вы нажимаете на старую кнопку: она невидима!). Мы можем обновить функцию lookup в нашем коде, чтобы выявить ошибку:

from selenium.common.exceptions import ElementNotVisibleException
 
def lookup(driver, query):
    driver.get("http://www.google.com")
    try:
        box = driver.wait.until(EC.presence_of_element_located(
            (By.NAME, "q")))
        button = driver.wait.until(EC.element_to_be_clickable(
            (By.NAME, "btnK")))
        box.send_keys(query)
        try:
            button.click()
        except ElementNotVisibleException:
            button = driver.wait.until(EC.visibility_of_element_located(
                (By.NAME, "btnG")))
            button.click()
    except TimeoutException:
        print("Box or Button not found in google.com")

Элемент button.click(), который и вызывал ошибку, находится внутри оператора try. Если ошибка возникла, мы взглянем на следующую кнопку, при помощи visibility_of_element_located, чтобы убедиться в том, что нужный нам элемент видим, после чего нажимаем на кнопку. Если в какой-либо момент, какой-либо элемент не будет найден в течение 5 секунд, ошибка TimeoutException возникнет и будет выявлена двумя последними строками кода. Обратите внимание на то, что название кнопки “btnK” , а название новой кнопки - “btnG”.

Финальный вид кода

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

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import ElementNotVisibleException
 
 
def init_driver():
    driver = webdriver.Firefox()
    driver.wait = WebDriverWait(driver, 5)
    return driver
 
 
def lookup(driver, query):
    driver.get("http://www.google.com")
    try:
        box = driver.wait.until(EC.presence_of_element_located(
            (By.NAME, "q")))
        button = driver.wait.until(EC.element_to_be_clickable(
            (By.NAME, "btnK")))
        box.send_keys(query)
        try:
            button.click()
        except ElementNotVisibleException:
            button = driver.wait.until(EC.visibility_of_element_located(
                (By.NAME, "btnG")))
            button.click()
    except TimeoutException:
        print("Box or Button not found in google.com")
 
 
if __name__ == "__main__":
    driver = init_driver()
    lookup(driver, "Selenium")
    time.sleep(5)
    driver.quit()

Список методов в Selenium

Подводя итоги, я создал таблицу с основными методами, которые нам потребуются:

# Импорт модулей и инициализация драйвера
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
 
driver = webdriver.Firefox()
driver.wait = WebDriverWait(driver, 5)
 
 
# Ожидание элементов.
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
 
element = driver.wait.until(
    EC.presence_of_element_located(
    EC.element_to_be_clickable(
    EC.visibility_of_element_located(
        (By.NAME, "name")
        (By.ID, "id")
        (By.LINK_TEXT, "link text")
        (By.PARTIAL_LINK_TEXT, "partial link text")
        (By.TAG_NAME, "tag name")
        (By.CLASS_NAME, "class name")
        (By.CSS_SELECTOR, "css selector")
        (By.XPATH, "xpath")
    )
)
 
 
# Выявляем и ловим ошибки.
from selenium.common.exceptions import
    TimeoutException
    ElementNotVisibleException

Внимание: это не файл Python, не пытайтесь запустить или импортировать его! Спасибо за внимание, надеюсь, эта статья вам очень помогла.

Комментариев: 8
  1. Спасибо очень помогло наконец открылся браузер!!!

  2. Богдан | 2018-05-22 в 16:28:18

    на странице сайта нужно вставлять фотографии, можно ли это как-то автоматизировать?

  3. Василий | 2018-09-21 в 12:06:15

    Спасибо за статью!

  4. не находит кнопочку :( просто не находит

  5. в мене метод click() не працює можете допомогти

  6. Спасибо за статью!

  7. Михаил | 2021-10-28 в 19:10:13

    Добрый вечер! Ситуация следующая: нужно найти все id в тегах на странице, и вывести их. Каким образом это можно было бы реализовать? Сайт: вайлдберис. Спасибо!

  8. Привет дамы и господа[url=https://ukr-life.com.ua/]![/url]

    Ищите независимое украинское СМИ? Хотите изучать лучшую и актуальную информацию? Тогда Вы по адресу!

    [url=https://ukr-life.com.ua/][img]https://i114.fastpic.ru/big/2021/0221/9f/2ee8b626960711575c666ec340b1349f.jpg[/img][/url]

    Наша интернет газета УКР Лайф признано яркой независимой газетой. У нас Вы можете изучить свежие разделы статей на тему пенсий в Украине, коммунальных коммуналки и тарифов, которые интересуют практически каждого гражданина. Мы берем информацию из первоисточников и делемся ею с Вами, дорогие читатели.

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

    Вот ТОП 10 последних новостей, которые стоит прочитать уже сейчас:

    1)[url=https://ukr-life.com.ua/]ВЪЕЗД В УКРАИНУ ДЛЯ РОССИЯН В 2024 ГОДУ [/url]

    2)[url=https://ukr-life.com.ua/]КОГДА НАСТУПИТ ВЕСНА В 2024 ГОДУ? [/url]

    3)[url=https://ukr-life.com.ua/]НАСТРОЙКИ СПУТНИКОВЫХ КАНАЛОВ 2024 В УКРАИНЕ[/url]

    4)[url=https://ukr-life.com.ua/]ДЕШЕВЫЕ ТАРИФЫ КИЕВСТАР 2024 ГОДА [/url]

    5)[url=https://ukr-life.com.ua/]ПЕНСИИ ПЕРЕСЕЛЕНЦАМ В УКРАИНЕ В 2024 ГОДУ [/url]

    6)[url=https://ukr-life.com.ua/]ПОСОБИЕ МАТЕРИ ОДИНОЧКЕ В УКРАИНЕ 2024 [/url]

    7)[url=https://ukr-life.com.ua/]ПРЕДСКАЗАНИЯ О ДОНБАССЕ НА 2024 ГОД ОТ ЭКСТРАСЕНСОВ [/url]

    8)[url=https://ukr-life.com.ua/]ВЪЕЗД В УКРАИНУ ДЛЯ РОССИЯН С 1 ЯНВАРЯ 2024 ГОДА [/url]

    9)[url=https://ukr-life.com.ua/]НОВЫЕ ТАРИФЫ 2024 ГОДА ВОДАФОН (VODAFONE) В УКРАИНЕ [/url]

    10)[url=https://ukr-life.com.ua/]ПЕНСІЇ ВІЙСЬКОВИМ ПЕНСІОНЕРАМ УКРАЇНИ В 2024 РОЦІ [/url]

    Всегда рады помочь Вам! С уважением, команда Ukr-life

    А вот еще подборка новостей:

    [url=https://ukr-life.com.ua/]xsport biss ключ 2024[/url]

    [url=https://ukr-life.com.ua/]осенний призыв[/url]

    [url=https://ukr-life.com.ua/]когда будет сильний мороз в Украине в 2024 году[/url]

    [url=https://ukr-life.com.ua/]детские выплаты[/url]

    [url=https://ukr-life.com.ua/]учет в центре занятости[/url]

    [url=https://ukr-life.com.ua/]пенсия по инвалидности 3 группа 2024 украина[/url]

    [url=https://ukr-life.com.ua/]последние новости о соц выплатах малообеспеченным на детей в Украине[/url]

    [url=https://ukr-life.com.ua/]мапа україни супутникова[/url]

    [url=https://ukr-life.com.ua/]неработающая мать одиночка[/url]

    [url=https://ukr-life.com.ua/]тарифы на Киевстар в Украине[/url]

    [url=https://ukr-life.com.ua/]посевной календарь на 2024 год для украины[/url]

    [url=https://ukr-life.com.ua/]негосударственные вузы Киева[/url]

    [url=https://ukr-life.com.ua/]последние новости о индексации зарплаты учителям Украины в 2024 году[/url]

    [url=https://ukr-life.com.ua/]зимние каникулы украина[/url]

    [url=https://ukr-life.com.ua/]каникулы зимние 2024[/url]

    [url=https://ukr-life.com.ua/]рейтинг смартфонов 2024 в Украине до 10000 грн[/url]

    [url=https://ukr-life.com.ua/]тарифы водафон ред экстра с[/url]

    [url=https://ukr-life.com.ua/]как настроить каналы на спутнике правильно[/url]

    [url=https://ukr-life.com.ua/]повышение пенсий военным пенсионерам в украине в 2024 году[/url]

    [url=https://ukr-life.com.ua/]посевной календарь для Украины Харьковской области по месяцам[/url]

    [url=https://ukr-life.com.ua/]виробничий календар на 2024 рік (україна)[/url]

    [url=https://ukr-life.com.ua/]будет ли выпускной в 2024 году[/url]

    [url=https://ukr-life.com.ua/]рейтинг самых богатых украинцев[/url]

    [url=https://ukr-life.com.ua/]штраф за неоформленного продавца[/url]

    [url=https://ukr-life.com.ua/]дородовые выплаты 2024 украина неработающим[/url]

    [url=https://ukr-life.com.ua/]предсказания Кейси на 2024 год для Украины[/url]

    [url=https://ukr-life.com.ua/]прогноз погоды на март 2024[/url]

    [url=https://ukr-life.com.ua/]настройка спутника украина[/url]

    [url=https://ukr-life.com.ua/]причины остановки тс 2024[/url]

    [url=https://ukr-life.com.ua/]астрологи о зеленском[/url]

    [url=https://ukr-life.com.ua/]в какие дни можно венчаться в 2024 году[/url]

    [url=https://ukr-life.com.ua/]как позвонить живому оператору Киевстар[/url]

    [url=https://ukr-life.com.ua/]прогноз доллара на 2024 год в Украине[/url]

    [url=https://ukr-life.com.ua/]прогноз на июль[/url]

    [url=https://ukr-life.com.ua/]зарплата медсестры 2024 украина[/url]

    [url=https://ukr-life.com.ua/]зарплата пенитенциарной службы Украине 2024[/url]

    [url=https://ukr-life.com.ua/]календарь клева рыбы на 2024 год украина[/url]

    [url=https://ukr-life.com.ua/]детские выплаты в Украине, изменения[/url]

    [url=https://ukr-life.com.ua/]рыболовный календарь 2024[/url]

    [url=https://ukr-life.com.ua/]день учителя 2024 украина дата[/url]

    [url=https://ukr-life.com.ua/]алименты 2024 украина калькулятор[/url]

    [url=https://ukr-life.com.ua/]водафон смартфон на месяц[/url]

    [url=https://ukr-life.com.ua/]безвизовые страны для граждан Украины в 2024 году[/url]

    [url=https://ukr-life.com.ua/]настройки спутниковых каналов[/url]

    [url=https://ukr-life.com.ua/]астрологический прогноз на 2024 год для Украины от экстрасенсов[/url]

    [url=https://ukr-life.com.ua/]прием платежей PayPal в Украине[/url]

    [url=https://ukr-life.com.ua/]460 киевстар оператор[/url]

    [url=https://ukr-life.com.ua/]посевной календарь украина 2024[/url]

    [url=https://ukr-life.com.ua/]зима 2024 прогноз[/url]

    [url=https://ukr-life.com.ua/]новинки украинской музыки 2024[/url]

Оставьте комментарий!

Используйте нормальные имена.

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

(обязательно)