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

Блокировка ресурсов с драматургом

Знаете ли вы, что Playwright позволяет вам блокировать запросы и, таким образом, ускорить соскабливание или тестирование? … Tagged с помощью Python, программирования, новичков, учебного пособия.

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

Предварительные условия

Чтобы код работал, вам понадобится Python3 установлен Анкет В некоторых системах это предварительно установлен. После этого установите драматургии и двоичные файлы браузера для Chromium, Firefox и Webkit.

pip install playwright
playwright install

Вступление в драматург

Драматург «Это библиотека Python для автоматизации браузеров Chromium, Firefox и Webkit с одним API. ” Это позволяет нам просмотреть Интернет с помощью безголового браузера программно.

Playwright также доступен для node.js, и все, что показано ниже, может быть сделано с помощью аналогичного синтаксиса. Проверить док Больше подробностей.

Вот как начать браузер (то есть хром) в нескольких строках, перейти на страницу и получить его название.

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.goto("https://www.zenrows.com/")
    print(page.title())
    # Web Scraping API & Data Extraction - ZenRows
    page.context.close()
    browser.close()

Сетевые события логина

Подпишитесь на такие события, как Запрос или Ответ и зарегистрируйте их контент, чтобы увидеть, что происходит. Поскольку мы не говорили Playwright иначе, он загрузит всю страницу: HTML, CSS, выполнить JavaScript, получить изображения и так далее. Добавьте эти две строки, прежде чем запрашивать страницу, чтобы увидеть, что происходит.

page.on("request", lambda request: print(
    ">>", request.method, request.url,
    request.resource_type))
page.on("response", lambda response: print(
    "<<", response.status, response.url))

page.goto("https://www.zenrows.com/")

# >> GET https://www.zenrows.com/ document
# << 200 https://www.zenrows.com/
# >> GET https://cdn.zenrows.com/images_dash/logo-instagram.svg image
# << 200 https://cdn.zenrows.com/images_dash/logo-instagram.svg

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

Блокировка ресурсов

Зачем загружать ресурсы и контент, которые мы не будем использовать? Узнайте, как избежать ненужных данных и сетевых запросов с этими методами.

Блок по шаблону глобуса

Страница Также разоблачает метод маршрут Это выполнит обработчик для каждого соответствующего маршрута или шаблона. Допустим, мы не хотим, чтобы SVG были загружены. Используя рисунок, такой как "**/*. SVG" соответствует запросам, заканчивающимся этим расширением. Что касается обработчика, нам на данный момент не нужна логика, только чтобы прервать запрос. Для этого мы будем использовать лямбду и маршрут Метод аборта Парама.

page.route("**/*.jpg", lambda route: route.abort())
page.goto("https://www.zenrows.com/")

Примечание. Согласно официальной документации, такие шаблоны, как “**/*. {png, jpg, jpeg}” должен работать, но мы нашли иначе. Во всяком случае, это выполнимо со следующей стратегией блокировки.

Блок от Regex

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

import re
# ...
    page.route(re.compile(r"\.(jpg|png|svg)$"),
        lambda route: route.abort())
    page.goto("https://www.zenrows.com/")

Теперь есть 23 запроса и только 15 ответов. Мы сохранили 8 изображений от загрузки!

Блок по типу ресурса

Но что произойдет, если они используют расширение «JPEG» вместо «JPG»? Или Avif, Gif, Webp? Должны ли мы поддерживать обновленный список?

К счастью для нас, маршрут PARAM, обнаруженный в функции Lambda выше, включает в себя исходный запрос и тип ресурса. И один из этих типов Изображение , идеально! Вы можете получить доступ к Весь список типов ресурсов Анкет

Теперь мы сопоставляем каждый запрос ( "**/*" ) и добавим условную логику в функцию Lambda. В случае, если это изображение, прервать запрос, как и раньше. Иначе, продолжайте с этим как обычно.

page.route("**/*", lambda route: route.abort()
    if route.request.resource_type == "image"
    else route.continue_()
)
page.goto("https://www.zenrows.com/")

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

Обработчик функций

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

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

excluded_resource_types = ["stylesheet", "script", "image", "font"]
def block_aggressively(route):
    if (route.request.resource_type in excluded_resource_types):
        route.abort()
    else:
        route.continue_()
# ...
    page.route("**/*", block_aggressively)
    page.goto("https://www.zenrows.com/")

Сейчас мы полностью контролируемся, и универсальность абсолютная. От Routes.Request Оригинальный URL, заголовки и несколько других информации доступны.

Быть еще более строгим: заблокировать все, что не Документ тип. Это эффективно предотвратит загрузку что -либо, кроме первоначального HTML.

def block_aggressively(route):
    if (route.request.resource_type != "document"):
        route.abort()
    else:
        route.continue_()

Сейчас есть один ответ! Мы получили HTML без загрузки другого ресурса. Мы уверены, что сэкономили много времени и пропускной способности, верно? Но … сколько именно?

Измерение повышения производительности

Мы можем только сказать, что стало лучше, если бы мы могли измерить различия. Мы посмотрим на три подхода. Но просто запустит сценарий с несколькими URL -адресами. СПОЙЛЕР: Мы сделали это для 10 URL, 1,3 секунды против 8.4.

HAR файлы

Для тех из вас, кто использовал, чтобы проверить вкладку Devtools Network, у нас есть хорошие новости! Playwright позволяет записывать HAR, предоставив дополнительный параметр в new_page метод Так же просто.

page = browser.new_page(record_har_path="playwright_test.har")
page.goto("https://www.zenrows.com/")

Есть несколько Хар Визуализаторы Там, но самый простой способ – использовать Chrome Devtools. Откройте вкладку «Сеть» и нажмите кнопку «Импорт» или перетащите файл HAR.

Проверьте время! Ниже приведено сравнение между двумя разными файлами HAR. Первый – без блокировки (обычная навигация). Второй блокирует все, кроме первоначального документа.

Почти каждый ресурс имеет статус «-1» и «ожидающее» время на стороне блокировки. Это способ Devtools сказать нам, что они были заблокированы и не загружены. Мы можем ясно видеть внизу слева, что мы выполнили меньше запросов, а передача данных – часть оригинала! С 524 КБ до 17,4 КБ, снижение на 96%.

Производительность браузера API

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

Вывод будет объект JSON с множеством временных метров. Самая простая проверка – получить разницу между NavigationStart и LoadeVentend Анкет При блокировании это должно быть менее чем на полсекунды (то есть 346 мс); Для регулярной навигации, выше секунды или даже двух (то есть 1363 мс).

page.goto("https://www.zenrows.com/")
print(page.evaluate("JSON.stringify(window.performance)"))
# {"timing":{"connectStart":1632902378272,"navigationStart":1632902378244, ...

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

Сессия CDP

Идя на шаг дальше, мы подключаемся напрямую с Chrome Devtools Protocol Анкет Драматург создает CDP Session Например, чтобы извлечь метрики производительности.

Мы должны создать клиента из контекста страницы и начать общение с CDP. В нашем случае мы включим «производительность» перед посещением страницы и получением метрик после нее.

Вывод будет представлена json-подобная строка с интересными значениями, такими как узлы, время процесса, используемая js-куча и многое другое.

client = page.context.new_cdp_session(page)
client.send("Performance.enable")
page.goto("https://www.zenrows.com/")
print(client.send("Performance.getMetrics"))

Вывод

Мы хотели бы, чтобы вы расстались с тремя основными моментами:

  1. Нагрузка только необходимы ресурсы.
  2. Сэкономьте время и пропускную способность, когда это возможно.
  3. Измерьте свои усилия и производительность, прежде чем масштабироваться.

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

Вы можете достичь точно такого же результата при экономии времени/полосы пропускания/денег. Много раз изображения или CSS – это только накладные расходы. Некоторые другие, нет необходимости в JS, если вы хотите только начальный статический контент.

Спасибо за чтение! Вы нашли контент полезным? Пожалуйста, распространите информацию и поделитесь им. 👈

Первоначально опубликовано в https://www.zenrows.com

Оригинал: “https://dev.to/anderrv/blocking-resources-with-playwright-3053”