Лайфхаки

Маленькие, полезные хитрости

Как парсить в 2022 году без блокировок. Может ли воркер работать с DOM?

09.03.2022 в 14:24

Как парсить в 2022 году без блокировок. Может ли воркер работать с DOM?


В глобальной области видимости воркера () не определены переменныеwindowиwindow.document.Это значит, что из воркера нельзя напрямую обратиться к реальной DOM.В результате для организации работы с DOM из воркера у нас есть 2 варианта.Первый — это воссоздание всего DOM API внутри воркера. Полагаю, что это — плохая идея. Воркеры не без причины отделены от DOM, с DOM связано огромное количество постоянно меняющейся логики. Операции по взаимодействию с DOM становятся асинхронными, и если вы последовательно выполняете множество таких операций, это приведёт к тому, что воркер будет отправлять множество сообщений создавшему его потоку, используя методpostMessage(). Единственное преимущество такого подхода заключается в том, что код приложений можно писать так же, как его писали раньше, а это — спорное преимущество. Позже я расскажу о более приемлемом варианте решения этой задачи.На самом деле, существует проект,, в рамках которого реализована именно такая схема работы.Второй вариант организации работы с DOM из воркера выглядит более разумным. Заключается он в том, чтобы придерживаться концепции, в соответствии с которой воркер ничего не должен знать о реальной DOM.Это делает совершенно обязательным использование виртуальной DOM.Мне встречались статьи, где часто проскакивает мысль о том, что виртуальная DOM — это плохо.Но это попросту неправда. Ответ на вопрос о том, «хорошо» это или «плохо», сильно зависит от реализации виртуальной DOM.Главными камнями преткновения в Angular и React являются шаблоны, основанные на XML или JSX. Их надо транспилировать, превращая в нечто такое, с чем мы можем работать.А JavaScript — это язык, который не создавался ни в расчёте на то, что он будет очень быстрым, ни в расчёте на то, что он будет использоваться для парсинга строк.Парсинг шаблонов — это настолько вычислительно сложная операция, что в наши дни снова стал популярным серверный рендеринг (server side rendering, SSR). Я занимался веб-разработкой 20 лет назад, создавая CMS, основанные на PHP, которые генерировали HTML-файлы на сервере.Вы можете на это возразить, сказав, что сейчас в нашем распоряжении имеются облачные службы, способные обрабатывать больше соединений с клиентами, чем раньше, но концепциявсё ещё совершенно актуальна.

Cloudflare парсинг. cloudflare-scrape

A simple Python module to bypass Cloudflare's anti-bot page (also known as "I'm Under Attack Mode", or IUAM), implemented with Requests . Python versions 2.6 - 3.7 are supported. Cloudflare changes their techniques periodically, so I will update this repo frequently.

This can be useful if you wish to scrape or crawl a website protected with Cloudflare. Cloudflare's anti-bot page currently just checks if the client supports JavaScript, though they may add additional techniques in the future.

Due to Cloudflare continually changing and hardening their protection page, cloudflare-scrape requires Node.js to solve JavaScript challenges. This allows the script to easily impersonate a regular web browser without explicitly deobfuscating and parsing Cloudflare's JavaScript.

Note: This only works when regular Cloudflare anti-bots is enabled (the "Checking your browser before accessing…" loading page). If there is a reCAPTCHA challenge, you're out of luck. Thankfully, the JavaScript check page is much more common.

For reference, this is the default message Cloudflare uses for these sorts of pages:

Checking your browser before accessing website.com. This process is automatic. Your browser will redirect to your requested content shortly. Please allow up to 5 seconds…

Any script using cloudflare-scrape will sleep for 5 seconds for the first visit to any site with Cloudflare anti-bots enabled, though no delay will occur after the first request.

Парсинг кода. Превращение кода в AST


Создание парсера это сложная задача. По сути, он должен брать кусок кода и превращать его в AST (абстрактное синтаксическое дерево). AST — структурированное представление программы в памяти, абстрактное — потому, что оно не содержит полной информации о коде, только семантику.находится в отдельной части.

Например, у нас есть следующий код:

sum = lambda(a, b) { a + b; }; print(sum(1, 2));

Наш парсер будет генерировать дерево, как JavaScript объект:

{ type: "prog", prog: , body: { // тело должно было быть "prog", но потому, что // оно содержит только одно выражение, парсер // превратил его в само выражение. type: "binary", operator: "+", left: { type: "var", value: "a" }, right: { type: "var", value: "b" } } } }, // вторая строка: { type: "call", func: { type: "var", value: "print" }, args: }> } > }

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

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

Что можно парсить. Что такое парсинг

Парсинг — это процесс автоматического сбора данных и их структурирования.

Специальные программы или сервисы-парсеры «обходят» сайт и собирают данные, которые соответствуют заданному условию.

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

Плюсы парсинга очевидны — если сравнивать его с ручным сбором и сортировкой данных:

  • вы получаете данные очень быстро;
  • можно задавать десятки параметров для составления выборки;
  • в отчете не будет ошибок;
  • парсинг можно настроить с определенной периодичностью — например, собирать данные каждый понедельник;
  • многие парсеры не только собирают данные, но и советуют, как исправить ошибки на сайте.

    Парсинг сайтов. Зачем нужны парсеры


    Парсер — это программа, сервис или скрипт, который собирает данные с указанных веб-ресурсов, анализирует их и выдает в нужном формате.

    С помощью парсеров можно делать много полезных задач:

    • Цены . Актуальная задача для интернет-магазинов. Например, с помощью парсинга вы можете регулярно отслеживать цены конкурентов по тем товарам, которые продаются у вас. Или актуализировать цены на своем сайте в соответствии с ценами поставщика (если у него есть свой сайт).
    • Товарные позиции : названия, артикулы, описания, характеристики и фото. Например, если у вашего поставщика есть сайт с каталогом, но нет выгрузки для вашего магазина, вы можете спарсить все нужные позиции, а не добавлять их вручную. Это экономит время.
    • Метаданные : SEO-специалисты могут парсить содержимое тегов title, description и другие метаданные.
    • Анализ сайта . Так можно быстро находить страницы с ошибкой 404, редиректы, неработающие ссылки и т. д.

    Для справки . Есть еще серый парсинг. Сюда относится скачивание контента конкурентов или сайтов целиком. Или сбор контактных данных с агрегаторов и сервисов по типу Яндекс.Карт или 2Гис (для спам-рассылок и звонков). Но мы будем говорить только о белом парсинге, из-за которого у вас не будет проблем.

    Где взять парсер под свои задачи

    Есть несколько вариантов:

    1. Оптимальный — если в штате есть программист (а еще лучше — несколько программистов). Поставьте задачу, опишите требования и получите готовый инструмент, заточенный конкретно под ваши задачи. Инструмент можно будет донастраивать и улучшать при необходимости.
    2. Воспользоваться готовыми облачными парсерами (есть как бесплатные, так и платные сервисы).
    3. Десктопные парсеры — как правило, программы с мощным функционалом и возможностью гибкой настройки. Но почти все — платные.
    4. Заказать разработку парсера «под себя» у компаний, специализирующихся на разработке (этот вариант явно не для желающих сэкономить).

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

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

    Законно ли парсить данные?

    В законодательстве РФ нет запрета на сбор открытой информации в интернете. Право свободно искать и распространять информацию любым законным способом закреплено в четвертом пункте 29 статьи Конституции.

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

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