CoderCastrov logo
CoderCastrov
Selenium

Парсинг веб-страниц с использованием Selenium и C#

Парсинг веб-страниц с использованием Selenium и C#
просмотров
4 мин чтение
#Selenium

Автоматизируйте сбор данных с помощью этого мощного инструмента

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

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

Для таких задач есть Selenium и C#.

Начало работы с проектом Selenium

Для начала вам потребуется создать приложение для рабочего стола или консольное приложение в Visual Studio, а затем добавить пакеты Selenium nuget. Вы можете сделать это быстро через командную строку:

Затем вам понадобится установить Selenium WebDriver на вашу операционную систему. Существует множество способов сделать это и множество различных веб-браузеров, которые можно автоматизировать. Я выбрал Chrome на Mac; но выберите ту комбинацию, которая вам кажется наиболее подходящей.

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

После создания рабочего проекта добавьте этот код в файл Program.cs:

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

class Program
{
    static void Main(string[] args)
    {
        IWebDriver driver = new ChromeDriver();
        driver.Navigate().GoToUrl("https://www.example.com");
        string pageSource = driver.PageSource;
        driver.Quit();
    }
}

Теперь вы сможете скомпилировать и запустить ваше приложение, и оно создаст экземпляр Selenium! Давайте начнем загружать страницы и получать текст.

Загрузка страниц и извлечение текста с использованием XPath

Первое, что мы хотим сделать, это загрузить URL в браузер. Но мы не хотим сразу начинать использовать страницу; мы хотим дать странице время для завершения загрузки. Современные веб-сайты требуют значительного времени для завершения всех задержек, которые заполняют данные, которые мы хотим наблюдать.

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

Теперь, когда вы загрузили страницу, давайте найдем поле и соберем некоторые данные! Для этого нам понадобится идентифицировать элементы в модели объекта документа и извлечь их текст. Selenium использует технику, называемую XPath, чтобы искать элементы, а затем мы можем извлечь текст либо с помощью element.text, либо с помощью element.getAttribute("attribute_name"):

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

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

Заполнение текстового поля

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

Ввод данных в текстовое поле - это просто; сделать это надежно может быть удивительно сложно. Что может пойти не так?

  • Некоторые JavaScript-библиотеки могут обнаруживать разницу между скриптом, который вводит текст в input, и скриптами, которые просто изменяют атрибут value этого элемента.
  • Некоторые элементы input могут иметь текст-плейсхолдер, загруженный по умолчанию. Эти элементы могут ожидать, что человек нажмет на поле и введет текст поверх существующего; в то время как автоматизированный скрипт может не понять, что текст уже существует.
  • После того, как человек закончит вводить текст в поле, обычно следующим шагом является событие blur() элемента. Это происходит потому, что человек обычно переходит к следующему действию, щелкая мышью в другом месте или нажимая клавишу TAB.
  • Некоторые веб-сайты могут не иметь проблем, если вы отправляете много текста сразу; другие веб-сайты могут некорректно реагировать, и вам может потребоваться отправлять каждое нажатие клавиши отдельно с небольшой задержкой.
  • Если веб-сайт все же сумел испортить наше вводимые данные, мы должны обнаружить это и вызвать исключение, а не позволить нашему автоматизированному скрипту собирать некорректные данные.

Давайте объединим все это в функцию:

Создание скриншотов сайта

Ваша команда по контролю качества может захотеть проверить поведение вашего автоматизированного скрипта после выполнения. Один из отличных способов сделать это - захватывать скриншоты на разных этапах процесса и использовать их для проверки:

Вы можете запускать этот код каждый раз, когда процесс достигает интересной страницы, а затем конвертировать все изображения в PDF с помощью ImageMagick.

Включение человека в автоматизацию

Одним из преимуществ Selenium является возможность смешивать действия человека и автоматизированные действия в скрипте. Некоторые веб-сайты требуют более сложной манипуляции, которая занимает слишком много времени для автоматизации - для этого есть взаимодействие с человеком.

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

Что дальше?

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


Тед Спенс преподает в Беллевьюском колледже и разрабатывает решения для налогового учета в Anrok. Если вас интересует программная инженерия и бизнес-анализ, я буду рад услышать вас в Twitter или LinkedIn.