Рубрики
Без рубрики

Python, Javascript и веб-автоматизация

Сравнение Python и Javascript в контексте веб-автоматизации.

Автор оригинала: Satwik Kansal.

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

В любом случае, основное внимание в этом посте уделяется Python, Javascript и их использованию в веб-автоматизации. Честно говоря, оба языка имеют разную историю и развивались очень по-разному, но веб-автоматизация-это одна из областей, в которой, по моему мнению, оба языка могут что-то предложить. Я попытаюсь сравнить Python и Javascript в контексте различных моделей использования и способов выполнения веб-автоматизации.

Что такое веб-автоматизация?

Я видел, как многие новички (в том числе ранние) неправильно понимали сферу веб-автоматизации. Мне нужно кое-что сказать. Во-первых,

Веб-очистка-это один из видов веб-автоматизации, но веб – автоматизация более универсальна.

Во-вторых,

Если вы автоматизируете любую ручную задачу в Интернете, процесс ее выполнения можно назвать веб-автоматизацией.

Некоторые задачи веб-автоматизации

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

Заполнение формы

Заполнение форм, как следует из названия, означает автоматизацию ручного взаимодействия с формами в Интернете. Это взаимодействие может заключаться в вводе текста, выборе переключателей, установке флажков и т. Д. Зачем вам их автоматизировать? Что ж, причин может быть много. Например, однажды я автоматизировал процесс входа на библиотечный портал моего университета, чтобы создать утилиту CLI, которая выполняла бы такие вещи, как продление подписки, проверка штрафов и т. Д. для ленивых вундеркиндов ( исходный код , не судите меня за код, это было много лет назад). Другая причина может заключаться в том, что большая часть времени в вашей работе тратится на заполнение избыточных сведений в этих избыточных формах, поэтому вам может потребоваться автоматизировать эти рабочие процессы. Кстати о рабочих процессах,

Создание рабочих процессов

Это мой любимый вариант использования для веб-автоматизации. Вы можете объединить кучу частей автоматизации вместе, чтобы делать такие вещи, как,

  • Периодически посещайте свой любимый сайт обоев, смотрите, есть ли новые обои, если да, то загрузите их и добавьте в свою активную коллекцию обоев. У меня есть аналогичный скрипт для Quotefancy ( исходный код ).
  • Часто отслеживайте определенные новые темы в Интернете и запускайте некоторые действия, основанные на настроении новостей. Такая настройка может быть полезна в таких системах, как высокочастотная торговля акциями, криптовалютами и т. Д.
  • Найдите все изображения (в разных источниках изображений), твиты, тенденции, связанные с ключевым словом, и представьте их в удобном для пользователя виде. На самом деле это был один из моих проектов стажировки, где я создал панель мониторинга, чтобы иметь возможность ускорить процесс создания новостного видео для актуальных тем.
  • Таких случаев использования может быть больше, я надеюсь, вы поймете суть.

Автоматизация тестирования

Тестирование-очень популярный вариант использования веб-автоматизации. Это почти необходимость, когда у вас есть большое веб-приложение. Как разработчик, вы хотели бы написать тестовые примеры для функционального поведения веб-функции, которую вы разрабатываете, чтобы вы могли быть уверены, что она работает в соответствии со спецификациями. Это также называется “Гарантией качества” или (QA) в формальном мире. И еще одна вещь, которую вы хотели бы иметь, – это накапливать подобные тесты с течением времени в наборе тестов, чтобы каждый раз, когда вы добавляете новую функцию, вы были уверены, что ее добавление не изменяет никакого существующего “ожидаемого” поведения в более широкой схеме вещей. Грубо говоря, этот процесс известен как регрессионное тестирование, и если вы моделируете его для всего пути пользователя, вы можете назвать его сквозным тестированием. Автоматизация тестирования веб-сайта пытается предотвратить множество неприятных ошибок, таких как “кнопка не нажимается”, “сломанные URL-адреса” (если вы не хотите показать свои творческие 404 страницы ) и т. Д., Пытаясь имитировать и

Соскабливание паутины

Веб-скребок, проще говоря, – это процесс извлечения данных с веб-сайтов. Эти данные могут быть использованы для нескольких целей. Это часто игра в кошки-мышки между владельцем веб-сайта и разработчиком, работающим в правовой серой зоне . С одной стороны, есть владельцы веб-сайтов, которые ставят ограждения вокруг своего контента в виде капчи, механизмов авторизации и т. Д., А с другой стороны, разработчики, которые придумывают способы обойти эти ограждения и извлечь необходимые им данные с веб-сайта. Существуют различные причины, по которым вам может потребоваться извлечь и упорядочить данные с других веб-сайтов, например, провести некоторый анализ или использовать их в качестве входных данных для некоторой бизнес-логики (например, продемонстрировать цену Amazon на какой-либо продукт на вашем сайте).

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

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

Прошлое и настоящее; Ландшафт веб-автоматизации

Поэтому вы можете спросить, какие инструменты люди используют (или использовали) для веб-автоматизации?

Что ж, программисты полагались на имитацию Интернета в своих программах, чтобы достичь того, чего они хотят. Типичная серия шагов-это выполнение запросов к серверу, анализ ответа, проверка того, соответствует ли ответ ожиданиям (если целью является тестирование), в противном случае выполнение действий на основе ответа, все через программу. В настоящее время существуют высокоуровневые библиотеки и фреймворки, доступные для облегчения жизни программиста при написании этих сценариев автоматизации. Например, Selenium – довольно популярная библиотека для автоматизации браузера, поддерживающая API для большинства популярных языков.

Для предприятий, не ориентированных на технологии, существуют такие компании, как import.io , scrapinghub и т.д. , Которые предоставляют решения для управления всем конвейером извлечения данных из Интернета. Некоторые компании также хотят понять потребительские настроения в социальных сетях или понять потребительские настроения конкурентов, и есть сервисы, которые позволяют установить такую систему мониторинга в несколько кликов.

А для людей, которые не очень хорошо разбираются в коде (и, вероятно, хотят заниматься автоматизацией по разным причинам), существуют решения SaaS, которые позволяют создавать рабочие процессы. Например, проверьте Zapier , Huginn и IFTTT (Если это, то это). Некоторые рабочие процессы не взаимодействуют непосредственно с web как таковыми, скорее они зависят от API REST, но конечная цель все та же-автоматизация! И не говоря уже о том, что существует МНОЖЕСТВО компаний, чей жизненный путь-это просто веб-автоматизация (например, услуги по сравнению продуктов и цен или решения для кросс-браузерного тестирования).

Выполнение веб-автоматизации с помощью Python и Javascript

Итак, теперь важный вопрос: “Учитывая, что я знаю либо Python, либо Javascript, как мне сделать с ними веб-автоматизацию?”.

Общие шаблоны использования

Использование библиотек и фреймворков

Мотивация создания и использования библиотек заключается в том, чтобы свести к минимуму шаблонность и не изобретать велосипед. Обычно библиотеки, которые вы будете использовать, предоставляют одну или несколько из этих функций,

  • Функциональность для выполнения сетевых запросов для общих протоколов.
  • Общие приемы для сетевых запросов, таких как повторные попытки, использование прокси-серверов, обработка перенаправлений и т. Д.
  • Функциональность для анализа распространенных форматов ответов, включая HTML, JSON, XML и т.д.
  • Возможность эффективного поиска нужной информации в анализируемом ответе и извлечения ее из контейнеров данных на родном языке.

Например, requests широко используется для обработки HTTP-запросов в Python, а аналогичной библиотекой в Javascript является axios . В Python есть beautifulsoup для анализа и извлечения данных из HTML-и XML-файлов, в Javascript есть cheerio . Фреймворки, такие как scrapy , выводят скребок на другой уровень ( разница между библиотекой и фреймворком ). Наиболее близкие альтернативы, о которых я знаю для Javascript, – это node-crawler .

Использование пакета автоматизации веб – браузера, такого как Selenium

Selenium Web Driver – это платформа веб-автоматизации. Он может управлять браузером и, таким образом, может позволить вам программно имитировать действия пользователя. Selenium весьма полезен в сценариях , когда контент, с которым нужно работать, либо визуализируется на стороне браузера библиотеками, такими как Handlebars или React , либо извлекается путем будущих вызовов AJAX на сервер, а затем визуализируется браузером. Несколько примеров этого включают в себя:

  • Веб-страницы с бесконечной прокруткой (Twitter, Facebook и т. Д.)
  • Веб-страницы с загрузчиками, такими как процентные бары или загрузочные блесны

Эти сценарии могут быть обработаны только в том случае, если мы сможем имитировать поведение браузера (следовательно, Selenium на помощь). Selenium имеет клиентские интерфейсы для большинства популярных языков (включая Python и Javascript, конечно).

Как работает селен?

  1. Мы используем API клиентской библиотеки для написания инструкций.
  2. Мы указываем веб-драйвер, который мы хотим использовать. Все популярные браузеры (Firefox, Chrome, IE, Safari) имеют веб-драйверы, которые обеспечивают интерфейс для управления фактическими браузерами.
  3. Затем клиентский код преобразуется в соответствии с протоколом, понятным этим веб-драйвером (см. this ), что приводит к желаемому действию на конце браузера.
  4. Если какая-либо информация запрашивается для захвата, она отправляется обратно клиенту в аналогичной, но обратной последовательности.

Обычно запуск клиентской программы запускает экземпляр браузера, и мы можем видеть такие вещи, как нажатие и ввод данных на экране, что полезно при тестировании. Но если мы заботимся только о чистке, мы можем использовать “безголовые браузеры”, которые не имеют пользовательского интерфейса и быстрее с точки зрения производительности. Chrome Headless является популярным выбором для веб-драйвера без головы, а другие варианты включают безголовый Firefox, и PhantomJS. Вы можете скачать последние версии всех компонентов Selenium из здесь .

Рамки тестирования

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

Дополнительные инструменты

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

  • Инструменты разработчика браузера; Это инструменты для визуального осмотра DOM, поиска элементов и получения их селекторов, проверки AJAX и других HTTP-запросов и т. Д. Все они доступны в инструментарии разработчика большинства популярных браузеров.
  • Crontab; Вы часто можете захотеть, чтобы некоторые задачи выполнялись периодически в соответствии с временным шаблоном; для этого вы можете использовать crontab.
  • tcpdump : Вы можете использовать tcpdump для сравнения заголовков двух запросов (тот, который отправляет ваш скрипт автоматизации, и другой, который отправляет фактический браузер).
  • cloudflare-scrape : Если вы выполняете очистку, вы можете использовать такой инструмент, как этот, чтобы обойти проверки Cloudflare против ботов.
  • 2captcha : Опять же, если вы делаете очистку и боретесь с капчами, вы можете использовать 2captcha. По своему опыту я обнаружил, что веб-сайты требуют капчи только время от времени, поэтому стоимость не так уж велика.

Python против Язык JavaScript

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

Фрагмент кода Python

import requests
from time import sleep

API_KEY = ''
site_key = 'some_site_key'
url = 'http://example.com'

SESSION = requests.Session()


def solve_captcha(api_key, site_key, url):
    """
    Returns the solved captcha answer that you can use in your automation requests.
    """
    response = SESSION.post(f'http://2captcha.com/in.php?key={api_key}&method=userrecaptcha&googlekey={site_key}&pageurl={url}')
    if response.status_code is 200:
        captcha_id = response.text.split('|')[1]
        gresponse = get_answer_from_captcha_id(api_key, captcha_id)
        return gresponse

def get_answer_from_captcha_id(api_key, captcha_id, sleep_delay=5, max_attempts=25):
    for _ in range(max_attempts):
        response = SESSION.get(f'http://2captcha.com/res.php?key={api_key}&action=get&id={captcha_id}')
        if 'CAPCHA_NOT_READY' in response.text:
            time.sleep(sleep_delay)
            continue
        else:
            return response.text.split('|')[1]

Фрагмент JavaScript

const axios = require('axios');

const API_KEY = '';
const siteKey = 'some_site_key';
const url = 'http://example.com';

function solveCaptcha(apiKey, siteKey, url) {
  const requestUrl = `http://2captcha.com/in.php?key=${apiKey}&method=userrecaptcha&googlekey=${siteKey}&pageurl=${url}`;
  axios({ url: requestUrl })
    .then(async (response) => {
      if (response.substring(0, 3) == 'OK|') {
        const captchaID = response.substring(3);
        const gresponse = await getAnswerFromCaptchaID();
        resolve(gresponse);
      }
    })
    .catch((error) => {
      console.log(error);
    });
}

async function getAnswerFromCaptchaID(apiKey, captchaID, sleepDelay = 5000, maxAttempts = 25) {
  const requestUrl = `http://2captcha.com/res.php?key=${apiKey}&action=get&id=${captchaID}`;
  for (let currentAttempt = 0; currentAttempt < maxAttempts; currentAttempt++) {
    await axios({ url: requestUrl })
      .then(async (response) => {
        if (response != 'CAPCHA_NOT_READY') {
          if (response.substring(0, 3) == 'OK|') {
            const gresponse = response.substring(3);
            return gresponse;
          }
        } else {
          await sleep(sleepDelay);
        }
      })
      .catch((error) => {
        console.log(error);
      });
  }
}

Я использовал соответствующие популярные библиотеки (requests и axios) на обоих языках, упомянутых ранее, для обработки HTTP-запросов. Реализации не эквивалентны построчно, но суть одна и та же. Вот несколько вещей, которые я должен сказать об обоих этих языках,

Синхронный против Асинхронный

Это различие в предпочтительной парадигме, которое вы увидите в библиотеках Python и Javascript. Библиотеки Javascript склоняются к обещанию и программированию в стиле обратного вызова, что означает, что код, скорее всего, будет сложным (проверьте callback hell ), в то время как библиотеки Python являются синхронными. Конечно, можно следовать обеим парадигмам в обоих языках. Но вы уже можете видеть в фрагментах, что легче следовать вместе с кодом Python, чем с кодом JavaScript (вы можете утверждать, что JavaScript не очень хорошо написан выше, и это то, на чем я хочу подчеркнуть далее. Мне немного сложнее понять и реализовать конструкции Javascript).

Ремонтопригодность

Я чувствую, что снисходительность в JavaScript требует большой ответственности как разработчика, чтобы сделать все правильно”.” Бывают случаи, когда Python делает более веские аргументы в пользу веб-автоматизации просто из-за простоты решения (может сэкономить время разработки). Такие вещи, как неизменяемые типы объектов, строгое соответствие аргументов для функций, строгая типизация, могут предотвратить появление ошибок (по таким причинам, как неправильный ввод) в конвейере автоматизации. Если вы работали с Javascript, вы можете быть знакомы с этими раздражающими ошибками из-за таких вещей, как “неопределенные” значения, неявная типизация, проблемы, связанные с асинхронностью, и т. Д. (проверьте wtfjs ).

Представление

node.js превосходит CPython с точки зрения скорости выполнения, и это действительно было главным плюсом использования node.js для веб-приложений. Разница в производительности в конечном счете сводится к дизайну или базовой среде выполнения и библиотекам. Движок V8 является компилятором точно в срок и изначально не блокируется. Популярные библиотеки в экосистеме Javascript изо всех сил старались воспользоваться преимуществами этого дизайна. Не говоря уже о том, что V8 поддерживается Google (следовательно, на его оптимизацию тратится много ресурсов).

Контрольные показатели могут быть тонкими, поэтому не включайте их в сообщение. Но если вас интересуют бенчмарки, ознакомьтесь с сравнением Benchmark Game с node и Python .

Экосистема

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

  • Javascript гораздо ближе к Интернету; почти каждый разработчик, работающий в Интернете, в какой-то степени знает JavaScript.
  • Стандартная библиотека Python более универсальна и дает вам множество хорошо поддерживаемых возможностей из коробки.
  • Когда дело доходит до предотвращения изобретения колеса путем повторного использования кода через библиотеки, Python охватывает более широкие доменные приложения, помимо Интернета (анализ данных, научные вычисления, машинное обучение).
  • Python обычно имеет широко распространенный набор инструментов для выполнения задач (например, beautifulsoup для разбора и извлечения, запросы для обработки HTTP-запросов и scrapy для написания искателей), в то время как лично я нахожу такие опции в Javascript запутанными (существует несколько библиотек для выполнения одной и той же задачи, и очень трудно выбрать одну, и часто я нахожу качество неоптимальным).
  • На момент написания этого поста pypi (индекс пакетов Python) содержит 195 000 пакетов, в то время как npm registry содержит более миллиона пакетов.
  • Оба языка имеют приличные возможности для тестирования, Python имеет встроенный модуль unittest (что довольно хорошо), а JavaScript имеет множество зрелых фреймворков тестирования (что делает его более предпочтительным, если вы занимаетесь автоматизированным тестированием).
  • Что касается популярности, то , согласно опросу разработчиков Stackoverflow 2019 , JavaScript является самым популярным языком, но Python догоняет его (как самый быстрорастущий язык программирования).

Вывод

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