Использование Cypress для получения данных, когда REST API не существует

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

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

Конечно, было бы слишком утомительно собирать их вручную, и, насколько мне известно, нет API, с которым я мог бы взаимодействовать, поэтому я обратился к парсингу веб-страниц:

Способ извлечения данных с веб-сайтов без API.

Концепция

Во-первых, мы увидим, как мы можем собирать информацию с HTML-страницы с помощью Cypress. Страница в вопросах выглядит следующим образом:

Правила игры таковы: выберите 5 различных чисел от 1 до 90. К счастью для нас, данные по крайней мере предварительно отформатированы в таблице. Я переименовал столбцы, чтобы вам было понятнее то, что мы ищем. Список результатов продолжается до 1957 года, насчитывая в общей сложности до 3287 строк. Мы хотим собрать числа из столбца «Числа» в каждой строке.

Затем мы хотим создать из него объект и, наконец, сохранить его в файл JSON для последующего повторного использования. В конце концов, мы можем проверить, выпадало ли одно из 5 чисел несколько раз. Мы также можем проверить, какие номера были выбраны чаще всего.

Итак, давайте начнем с того, что возьмем все, что можем, и сгенерируем из этого структурированные данные.

Создание контента

Во-первых, вы хотите настроить Cypress, запустив npm i cypress --save-dev. Я также добавил сценарий запуска в свой package.json файл, чтобы мы могли запустить его, не вводя полный node_modules путь:

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

После того, как мы закончим с этим, давайте создадим новый тестовый файл, в котором мы собираемся собрать необходимую информацию:

Прежде всего, мы хотим посетить страницу, с которой мы хотим собрать данные.

Я создал массив results, который будет содержать каждую строку объекта с необходимой нам информацией. Затем мы перебираем каждую строку таблицы. Мы хотим пропустить самую первую строку, поскольку она содержит только th элементов, поэтому нам нужен оператор if в самом начале. После этого я создал две переменные, поскольку мы собираемся обращаться к элементу несколько раз:

  • $tr - это обернутый объект JQuery, поэтому мы хотим получить базовые атрибуты DOM с помощью get(0).
  • rowElement.cells - это HTMLCollection данные для каждого столбца.

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

Сохранение в JSON

Мы можем легко сохранить эти данные для дальнейшего использования, изменив console.log в предложении then на следующую строку:

Это создаст файл в корневом каталоге проекта рядом с cypress.json. Теперь, когда у нас есть все необходимое, мы можем перейти к расчету наших шансов и раскрытию секретов, чтобы сформулировать идеальный набор выигрышных чисел.

Расчет шансов

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

Для этого я открыл сгенерированный файл JSON в Chrome и использую консоль для получения результатов:

Я использую расширение Chrome JSON Viewer, поэтому у меня есть доступ к объекту JSON через window.json.

Сначала мы просматриваем результаты и создаем новый массив для каждого набора выигрышных номеров. Затем мы можем создать функцию для подсчета вхождений:

Для каждого набора пиков мы проверяем, существует ли он уже в объекте counts. Если это так, мы увеличиваем его значение на единицу, в противном случае добавляем его к объекту. Запустив это в консоли, мы получим следующий список чисел и количество раз, когда они были нарисованы.

Как видите, нет ни одного набора выигрышных номеров, которые выпадали бы более одного раза за 63 года. Итак, какие числа выбираются чаще всего?

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

Мы можем следовать той же схеме, что и раньше, только на этот раз мы можем использовать оператор распространения, чтобы разрушить массив чисел до отдельных значений. Затем, используя ту же функцию подсчета в сочетании с простым алгоритмом sort, мы можем сделать вывод, что наиболее часто выбираемые числа: 3, 1, 29, 75 и 15.

Но если мы прокрутим вниз до наименее выбранного числа, то есть 88, даже оно было выбрано 145 раз.

Так каковы шансы даже выиграть в лотерею? Мы знаем, что можем выбирать между 90 различными числами и делать это 5 раз. Это дает нам следующую формулу:

Где n - это количество альтернатив, которые мы можем выбрать, а k - это количество вариантов, которые у нас есть. Это оставляет нам:

После создания факториальной функции в консоли мы можем подсчитать, что у нас есть примерно 1 из 43 949 268 шансов выиграть в лотерею этого типа с нашим выбором чисел, который, вероятно, так же случайен, как и наши шансы на выигрыш.

Заключение

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

Как мы могли видеть, Cypress упрощает взаимодействие и сбор информации с веб-страниц. Каковы еще варианты использования веб-скрапинга?

Например, вы можете:

  • Собирайте информацию о продуктах для сравнения
  • Сбор обучающих данных для машинного обучения
  • Получение данных из социальных сетей и форумов для анализа настроений

Список можно продолжить, нет предела.

У вас есть опыт работы с веб-парсингом? У вас есть ценные советы и рекомендации по сбору данных без API? Дайте нам знать об этом в комментариях. Спасибо за уделенное время и хорошего дня.