Переходите от нуля к герою с помощью этих главных советов!

Веб-парсинг; это хорошо или это плохо? Ну, это не совсем подходит ни в один из лагерей. Его можно использовать для автоматизации сбора легкодоступных и доступных данных или данных о вас, хранимых третьими сторонами. С другой стороны, им можно злоупотреблять, отправляя на сервер тысячи запросов в час или получая доступ к контенту, находящемуся за платным доступом. Одна вещь, которая определенно относится к веб-парсингу; это конечно весело!

Как правило, владельцам данных это не нравится. На некоторых сайтах есть алгоритмы обнаружения, которые ищут автоматических ботов и блокируют связанный IP-адрес. Избегание обнаружения - это часть веб-скрейпинга, но я не заостряю внимание на этой стороне в своих советах (кроме совета 1!). Скрытие вашего IP-адреса с помощью VPN, использование случайного веб-драйвера, использование случайных пауз, предварительное выполнение случайных щелчков по экрану и использование action.move_to(element).perform - все это методы, которые пытаются обмануть эти алгоритмы. Но я думаю, что если вам нужно использовать эти методы в своих сценариях, вы, вероятно, уже перешли черту. Не забывайте нести ответственность.

1. Доступ запрещен

Я без проблем использовал селен для нескольких проектов веб-приложений, прежде чем наткнулся на сайт, который вернул источник страницы как <html><head><title>Access Denied</title></head>. Я обнаружил, что мы часто можем обойти это, добавив параметр в веб-драйвер при его первоначальном создании.

Опция user-agent добавляет заголовок запроса, который позволяет серверу идентифицировать запрос как фактического пользователя (а не робота). Теперь я включаю эту опцию во все свои веб-проекты.

2. Убейте куки

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

self.driver.delete_all_cookies()

3. Подождите…

Есть много способов заставить веб-драйвер ждать загрузки страницы. В функцию WebDriverWait().until() можно передать некоторые полезные команды ожидания, такие как presence_of_element_located или element_to_be_clickable. Однако мне не нужно было использовать что-либо из этого для моих сценариев использования. Вместо этого я вставляю эту строку кода при создании экземпляра webdriver:

self.driver.implicitly_wait(10)

Если selenium не может найти ни один из результатов поиска в DOM, эта implicitly_wait функция позволяет драйверу продолжать попытки поиска в течение установленного времени. Первоначально я думал, что эта функция ожидания должна использоваться как time.sleep() и вставляться в любом месте кода, где у драйвера возникают проблемы, но на самом деле ее нужно объявлять только один раз, а затем всегда использовать для каждого поиска DOM.

4. Поддерживайте порядок

После удаления файлов cookie мой суперкласс всегда содержит этот простой метод:

def kill(self):
    self.driver.quit()

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

5. Когда .clear () не работает

При заполнении формы ввода часто в текстовом поле уже есть значение по умолчанию, от которого нам нужно избавиться. Обычно мы использовали бы функцию .clear(), чтобы очистить поле. Но недавно я столкнулся со случаем, когда это не сработало. Я работаю над веб-приложением, в котором моя семья может выбирать, какие блюда они хотят есть на следующей неделе. После выбора скрипт python добавляет все ингредиенты в нашу онлайн-корзину Tesco для доставки на дом. Но при выборе количества для каждого товара функция .clear() не избавилась от значения по умолчанию.

Импортируя Keys, мы можем отправить несколько не буквенно-цифровых ключей через селен. К ним относятся клавиши «F», Control, Shift, Delete, Space, Backspace, Return, Escape, а также многие другие. В этом примере мне пришлось щелкнуть текстовое поле и отправить ключ BACKSPACE. (Мне бы хотелось, чтобы кто-нибудь в курсе, мог оставить мне комментарий, объясняющий, почему .clear() не работает в этом случае. Насколько я могу судить, не было никаких скрытых div или чего-то подобного, был какой-то javascript, чем анимировал поле ввода с автофокусом)

6. Поиск элементов

Фундаментом для навигации в Интернете с помощью Selenium является поиск в DOM определенных элементов на странице (таких как кнопки и текстовые поля). Selenium дает нам несколько методов для этого, я перечисляю свои любимые здесь:

  1. find_element_by_id: если элемент, который вы ищете, имеет идентификатор, используйте эту функцию, поскольку идентификатор обычно является уникальным атрибутом в DOM, поэтому он должен вернуть элемент, которого вы ожидали.
  2. find_element_by_class_name, find_element_by_name, find_element_by_tag_name, find_element_by_link_text - все они полезны для точного определения элементов, с которыми вы хотите взаимодействовать. Все эти методы имеют две формы; перечисленные здесь все find_element_by, которые возвращают первый экземпляр поиска, но все эти методы также представлены в форме find_elements_by, который возвращает список элементов, соответствующих поиску. Обе формы являются полезными инструментами при парсинге веб-страниц.
  3. find_element_by_css_selector: это полезный метод локатора, если элемент не имеет уникальных атрибутов. Я использую его для объединения имен классов, чтобы определить правильный элемент. например button.pull-right.btn.md-btn.ng-isolate-scope
  4. find_element_by_xpath: xpath часто злоупотребляют, и я вижу, что многие люди используют полный путь (я считаю, это потому, что путь можно скопировать прямо из Chrome, щелкнув правой кнопкой мыши на панели проверки на нужном элементе и выбрав «Копировать» ›' Скопируйте полный xPath '). Но если страница будет немного изменена, например, добавив подзаголовок внутри div, это сделает поиск xPath бесполезным. Мы должны использовать относительный путь, чтобы избежать этой проблемы. Я использую этот локатор, когда элемент имеет уникальный атрибут (не идентификатор или имя), например. find_element_by_xpath(“//a[@data-target=’#modal001']”)

7. Выполнение Javascript

Существует еще один вариант выполнения поиска в DOM и других манипуляций, позволяющий селену выполнять операторы Javascript.

Этот метод взят из моего приложения Food Shopping. Его цель - быстро проверить, присутствует ли уже элемент, который я хочу добавить в корзину. В строке 2 мы используем метод execute_script, затем в javascript мы используем ключевое слово return, чтобы поймать содержимое поиска. Это не лучший способ выполнить этот поиск, это просто пример другого маршрута.

8. Выбор параметров из раскрывающегося списка.

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

  • Метод __init__() (строки 6–13) настраивает наш веб-драйвер, используя аргумент user-agent, функцию .implicity_wait() и функцию .delete_all_cookies().
  • В нашем complete_login() методе мы начинаем с ввода нашего имени пользователя и нажатия кнопки «продолжить» (строки 17 и 18).
  • Следующий экран загружается в наш веб-драйвер, но время загрузки страницы (и любые перенаправления) обрабатываются функцией implicity_wait. Мы должны ввести пароль вместе с 3 символами в произвольном порядке в наш мастер-пароль. Чтобы извлечь, какие 3 символа необходимы, мы выполняем поиск в DOM с помощью функции execute_script (строка 19). Переменная memorable содержит содержимое всех div, которые содержат 3 нужных нам случайных целых числа.
  • В строке 21 мы получаем html объектов и объединяем их в большую строку, так что нам нужно выполнить только один поиск, чтобы получить целые числа. В строке 22 мы выполняем поиск по регулярному выражению. Переменная matches теперь содержит строковое представление нужных нам целых чисел.
  • В строке 23 мы преобразуем целые числа в символы, необходимые для процесса входа в систему. В строке 24 мы создаем словарь, который имеет ключ в качестве идентификатора строки раскрывающегося меню и value в качестве необходимого значения.
  • Для каждого элемента в нашем словаре мы находим раскрывающееся меню, перебираем параметры и выбираем правильное значение (строки 25–30).
  • Чтобы завершить вход, мы нажимаем кнопку «отправить» (строка 31).

Я надеюсь, что вы нашли ценность в этих советах, если да, дайте мне знать в комментариях.